![面向對象的程序設計Java張白一第三版第15章_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/12/2fc743ae-4d2d-4e93-b043-dbd970edbf14/2fc743ae-4d2d-4e93-b043-dbd970edbf141.gif)
![面向對象的程序設計Java張白一第三版第15章_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/12/2fc743ae-4d2d-4e93-b043-dbd970edbf14/2fc743ae-4d2d-4e93-b043-dbd970edbf142.gif)
![面向對象的程序設計Java張白一第三版第15章_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/12/2fc743ae-4d2d-4e93-b043-dbd970edbf14/2fc743ae-4d2d-4e93-b043-dbd970edbf143.gif)
![面向對象的程序設計Java張白一第三版第15章_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/12/2fc743ae-4d2d-4e93-b043-dbd970edbf14/2fc743ae-4d2d-4e93-b043-dbd970edbf144.gif)
![面向對象的程序設計Java張白一第三版第15章_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/12/2fc743ae-4d2d-4e93-b043-dbd970edbf14/2fc743ae-4d2d-4e93-b043-dbd970edbf145.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第15章 網(wǎng)絡編程 第15章 網(wǎng)絡編程 15.1 url通信通信 15.2 socket通信通信 15.3 udp通信通信 第15章 網(wǎng)絡編程 15.1 url通信通信url(uniform resource locator,統(tǒng)一資源定位器)表示internet/intranet上的資源位置。這些資源可以是一個文件、一個目錄或一個對象。當我們使用瀏覽器瀏覽網(wǎng)絡上的資源時,首先需要鍵入url地址,才可以訪問相應的主頁。例如:http:/:80/index.htmlhttp:/ 網(wǎng)絡編程 表表15.1 url地址的組成地址的組成 第15章 網(wǎng)絡編程 一般的通信協(xié)議都已經(jīng)規(guī)定好了開始聯(lián)絡時的通信端口
2、,例如,http協(xié)議的缺省端口號是80,ftp協(xié)議的缺省端口號是21等。url使用協(xié)議的缺省端口號時,可以不寫出缺省端口號。所以,一般的url地址只包含傳輸協(xié)議、主機名和文件名就足夠了。網(wǎng)絡通信中,我們常常會碰到地址(address)和端口(port)的問題。兩個程序之間只有在地址和端口方面都達成一致時,才能建立連接。這與我們寄信要有地址、打電話要有電話號碼一樣。兩個遠方程序建立連接時,首先需要知道對方的地址或主機名,其次是端口號。地址主要用來區(qū)分計算機第15章 網(wǎng)絡編程 網(wǎng)絡中的各個計算機,而端口的定義可以理解為擴展的號碼,具備一個地址的計算機可以通過不同的端口來與其他計算機進行通信。在tc
3、p協(xié)議中,端口被規(guī)定為一個在065535之間的16位的整數(shù)。其中,01023被預先定義的服務通信占用(如ftp協(xié)議的端口號是21,http協(xié)議的端口號為80等)。除非我們需要訪問這些特定服務,否則就應該使用102465535這些端口中的某一個來進行通信,以免發(fā)生端口的沖突。第15章 網(wǎng)絡編程 15.1.1 url類類要使用url進行網(wǎng)絡編程,就必須創(chuàng)建url對象。創(chuàng)建url對象要使用軟件包中提供的.url類的構造方法。1創(chuàng)建url對象url類提供的用于創(chuàng)建url對象的構造方法有4個:(1) url(string spec)方法。根據(jù) string 表示形式創(chuàng)建url對象。例如:url file
4、=new url(http:/ 網(wǎng)絡編程 (2) url(string protocol,string host,string file)方法。根據(jù)指定的protocol、host、port號和file創(chuàng)建url對象。其中的protocol為協(xié)議名,host為主機名,file為文件名,端口號使用缺省值。例如:http,index.html(3) url(string protocol,string host,string port,string file)方法。這個構造方法與構造方法(2)相比,增加了1個指定端口號的參數(shù)。第15章 網(wǎng)絡編程 (4) url(url context,string
5、 spec)方法。 通過在指定的上下文中用指定的處理程序對給定的spec進行解析來創(chuàng)建url。例如:url base=new url(file: /c:/abc/xx.java);url gk=new url(base,gg.txt);中的url對象gk是相對url對象。javac在使用對象gk時會從對象base中查出文件gg.txt所在的位置:本地主機是c:/abc/。對象gk指明的資源也就是file: /c:/abc/gg.txt。如果在程序中不訪問xx.java,那么在創(chuàng)建base的構造方法中則略去xx.java。創(chuàng)建gg的方法不變,gg指明的資源仍不變。第15章 網(wǎng)絡編程 2url類的
6、常用成員方法類的常用成員方法創(chuàng)建url對象后,可以使用.url類的成員方法對創(chuàng)建的對象進行處理。.url的常用成員方法如表15.2所示。第15章 網(wǎng)絡編程 表表15.2 url類的常用成員方法類的常用成員方法第15章 網(wǎng)絡編程 15.1.2 利用利用url類訪問網(wǎng)上資源示例程序類訪問網(wǎng)上資源示例程序【示例程序c15_1.java】 獲取某個url地址的協(xié)議名、主機名、端口號和文件名。package ch15;import .malformedurlexception;import .url;public class c15_1 public static void main(string ar
7、gs ) 第15章 網(wǎng)絡編程 url myurl=null; try myurl=new url(/kb/docs/java/quickstart.html); catch (malformedurlexception e) system.out.println(malformedurlexception: + e); system.out.println(url string: +myurl.tostring( ); /獲取url對象轉換成字符串 system.out.println(protocol: +myurl.getprotocol( ); /獲取
8、協(xié)議名第15章 網(wǎng)絡編程 system.out.println(“host: ”+myurl.gethost( ); /獲取主機名 system.out.println(“port: ”+myurl.getport( ); /獲取端口號 system.out.println(“file: ”+myurl.getfile( ); /獲取文件名 該程序的運行結果如圖15.1右下窗口所示。第15章 網(wǎng)絡編程 圖15.1 程序c15_1的運行結果 第15章 網(wǎng)絡編程 【示例程序c15_2.java】 使用url類的openstream()成員方法獲取url指定的網(wǎng)上信息。package ch15;im
9、port java.io.*;import .malformedurlexception;import .url;public class c15_2 public static void main(string args) string str; inputstream st1;第15章 網(wǎng)絡編程 /string ur=/kb/docs/java/quickstart.html; /獲取遠程網(wǎng)上的信息 string ur=file:/e:/java/ch15/src/ch15/c15_1.java; /獲取本地網(wǎng)上的信息 try url myurl=new
10、 url(ur); st1=myurl.openstream(); inputstreamreader ins=new inputstreamreader(st1); bufferedreader in=new bufferedreader(ins); while(str=in.readline()!= null) /從url處獲取信息并顯示 system.out.println(str); 第15章 網(wǎng)絡編程 catch(malformedurlexception e) /創(chuàng)建url對象可能產(chǎn)生的異常 system.out.println(cant get url: ); catch (io
11、exception e) system.out.println(error in i/o: + e.getmessage(); 由于url的openstream()成員方法返回的是inputstream類的對象,因此只能通過read()方法逐個字節(jié)地去讀url地址處的資源信息。這里利用bufferedreader對原始信息流進行了包裝和處理,以提高i/o效率。運行的結果是顯示出c15_1.java程序的內容。第15章 網(wǎng)絡編程 15.1.3 使用使用urlconnection類訪問網(wǎng)上資源類訪問網(wǎng)上資源上面介紹的方法只能讀取遠程計算機節(jié)點的信息,如果希望在讀取遠程計算機節(jié)點的信息時還可向它寫入
12、信息,則需要使用軟件包中的另一個類urlconnection。1創(chuàng)建創(chuàng)建urlconnection類的對象類的對象要創(chuàng)建urlconnection對象必須先創(chuàng)建一個url對象,然后調用該對象的openconnection()方法就可以返回一個對應其url地址的urlconnection對象。例如:url myurl=new url(http:/ con= myurl.openconnection();第15章 網(wǎng)絡編程 2建立輸入建立輸入/輸出數(shù)據(jù)流輸出數(shù)據(jù)流讀取或寫入遠程計算機節(jié)點的信息時,要建立輸入或輸出數(shù)據(jù)流。我們可以利用urlconnection類的成員方法getinputstream
13、()和getoutputstream()來獲取輸入和輸出數(shù)據(jù)流。例如,下面的兩行語句用于建立輸入數(shù)據(jù)流:inputstreamreader ins=new inputstreamreader(con.getinputstream();bufferedreader in=new bufferedreader(ins);下面的語句行用于建立輸出數(shù)據(jù)流:printstream out=new printstream(con.getoutputstream();第15章 網(wǎng)絡編程 3讀取遠程計算機節(jié)點的信息或向其寫入信息讀取遠程計算機節(jié)點的信息或向其寫入信息要讀取遠程計算機節(jié)點的信息,可調用in.re
14、adline()方法;向遠程計算機節(jié)點寫入信息時,可調用out.println(參數(shù))方法。urlconnection類是一個抽象類,它是代表程序與url對象之間建立通信連接的所有類的超類,此類的一個實例可以用來讀/寫url對象所代表的資源。出于安全性的考慮,java程序只能對特定的url進行寫操作,這種url就是服務器上的cgi(common gateway interface,公共網(wǎng)關接口)程序。cgi是客戶端瀏覽器與服務器進行通信的接口。下面通過一個例子來說明urlconnection類是如何使用的。第15章 網(wǎng)絡編程 【示例程序c15_3.java】 使用urlconnection類從
15、遠程主機獲取信息。package ch15;import java.io.*;import .*;class c15_3 public static void main(string args) try string ur=“http:/”; /獲取遠程網(wǎng)上的信息 / string ur=file:/e:/java/ch15/src/ch15/c15_1.java ; /獲取本地網(wǎng)上的信息第15章 網(wǎng)絡編程 url myurl=new url(ur); string str; urlconnection con=myurl.openconnection(); inputstreamreader
16、 ins=new inputstreamreader(con.getinputstream(); bufferedreader in=new bufferedreader(ins); while (str=in.readline()!=null) system.out.println(str); in.close(); catch (malformedurlexception mfurle) system.out.println(malformedurlexception: + mfurle); 第15章 網(wǎng)絡編程 catch (ioexception ioe) system.out.prin
17、tln(“ioexception: ” + ioe); 該程序的運行結果如圖15.2所示。第15章 網(wǎng)絡編程 圖15.2 程序c15_3的運行結果 第15章 網(wǎng)絡編程 15.2 socket通信通信socket套接字是應用于網(wǎng)絡通信中的重要機制。socket最初是加利福尼亞大學berkeley分校為unix操作系統(tǒng)開發(fā)的網(wǎng)絡通信接口。隨著unix操作系統(tǒng)的廣泛使用,套接字成為當前最流行的網(wǎng)絡通信應用程序接口之一。java語言中采用的socket通信是一種流式套接字通信,它采用tcp協(xié)議,通過提供面向連接的服務,實現(xiàn)客戶/服務器之間雙向、可靠的通信。包中的socket類與serversocket
18、類為流式套接字通信方式提供了充分的支持。第15章 網(wǎng)絡編程 15.2.1 socket的概念及通信機制的概念及通信機制1socket的概念的概念socket稱為“套接字”,也有人稱為“插座”。在兩臺計算機上運行的兩個程序之間有一個雙向通信的鏈接點,而這個雙向鏈路的每一端就稱為一個socket。第15章 網(wǎng)絡編程 建立連接的兩個程序分別稱為客戶端(client)和服務器端(server)??蛻舳顺绦蛏暾堖B接,而服務器端程序監(jiān)聽所有的端口,判斷是否有客戶程序的服務請求。當客戶程序請求和某個端口連接時,服務器程序就將“套接字”連接到該端口上,此時,服務器與客戶程序就建立了一個專用的虛擬連接。客戶程序
19、可以向套接字寫入請求,服務器程序處理請求并把處理結果通過套接字送回。通信結束時,再將所建的虛擬連接拆除。一個客戶程序只能連接服務器的一個端口,而一個服務器可以有若干個端口,不同的端口使用不同的端口號,并提供不同的服務。第15章 網(wǎng)絡編程 2socket通信機制通信機制利用socket進行網(wǎng)絡通信分為三個步驟:(1) 建立socket連接。在通信開始之前由通信雙方確認身份,建立一條專用的虛擬連接通道。(2) 數(shù)據(jù)通信。利用虛擬連接通道傳送數(shù)據(jù)信息進行通信。(3) 關閉。通信結束時將所建的虛擬連接拆除。利用包中提供的socket類和serversocket類及其方法,可完成上述操作。socket通
20、信機制如圖15.3所示。第15章 網(wǎng)絡編程 圖15.3 socket通信機制 第15章 網(wǎng)絡編程 從圖15.3中可以看到,服務器端的程序首先選擇一個端口(port)注冊,然后調用accept()方法對此端口進行監(jiān)聽,等待其他程序的連接申請。如果客戶端的程序申請和此端口連接,那么服務器端就利用accept()方法來取得這個連接的socket??蛻舳说某绦蚪ocket時必須指定服務器的地址(host)和通信的端口號(port#),這個端口號必須與服務器端監(jiān)聽的端口號保持一致。第15章 網(wǎng)絡編程 15.2.2 socket類與類與 serversocket類類中提供了兩個類,即serversoc
21、ket類和socket類,它們分別用于服務器端和客戶端的socket通信,進行網(wǎng)絡通信的方法也都封裝在這兩個類中。1serversocket對象與對象與socket對象的構造方法對象的構造方法java在軟件包中提供了serversocket類和socket類對應的雙向鏈接的服務器端和客戶端,包含的主要構造方法如表15.3所示。第15章 網(wǎng)絡編程 表表15.3 serversocket類與類與socket類的構造方法類的構造方法 第15章 網(wǎng)絡編程 2異常處理異常處理在建立socket對象的同時要進行異常處理,以便程序出錯時能夠及時做出響應。(1) 服務器端:在建立serversocket類的對
22、象和取得socket類的對象時都要進行異常處理,例如下面語句中的try-catch語句。serversocket server;socket socket;try server=new serversocket(3561);catch(exception e) system.out.println(“error occurred:”+e);try socket=server.accept();catch(exception e) system.out.println(error occurred:+e);第15章 網(wǎng)絡編程 (2) 客戶端:在建立socket類的對象時要進行異常處理,例如下面的
23、try-catch語句。socket socket;try socket=new socket(“server name”,3561);catch(exception e) system.out.println(error occurred:+e);第15章 網(wǎng)絡編程 3獲取輸入獲取輸入/輸出流輸出流建立socket連接后,就可以利用socket類的兩個方法getinputstream()和getoutputstream()分別獲得向socket類的對象讀/寫數(shù)據(jù)的輸入/輸出流。此時同樣要進行異常處理,因此,通常將讀/寫數(shù)據(jù)的輸入/輸出流語句寫在try-catch塊中。例如:try input
24、stream ins=socket. getinputstream(); outputstream outs=socket. getoutputstream();catch(exception e) system.out.println(“error occurred:”+e);第15章 網(wǎng)絡編程 4讀讀/寫數(shù)據(jù)流寫數(shù)據(jù)流獲取socket類的對象的輸入/輸出流后,為了便于進行讀/寫,需要在這兩個流對象的基礎上建立易于操作的數(shù)據(jù)流對象,如inputstreamreader類、outputstreamreader類或printstream類的對象。建立數(shù)據(jù)流的對象可采用如下語句:inputstre
25、amreader in=new inputstreamreader(ins);bufferedreader inn=new bufferedreader(in);outputstreamreader out=new inputstreamreader(outs);printstream out=new printstream(outs);第15章 網(wǎng)絡編程 要讀入一個字符串并將其長度寫入輸出流中,可以使用如下語句:string str=inn.readline();out.println(str.length();5斷開連接斷開連接無論是編寫服務器程序還是客戶端程序,通信結束時,必須斷開連接并
26、釋放所占用的資源。java提供了close()方法來斷開連接。(1) 關閉socket對象:socket.close()。(2) 關閉server socket對象:server.close()。第15章 網(wǎng)絡編程 15.2.3 流式流式socket通信的示例程序通信的示例程序綜合前面介紹的內容,這里給出幾個示例程序作為總結?!臼纠绦騝15_4.java】 利用inetaddress類的對象來獲取計算機主機信息。package ch15;import .inetaddress;import .unknownhostexception;public class c15_4 public sta
27、tic void main(string args )第15章 網(wǎng)絡編程 try if(args.length=1) /調用inetaddress類的靜態(tài)方法,利用主機名創(chuàng)建對象 inetaddress ipa=inetaddress.getbyname(args0); system.out.println(host name: +ipa.gethostname( ); /獲取主機名 system.out.println(host ip address: +ipa.tostring( ); /獲取ip地址 system.out.println(local host: +inetaddress.
28、getlocalhost( ); else system.out.println(輸入一個主機名); 第15章 網(wǎng)絡編程 catch(unknownhostexception e) /創(chuàng)建inetaddress對象可能發(fā)生的異常 system.out.println(e.tostring( ); /end of main( )運行時先在“ch15項目屬性”對話框的“主類”后的文本框中輸入“ch15.c15_4”,在“參數(shù)”后的文本框中輸入“l(fā)ocalhost”。然后,選擇菜單欄中的“運行”“設置主項目” “ch15”,再單擊菜單欄中的“運行”“清理并生成主項目”。最后,單擊菜單欄中的“運行”“
29、運行主項目”。程序運行后就會輸出如下的運行結果:第15章 網(wǎng)絡編程 host name: localhosthost ip address: localhost/local host: ekkivwzmwr79bjh/00下面的示例程序c15_5.java和c15_6.java是一個完整的實現(xiàn)socket通信的java程序,分別為服務器端程序和客戶端程序。在這個socket通信程序中,服務器等待與客戶端連接。當連接建立后,客戶端向服務器端發(fā)送一條信息,服務器端收到后再向客戶端發(fā)送一條信息。若客戶端發(fā)送end結束消息傳遞,服務器端同意,則客戶端拆除與服務器
30、端的連接。第15章 網(wǎng)絡編程 【示例程序c15_5.java】 socket通信的服務器端程序。package ch15;/socke服務器端程序import java.io.*;import .serversocket;import .socket;public class c15_5 public static final int port=8000; public static void main(string args )第15章 網(wǎng)絡編程 string str; try /在端口port注冊服務 serversocket server=new serversocket(port);
31、/創(chuàng)建當前線程的監(jiān)聽對象 system.out.println(started: +server); socket socket=server.accept( ); /負責c/s通信的socket對象 system.out.println(socket: +socket); /獲得對應socket的輸入/輸出流 inputstream fin=socket.getinputstream( ); outputstream fout=socket.getoutputstream( ); /建立數(shù)據(jù)流 第15章 網(wǎng)絡編程 inputstreamreader isr=new inputstreamre
32、ader(fin); bufferedreader in=new bufferedreader(isr); printstream out=new printstream(fout); inputstreamreader userisr=new inputstreamreader(system.in); bufferedreader userin=new bufferedreader(userisr); while(true) system.out.println(等待客戶端的消息); str=in.readline( ); /讀客戶端傳送的字符串 system.out.println(客戶端
33、:+str); /顯示字符串 if(str.equals(end)break; /如果是end,則退出 system.out.print(給客戶端發(fā)送:); 第15章 網(wǎng)絡編程 str=userin.readline( ); out.println(str); /向客戶端發(fā)送消息 if(str.equals(end)break; /while socket.close( ); server.close( ); /try catch(exception e) system.out.println(異常:+e); 第15章 網(wǎng)絡編程 【示例程序c15_6.java】 socket通信的客戶端程序。
34、package ch15;/socket客戶端程序import java.io.*;import .inetaddress;import .socket;public class c15_6 public static void main(string args) string str;第15章 網(wǎng)絡編程 try inetaddress addr=inetaddress.getbyname(); /inetaddress addr=inetaddress.getbyname(8); socket socket=new socket(addr,8000);
35、 system.out.println(socket: +socket); /獲得對應socket的輸入/輸出流 inputstream fin=socket.getinputstream( ); outputstream fout=socket.getoutputstream( ); /建立數(shù)據(jù)流 inputstreamreader isr=new inputstreamreader(fin); bufferedreader in=new bufferedreader(isr); printstream out=new printstream(fout); inputstreamreader
36、 userisr=new inputstreamreader(system.in); 第15章 網(wǎng)絡編程 bufferedreader userin=new bufferedreader(userisr); while(true) system.out.print(發(fā)送字符串:); str=userin.readline( ); /讀取用戶輸入的字符串 out.println(str); /將字符串傳給服務器端 if(str.equals(end)break; /如果是end,就退出 system.out.println(等待服務器端消息); str=in.readline( ); /獲取服務
37、器發(fā)送的字符串 system.out.println(服務器端字符:+str); if(str.equals(end)break; 第15章 網(wǎng)絡編程 socket.close( ); /關閉連接 catch(exception e) system.out.println(“異常:”+e); 服務器端程序的運行情況如圖15.4所示,客戶端程序的運行情況如圖15.5所示。第15章 網(wǎng)絡編程 圖15.4 服務器端程序輸出窗口(ch15(run) 第15章 網(wǎng)絡編程 圖15.5 客戶端程序輸出窗口(ch15(#2)第15章 網(wǎng)絡編程 程序運行時,首先運行服務器程序c15_5.java,然后運行客戶端
38、程序c15_6.java建立兩端的連接。輸出窗口有兩個,如圖15.4和圖15.5所示。先在客戶端輸出窗口給服務器發(fā)送信息,例如“how do you do!”,單擊服務器窗口,當看到服務器收到信息并輸出后,再給客戶端發(fā)信息,例如“find,thanks.”,客戶端收到信息并輸出后,再給服務器發(fā)送信息,直到客戶端給服務器發(fā)“end”則結束通信。第15章 網(wǎng)絡編程 15.2.4 url通信與通信與socket通信的區(qū)別通信的區(qū)別url通信與socket通信都是面向連接的通信,它們的區(qū)別在于:socket通信方式為主動等待客戶端的服務請求方式,而url通信方式為被動等待客戶端的服務請求方式。利用so
39、cket進行通信時,在服務器端運行了一個socket通信程序,不停地監(jiān)聽客戶端的連接請求,當接到客戶端請求后,馬上建立連接并進行通信。利用url進行通信時,在服務器端常駐有一個cgi程序,但它一直處于睡眠狀態(tài),只有當客戶端的連接請求到達時它才被喚醒,然后建立連接并進行通信。第15章 網(wǎng)絡編程 在socket通信方式中,服務器端的程序可以打開多個線程與多個客戶端進行通信,并且還可以通過服務器使各個客戶端之間進行通信,這種方式適合于一些較復雜的通信。而在url通信方式中,服務器端的程序只能與一個客戶進行通信,這種方式比較適合于b/s通信模式。第15章 網(wǎng)絡編程 15.3 udp通信通信url和so
40、cket通信是一種面向連接的流式套接字通信,采用的協(xié)議是tcp協(xié)議。在面向連接的通信中,通信的雙方需要首先建立連接再進行通信,這需要占用資源與時間。但是在建立連接之后,雙方就可以準確、同步、可靠地進行通信了。流式套接字通信在建立連接之后,可以通過流來進行大量的數(shù)據(jù)交換。tcp通信被廣泛應用在文件傳輸、遠程連接等需要可靠傳輸數(shù)據(jù)的領域。第15章 網(wǎng)絡編程 udp通信是一種無連接的數(shù)據(jù)報通信,采用的協(xié)議是數(shù)據(jù)報通信協(xié)議udp(user datagram protocol)。按照這個協(xié)議,兩個程序進行通信時不用建立連接;數(shù)據(jù)以獨立的包為單位發(fā)送,包的容量不能太大;每個數(shù)據(jù)報需要有完整的收/發(fā)地址,可
41、以隨時進行收/發(fā)數(shù)據(jù)報,但不保證傳送順序和內容準確;數(shù)據(jù)報可能會被丟失、延誤等。因此,udp通信是不可靠的通信。由于udp通信速度較快,因此常常被應用在某些要求實時交互,準確性要求不高,但傳輸速度要求較高的場合。軟件包中的類datagramsocket和類datagrampacket為實現(xiàn)udp通信提供了支持。第15章 網(wǎng)絡編程 15.3.1 udp通信機制通信機制利用udp通信時,服務器端和客戶端的通信過程如圖15.6所示。服務器端的程序有一個線程不停地監(jiān)聽客戶端發(fā)來的數(shù)據(jù)報,等待客戶的請求。服務器只有通過客戶發(fā)來的數(shù)據(jù)報中的信息才能得到客戶端的地址及端口。第15章 網(wǎng)絡編程 圖15.6 u
42、dp通信機制 第15章 網(wǎng)絡編程 15.3.2 datagramsocket類類datagramsocket類用于收/發(fā)數(shù)據(jù)報。其構造方法如下:(1) datagramsocket()方法。(2) datagramsocket(int port)方法。(3) datagramsocket(int port,inetaddress iaddr)方法。其中,第一個構造方法將socket連接到本機的任何一個可用的端口上;第二個將socket連接到本機的port端口上;第三個則將socket連接到指定地址的port端口上。這里需要注意兩點:一是規(guī)定端口時不要發(fā)生沖突;二是在調用構造方法時要進行異常處理
43、。第15章 網(wǎng)絡編程 receive()和send()是datagramsocket類中用來實現(xiàn)數(shù)據(jù)報傳送和接收的兩個重要成員方法,其格式如下:(1) void receive(datagrampacket packet)方法。(2) void send(datagrampacket packet)方法。receive()方法將使程序中的線程一直處于阻塞狀態(tài),直到從當前socket中接收到信息后,將收到的信息存儲在receive()方法的參數(shù)packet的對象中。由于數(shù)據(jù)報是不可靠的通信,因此receive()方法不一定能讀到數(shù)據(jù)。為防止線程死掉,應該設置超時參數(shù)(timeout)。send(
44、)方法將datagrampacket類的packet的對象中包含的數(shù)據(jù)報文發(fā)送到所指定的ip地址主機的指定端口。第15章 網(wǎng)絡編程 15.3.3 datagrampacket類類datagrampacket類用來實現(xiàn)數(shù)據(jù)報通信,它的常用的兩個構造方法,分別對應發(fā)送數(shù)據(jù)報和接收數(shù)據(jù)報:(1) datagrampacket(byte sbuf,int slength,inetaddress iaddr,int iport)方法。這個構造方法用來創(chuàng)建發(fā)送數(shù)據(jù)報對象。其中,sbuf代表發(fā)送數(shù)據(jù)報的字節(jié)數(shù)組;slength代表發(fā)送數(shù)據(jù)報的長度;iaddr代表發(fā)送數(shù)據(jù)報的目的地址,即接收者的ip地址;ip
45、ort代表發(fā)送數(shù)據(jù)報的端口號。(2) datagrampacket(byte rbuf,int rlength)方法。這個構造方法用來創(chuàng)建接收數(shù)據(jù)報對象。其中,rbuf代表接收數(shù)據(jù)報的字節(jié)數(shù)組;rlength代表接收數(shù)據(jù)報的長度,即讀取的字節(jié)數(shù)。第15章 網(wǎng)絡編程 15.3.4 udp通信示例程序通信示例程序下面通過建立一個簡單的udp服務器端和一個客戶端的程序例子,講述udp的工作方式。在這個例子中,服務器端的程序只是不停地監(jiān)聽本機端口,一旦收到客戶端發(fā)來的數(shù)據(jù)報,就回應一個簡單的信息通知客戶已經(jīng)收到了數(shù)據(jù)報??蛻舳说某绦蛳蚍掌靼l(fā)送一個包含一個字符串的數(shù)據(jù)報,同時告知服務器自己的地址及端口
46、,以便服務器做出回應。第15章 網(wǎng)絡編程 【示例程序c15_7.java】 udp通信的服務器端程序。package ch15;/udp 服務器端程序import .datagrampacket;import .datagramsocket;import .inetaddress;class udpserverthread extends thread /啟動服務器線程的主程序 private datagrampacket packet; private datagramsocket socket; static final int sport=1777; udpserverthread()第
47、15章 網(wǎng)絡編程 try /將socket連接到本機的一個可用端口上 socket=new datagramsocket(sport); system.out.println(listening on port:+socket.getlocalport(); catch(exception e) system.out.println(error:+e); public void run() /線程的主要操作 if(socket=null)return; while(true) try inetaddress address; int cport; byte buf1=new byte1000,
48、buf2=new byte1000;第15章 網(wǎng)絡編程 string s=your packet is received; packet=new datagrampacket(buf1,buf1.length); /生成一個接收數(shù)據(jù)報 socket.receive(packet); /接收數(shù)據(jù)報 string s1=new string(packet.getdata(); system.out.println(received from client: +s1); /打印數(shù)據(jù)報的內容 address=packet.getaddress(); cport=packet.getport(); /獲得數(shù)據(jù)報的源地址與端口 buf2=s.getbytes(); packet=new datagramp
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人設備租賃標準合同
- 個人車輛保險合同標準模板
- 個人友情借款合同樣本
- 個人合伙投資合同格式范本
- 中小企業(yè)設備貸款擔保合同
- 個人合伙經(jīng)營合同樣本
- 二手車交易合同模范合同
- S店采購合同管理規(guī)范操作范本
- 不動產(chǎn)分家析產(chǎn):全新合同范本
- 一站式采購合同范本
- 2025年廣西教育出版社有限公司招聘筆試參考題庫含答案解析
- 中醫(yī)膏方臨床應用與制備工藝規(guī)范 DB32/T 4870-2024
- JJG(交通) 208-2024 車貨外廓尺寸動態(tài)現(xiàn)場檢測設備
- 蘇北四市(徐州、宿遷、淮安、連云港)2025屆高三第一次調研考試(一模)英語試卷(含答案)
- 2025年信息系統(tǒng)集成服務公司組織架構和業(yè)務流程
- 西藏自治區(qū)拉薩市城關區(qū)多校2024-2025學年六年級上學期期中英語試題
- CB/T 467-1995法蘭青銅閘閥
- 氣功修煉十奧妙
- 勾股定理的歷史與證明課件
- 中醫(yī)診斷學八綱辨證課件
- 淺談如何有效提高小學數(shù)學教學質量課件
評論
0/150
提交評論