




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、.URL類是包中的一個重要的類,URL的實例封裝著一個統(tǒng)一資源定位符(Uniform Resource Locator),使用URL創(chuàng)建對象的應用程序稱作客戶端程序。一個URL對象封裝著著一個具體的資源的引用,表明客戶要訪問這個URL中的資源,客戶利用URL對象可以獲取URL中的資源。一個URL對象通常包含最基本的三部分信息:協(xié)議、地址、資源。協(xié)議必須是URL對象所在的Java虛擬機支持的協(xié)議,許多協(xié)議并不為我們所常用,而常用的Http、Ftp、File協(xié)議都是虛擬機支持的協(xié)議;地址必須是能連接的有效IP地址或域名;資源可以是主機上的任何一個文件 .URL類通常使用如下的構造方法創(chuàng)建一個URL
2、對象:public URL(String spec) throws MalformedURLException該構造方法使用字符串初始化一個URL對象 .另一個常用的構造方法是:public URL(String protocol, String host,String file) throws MalformedURLException該構造方法構造使用的協(xié)議、地址和資源分別由參數(shù)protocol、host和file指定 .URL對象調用InputStream openStream() 方法可以返回一個輸入流,該輸入流指向URL對象所包含的資源。通過該輸入流可以將服務器上的資源信息讀入到客戶
3、端。URL對象調用InputStream openStream() 方法可以返回一個輸入流,該輸入流指向URL對象所包含的資源。通過該輸入流可以將服務器上的資源讀入到客戶端 .14.2.1 地址的表示 Internet上的主機有兩種方式表示地址:1域名例如,2IP 地址例如,包中的InetAddress類對象含有一個Internet主機地址的域名和IP地址: .1獲取Internet上主機的地址可以使用InetAddress類的靜態(tài)方法:getByName(String s);將一個域名或IP地址傳遞給該方法的參數(shù)s,獲得一個InetAddress對象,該對象含有主機地址的域名和IP地址,該對
4、象用如下格式表示它包含的信息: .另外,InetAddress類中還有兩個實例方法:public String getHostName() 獲取InetAddress對象所含的域名。public String getHostAddress() 獲取InetAddress對象所含的IP地址。.2獲取本地機的地址我們可以使用InetAddress類的靜態(tài)方法:getLocalHost()獲得一個InetAddress對象,該對象含有本地機的域名和IP地址。 .14.3.1 套接字 網(wǎng)絡通信使用IP地址標識Internet上的計算機,使用端口號標識服務器上的進程(程序)。也就是說,如果服務器上的一個
5、程序不占用一個端口號,用戶程序就無法找到它,就無法和該程序交互信息。端口號被規(guī)定為一個16位的065535之間的整數(shù),其中,01023被預先定義的服務通信占用(如telnet占用端口23,http占用端口80等),除非我們需要訪問這些特定服務,否則,就應該使用102465535這些端口中的某一個進行通信,以免發(fā)生端口沖突 當兩個程序需要通信時,它們可以通過使用Socket類建立套接字對象并連接在一起 .客戶端的程序使用Socket類建立負責連接到服務器的套接字對象。Socket的構造方法是:Socket(String host,int port),參數(shù)host是服務器的IP地址,port是一個
6、端口號。建立套接字對象可能發(fā)生IOException異常,因此應象下面那樣建立連接到服務器的套接字對象:try Socket mysocket=new Socket(,2010);catch(IOException e).為了能使客戶成功地連接到服務器,服務器必須建立一個ServerSocket對象,該對象通過將客戶端的套接字對象和服務器端的一個套接字對象連接起來,從而達到連接的目的。ServerSocket的構造方法是:ServerSocket(int port),port是一個端口號。port必須和客戶呼叫的端口號相同。當建立ServerSocket對象時可能發(fā)生IOException異常
7、,因此應象下面那樣建立ServerSocket對象:try ServerSocket serverForClient = new ServerSocket(2010);catch(IOException e).當服務器的ServerSocket對象serverForClient建立后,就可以使用方法accept()將客戶的套接字和服務器端的套接字連接起來,代碼如下所示:try Socket sc = serverForClient.accept();catch(IOException e).客戶端的Socket輸入流輸出流服務器端Socket輸出流輸入流圖14.2 套接字連接示意圖互相連接互相
8、連接.連接建立后,服務器端的套接字對象調用getInetAddress()方法可以獲取一個InetAddess對象,該對象含有客戶端的IP地址和域名,同樣,客戶端的套接字對象調用getInetAddress()方法可以獲取一個InetAddess對象,該對象含有服務器端的IP地址和域名。 雙方通信完畢后,套接字應使用close()方法關閉套接字連接 .從套接字連接中讀取數(shù)據(jù)與從文件中讀取數(shù)據(jù)有著很大的不同。盡管二者都是輸入流,但從文件中讀取數(shù)據(jù)時,所有的數(shù)據(jù)都已經(jīng)在文件中了,而使用套接字連接時,可能在另一端數(shù)據(jù)發(fā)送出來之前,就已經(jīng)開始試著讀取了,這時,就會堵塞本線程,直到該讀取方法成功讀取到信
9、息,本線程才繼續(xù)執(zhí)行后續(xù)的操作。因此,服務器端收到一個客戶的套接字后,就應該啟動一個專門為該客戶服務的線程 .服務器程序客戶1的線程客戶1客戶2的線程客戶2客戶3的線程客戶3圖14.5 具有多線程的服務器端程序.可以使用Socket類的不帶參數(shù)的構造方法Socket()創(chuàng)建一個套接字對象,該對象再調用 public void connect(SocketAddress endpoint) throws IOException請求和參數(shù)SocketAddress指定地址的服務器端的套接字建立連接。為了使用connect方法,可以使用SocketAddress的子類:InetSocketAddre
10、ss創(chuàng)建一個對象,InetSocketAddress的構造方法是: public InetSocketAddress(InetAddress addr, int port).基于UDP的通信和基于TCP的通信不同,基于UDP的信息傳遞更快,但不提供可靠性保證。也就是說,數(shù)據(jù)在傳輸時,用戶無法知道數(shù)據(jù)能否正確到達目的地主機,也不能確定數(shù)據(jù)到達目的地的順序是否和發(fā)送的順序相同。可以把UDP通信比作生活中的郵遞信件,我們不能肯定所發(fā)的信件就一定能夠到達目的地,也不能肯定到達的順序是發(fā)出時的順序,可能因為某種原因導致后發(fā)出的先到達。 .基于UDP通信的基本模式是:將數(shù)據(jù)打包,稱為數(shù)據(jù)包(好比將信件裝入
11、信封一樣),然后將數(shù)據(jù)包發(fā)往目的地。接受別人發(fā)來的數(shù)據(jù)包(好比接收信封一樣),然后查看數(shù)據(jù)包中的內容。.1用DatagramPacket類將數(shù)據(jù)打包,即用DatagramPacket類創(chuàng)建一個對象,稱為數(shù)據(jù)包。用DatagramPacket的以下兩個構造方法創(chuàng)建待發(fā)送的數(shù)據(jù)包: DatagramPacket(byte data,int length,InetAddtress address,int port):.使用該構造方法創(chuàng)建的數(shù)據(jù)包對象具有下列兩個性質:含有data數(shù)組指定的數(shù)據(jù)。該數(shù)據(jù)包將發(fā)送到地址是address、端口號是port的主機上。我們稱address是它的目標地址、port
12、是這個數(shù)據(jù)包的目標端口。DatagramPack(byte data,int offset,int length,InetAddtress address,int port)使用該構造方法創(chuàng)建的數(shù)據(jù)包對象含有數(shù)組data中從offset開始后的length個字節(jié),該數(shù)據(jù)包將發(fā)送到地址是address,端口號是port的主機上。 .2用DatagramSocket類的不帶參數(shù)的構造方法:DatagramSocket()創(chuàng)建一個對象,該對象負責發(fā)送數(shù)據(jù)包。例如:DatagramSocket mail_out=new DatagramSocket();mail_out.send(data_pack)
13、;.首先用DatagramSocket的另一個構造方法:DatagramSocket(int port) 創(chuàng)建一個對象,其中的參數(shù)必須和待接收的數(shù)據(jù)包的端口號相同。例如,如果發(fā)送方發(fā)送的數(shù)據(jù)包的端口是5666,那么如下創(chuàng)建DatagramSocket對象:DatagramSocket mail_in=new DatagramSocket(5666); .然后對象mail_in使用方法receive(DatagramPacket pack)接受數(shù)據(jù)包。該方法有一個數(shù)據(jù)包參數(shù)pack,方法receive把收到的數(shù)據(jù)包傳遞給該參數(shù)。因此我們必須預備一個數(shù)據(jù)包以便收取數(shù)據(jù)包。這時需使用 Datagra
14、mPack類的另外一個構造方法:DatagramPack(byte data,int length)創(chuàng)建一個數(shù)據(jù)包,用于接收數(shù)據(jù)包,例如:byte data=new byte100;int length=90;DatagramPacket pack=new DatagramPacket(data,length);mail_in.receive(pack);該數(shù)據(jù)包pack將接收長度是length字節(jié)的數(shù)據(jù)放入data。 .計算機使用IP地址和端口來區(qū)分其位置和進程,但有一類地址非常特殊,稱作D類地址,D類地址不是用來代表位置的,即在網(wǎng)絡上不能使用D類地址去查找計算機。 D類地址好像生活中的社團
15、組織,不同地理位置的人可以加入相同的組織,繼而可以享有組織內部的通信權利。 .Internet的地址是a.b.c.d的形式。該地址的一部分代表用戶自己的主機,而另一部分代表用戶所在的網(wǎng)絡。當a小于128,那么b.c.d就用來表示主機,這類地址稱做A類地址。如果a大于等于128并且小于192,則a.b表示網(wǎng)絡地址,而c.d表示主機地址,這類地址稱做B類地址。如果a大于等于192,則網(wǎng)絡地址是a.b.c,d表示主機地址,這類地址稱做C類地址。55是保留地址,稱作D類地址 .要廣播或接收廣播的主機都必須加入到同一個D類地址。一個D類地址也稱做一個組播地址,
16、D類地址并不代表某個特定主機的位置,一個具有A、B或C類地址的主機要廣播數(shù)據(jù)或接收廣播,都必須加入到同一個D類地址。 .RMI(Remote Method Invocation)是一種分布式技術,使用RMI可以讓一個虛擬機上的應用程序請求調用位于網(wǎng)絡上另一處的虛擬機上的對象方法。習慣上稱發(fā)出調用請求的虛擬機為(本地)客戶機,稱接受并執(zhí)行請求的虛擬機為(遠程)服務器 .1遠程對象駐留在(遠程)服務器上的對象是客戶要請求的對象,稱作遠程對象,即客戶程序請求遠程對象調用方法,然后遠程對象調用方法并返回必要的結果。 .2代理與存根(Stub)RMI不希望客戶應用程序直接與遠程對象打交道,代替地讓用戶程
17、序和遠程對象的代理打交道。代理的特點是:它與遠程對象實現(xiàn)了相同的接口,也就是說它與遠程對象向用戶公開了相同的方法,當用戶請求代理調用這樣的方法時,如果代理確認遠程對象能調用相同的方法時,就把實際的方法調用委派給遠程對象。 .RMI會幫助我們生成一個存根(Stub):一種特殊的字節(jié)碼,并讓這個存根產(chǎn)生的對象為作為遠程對象的代理。代理需要駐留在客戶端,也就是說,需要把RMI生成的存根(Stub)復制或下載到客戶端。因此,在RMI中,用戶實際上是在和遠程對象的代理直接打交道,但用戶并沒有感覺到他在和一個代理打交道,而是覺得自己就是在和遠程對象直接打交道。比如,用戶想請求遠程對象調用某個方法,只需將向
18、遠程代理發(fā)出同樣的請求即可 .(本地)客戶機遠程代理客戶應用程序請求(遠程)服務器遠程對象請求響應圖14.12 遠程代理與遠程對象響應.3Remote接口RMI為了標識一個對象是遠程對象,即可以被客戶請求的對象,要求遠程對象必須實現(xiàn)java.rmi包中的Remote接口,也就是說只有實現(xiàn)該接口的類的實例才被RMI認為是一個遠程對象。Remote接口中沒有方法,該接口僅僅起到一個標識作用,因此,必須擴展Remote接口,以便規(guī)定遠程對象的那些方法是客戶可以請求的方法,用戶程序不必編寫和遠程代理的有關代碼,只需知道遠程代理和遠程對象實現(xiàn)了相同的接口 .為了敘述的方便,我們假設本地客戶機存放有關類的
19、目錄是D:Client;遠程服務器的IP是,存放有關類的目錄是D:Server。 .1擴展Remote接口定義一個接口是java.rmi包中Remote的子接口,即擴展Remote接口。以下是我們定義的Remote的子接口是RemoteSubject。RemoteSubject子接口中定義了計算面積的方法,即要求遠程對象為用戶計算某種幾何圖形的面積。RemoteSubject的代碼如下:RemoteSubject.java RemoteSubject.java import java.rmi.*;public interface RemoteSubject extends R
20、emote public void setHeight(double height) throws RemoteException; public void setWidth(double width) throws RemoteException; public double getArea() throws RemoteException;.2遠程對象創(chuàng)建遠程對象的類必須要實現(xiàn)Remote接口,RMI使用Remote接口來標識遠程對象,但是Remote中沒有方法,因此創(chuàng)建遠程對象的類需要實現(xiàn)Remote接口的一個子接口。另外,RMI為了讓一個對象成為遠程對象還需要進行一些必要初始化工作,因
21、此,在編寫創(chuàng)建遠程對象的類時,可以簡單讓該類是RMI提供的java.rmi.server包中的UnicastRemoteObject類的子類即可。 .以下是我們定義的創(chuàng)建遠程對象的類:RemoteConcreteSubject,該類實現(xiàn)了上述RemoteSubject接口(見本節(jié)上述標題1中的RemoteSubject接口),所創(chuàng)建的遠程對象可以計算矩形的面積,RemoteConcreteSubject的代碼如下:RemoteConcreteSubject.java RemoteConcreteSubject.java import java.rmi.*;import java.rmi.ser
22、ver.UnicastRemoteObject;public class RemoteConcreteSubject extends UnicastRemoteObject implements RemoteSubject double width,height; public RemoteConcreteSubject() throws RemoteException public void setWidth(double width) throws RemoteException this.width=width; public void setHeight(double height)
23、throws RemoteException this.height=height; public double getArea() throws RemoteException return width*height; .3. 存根(Stub)與代理RMI負責產(chǎn)生存根(Stub Object),如果創(chuàng)建遠程對象的字節(jié)碼是RemoteConcreteSubject.class,那么存根(Stub)的字節(jié)碼是RemoteConcreteSubject_Stub.class,即后綴為“_Stub”。RMI使用rmic命令生成存根:RemoteConcreteSubject_Stub.class。首
24、先進入D:Server目錄,然后如下執(zhí)行rmic命令:rmic RemoteConcreteSubject執(zhí)行過rmic命令將產(chǎn)生的存根:RemoteConcreteSubject_Stub.class .4.啟動注冊:rmiregistry在遠程服務器創(chuàng)建遠程對象之前,RMI要求遠程服務器必須首先啟動注冊:rmiregistry,只有啟動了rmiregistry,遠程服務器才可以創(chuàng)建遠程對象,并將該對象注冊到rmiregistry所管理的注冊表中。在遠程服務器開啟一個終端,比如在MS-DOS命令行窗口進入D:Server目錄,然后執(zhí)行rimregistry命令:圖14.14 啟動注冊rmiregistry啟動注冊,也可以后臺啟動注冊:start rmiregistry .5.啟動遠程對象服務遠程服務器啟動注冊rmiregistry后,遠程服務器就可以啟動遠程對象服務了,即編寫程序來創(chuàng)建和注冊遠程對象,并運行該程序。遠程服務器使用java.rmi包中的Naming類調用其類方法:rebind(String name, R
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津天獅學院《基礎泰語(2)》2023-2024學年第一學期期末試卷
- 桂林航天工業(yè)學院《中國特色美食文化鑒賞》2023-2024學年第一學期期末試卷
- 鐵嶺衛(wèi)生職業(yè)學院《聲樂基礎訓練Ⅱ》2023-2024學年第一學期期末試卷
- 平頂山學院《法國歷史與文化》2023-2024學年第一學期期末試卷
- 杭州職業(yè)技術學院《外國文學史(2)》2023-2024學年第一學期期末試卷
- 濟南護理職業(yè)學院《無線通信網(wǎng)絡優(yōu)化》2023-2024學年第一學期期末試卷
- 世界骨髓捐獻者活動方案
- 業(yè)主做月餅活動方案
- 業(yè)主服務接待日活動方案
- 業(yè)余健身活動方案
- 人教版2025年八年級英語下學期期末總復習(專題訓練)專題01單項選擇【期末易錯100題】(人教版)(學生版+解析)
- 企業(yè)財務內控管理制度
- 2025以色列與伊朗沖突全面解析課件
- 2025年農(nóng)產(chǎn)品質量安全追溯體系在食品安全監(jiān)管中的應用與改進報告
- 做賬實操-漁業(yè)行業(yè)的賬務處理分錄實例
- (完整版)金融企業(yè)會計練習題
- 新教育 考試試題及答案
- 2025至2030中國心理保健行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 兒童活動抓魚活動方案
- 天津2025年中國醫(yī)學科學院放射醫(yī)學研究所第一批招聘筆試歷年參考題庫附帶答案詳解
- 2025甘肅省農(nóng)墾集團有限責任公司招聘生產(chǎn)技術人員145人筆試參考題庫附帶答案詳解析
評論
0/150
提交評論