java語言程序設(shè)計(jì)第11章_第1頁(yè)
java語言程序設(shè)計(jì)第11章_第2頁(yè)
java語言程序設(shè)計(jì)第11章_第3頁(yè)
java語言程序設(shè)計(jì)第11章_第4頁(yè)
java語言程序設(shè)計(jì)第11章_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 在internet(互聯(lián)網(wǎng))被廣泛使用的今天,網(wǎng)絡(luò)編程顯得日益重要。網(wǎng)絡(luò)應(yīng)用是java語言取得成功的領(lǐng)域之一,它已經(jīng)成為現(xiàn)在internet上最流行的一種編程語言。 java語言的網(wǎng)絡(luò)功能非常強(qiáng)大,其網(wǎng)絡(luò)類庫(kù)不僅使我們可以開發(fā)訪問internet應(yīng)用層程序,還可以實(shí)現(xiàn)網(wǎng)絡(luò)底層的通信。 本章要點(diǎn)本章要點(diǎn)l11.1 網(wǎng)絡(luò)基礎(chǔ)網(wǎng)絡(luò)基礎(chǔ)l11.2 inetaddress編程編程l11.3 url編程編程l11.4 socket編程編程l11.5 數(shù)據(jù)報(bào)通信數(shù)據(jù)報(bào)通信l思考與練習(xí)思考與練習(xí)1111.1.1 tcp/ip協(xié)議協(xié)議網(wǎng)絡(luò)通信協(xié)議是計(jì)算機(jī)間進(jìn)行通信所要遵循的各種規(guī)則的集合。internet的主

2、要協(xié)議有:網(wǎng)絡(luò)層的ip協(xié)議,傳輸層的tcp、udp協(xié)議,應(yīng)用層的ftp、http、smtp等協(xié)議。其中,tcp/ip(傳輸控制協(xié)議/網(wǎng)間協(xié)議)是internet的主要協(xié)議,定義了計(jì)算機(jī)和外設(shè)進(jìn)行通信所使用的規(guī)則。tcp/ip網(wǎng)絡(luò)參考模型包括四個(gè)層次:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層。連接到tcp/ip網(wǎng)絡(luò)中的每臺(tái)計(jì)算機(jī)(或其他設(shè)備)都有唯一的地址,這就是ip地址。ip地址實(shí)質(zhì)上是一個(gè)32位的整數(shù),通常以“%d.%d.%d.%d”的形式表示,其中每個(gè)d是一個(gè)8位整數(shù)。在tcp/ip網(wǎng)絡(luò)中,不同的機(jī)器之間進(jìn)行通信時(shí),數(shù)據(jù)的傳輸是由傳輸層控制的,這包括數(shù)據(jù)要發(fā)往的目標(biāo)機(jī)器及應(yīng)用程序、數(shù)據(jù)的質(zhì)量控制等。

3、 tcp/ip網(wǎng)絡(luò)中最常用的傳輸協(xié)議tcp(transport control protocol)和udp(user datagram protocol)就屬于這一層。11.1.1 tcp/ip協(xié)議協(xié)議傳輸層通常以tcp和udp協(xié)議來控制端點(diǎn)到端點(diǎn)的通信。用于通信的端點(diǎn)是由socket來定義的,而socket是由ip地址和端口號(hào)組成的。tcp是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過tcp協(xié)議傳輸,得到的是一個(gè)順序的無差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方的成對(duì)的兩個(gè)socket之間必須建立連接,以便在tcp協(xié)議的基礎(chǔ)上進(jìn)行通信,當(dāng)一個(gè)socket(通常都是server socket)等待建立連接時(shí),另一

4、個(gè)socket可以要求進(jìn)行連接,一旦這兩個(gè)socket連接起來,它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送或接收操作。11.1.2 通信端口通信端口一臺(tái)機(jī)器只通過一條鏈路連接到網(wǎng)絡(luò)上,但一臺(tái)機(jī)器中往往有很多應(yīng)用程序需要進(jìn)行網(wǎng)絡(luò)通信,如何區(qū)分呢?這就要靠網(wǎng)絡(luò)端口號(hào)(port)了。端口號(hào)是一個(gè)標(biāo)記機(jī)器的邏輯通信信道的正整數(shù),端口號(hào)不是物理實(shí)體。ip地址和端口號(hào)組成了所謂的socket,socket是網(wǎng)絡(luò)上運(yùn)行的程序之間雙向通信鏈路的最后終結(jié)點(diǎn),它是tcp和udp的基礎(chǔ)。ip協(xié)議使用ip地址使數(shù)據(jù)投遞到正確的計(jì)算機(jī)上,tcp和udp協(xié)議使用端口號(hào)(port)將數(shù)據(jù)投遞給正確的應(yīng)用程序。端口號(hào)是用

5、一個(gè)16位的整數(shù)來表達(dá)的,其范圍為065535,其中01023為系統(tǒng)所保留,專門給那些通用的服務(wù)(well-known services),常見的有:http服務(wù)的端口號(hào)為80,telnet服務(wù)的端口號(hào)為21,ftp服務(wù)的端口為23等等。因此,當(dāng)我們編寫通信程序時(shí),應(yīng)選擇一個(gè)大于1023的數(shù)作為端口號(hào),以免發(fā)生沖突。 11.1.3 urlurl是統(tǒng)一資源定位符(uniform resource locator)的簡(jiǎn)稱,它表示internet上某一資源的地址。internet上的資源包括html文件、圖像文件、聲音文件、動(dòng)畫文件以及其他任何內(nèi)容(并不完全是文件,也可以是一個(gè)對(duì)數(shù)據(jù)庫(kù)的查詢等)。通

6、過url,就可以訪問internet。瀏覽器或其他程序通過解析給定的url就可以在網(wǎng)絡(luò)上查找相應(yīng)的文件或其他資源。一個(gè)url包括兩部分內(nèi)容:協(xié)議名稱和資源名稱,中間用冒號(hào)隔開:協(xié)議名:/資源名如:http:/協(xié)議名稱指的就是獲取資源時(shí)所使用的應(yīng)用層協(xié)議,如http,ftp,file等;資源名稱則是資源的完整地址,包括主機(jī)名、端口號(hào)、文件名或文件內(nèi)部的一個(gè)引用。當(dāng)然,并不是所有的url都必須包含這些內(nèi)容。一個(gè)完整的url如下:http:/:80/home/white_paper.html#intro_1協(xié)議 主機(jī)域名(ip地址)端口號(hào) 目錄文件名 html參考點(diǎn) 11.1.4 客戶機(jī)客戶機(jī)/服務(wù)

7、器模式服務(wù)器模式目前較為流行的網(wǎng)絡(luò)編程模型是客戶機(jī)/服務(wù)器(c/s)結(jié)構(gòu)。即通信雙方一方作為服務(wù)器等待客戶提出請(qǐng)求并予以響應(yīng)??蛻魟t在需要服務(wù)時(shí)向服務(wù)器提出申請(qǐng)。服務(wù)器一般作為守護(hù)進(jìn)程始終運(yùn)行,監(jiān)聽網(wǎng)絡(luò)端口,一旦有客戶請(qǐng)求,就會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程來響應(yīng)該客戶,同時(shí)自己繼續(xù)監(jiān)聽服務(wù)端口,使后來的客戶也能及時(shí)得到服務(wù)。 11.1.5 java網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程java 通過前面介紹的流式輸入/輸出接口和增加在網(wǎng)絡(luò)上建立輸入/輸出對(duì)象特性這兩個(gè)方法支持tcp/ip。java支持tcp和udp協(xié)議族。tcp用于網(wǎng)絡(luò)的可靠的流式輸入/輸出。udp支持更簡(jiǎn)單的、快速的、點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)報(bào)模式。java的網(wǎng)絡(luò)編程分

8、為三個(gè)層次:1最高一級(jí)的網(wǎng)絡(luò)通信就是我們前面章節(jié)中講的從網(wǎng)絡(luò)上下載applet??蛻舳藶g覽器通過html文件中的標(biāo)記來識(shí)別applet,并解析applet的屬性,通過網(wǎng)絡(luò)獲取applet的字節(jié)碼文件。2前面我們介紹了聲音播放和圖像顯示,其中聲音文件和圖像文件的獲取是次一級(jí)的通信。通過類url的對(duì)象指明文件所在位置,并從網(wǎng)絡(luò)上下載聲音和圖像文件。11.1.5 java網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程3.最低一級(jí)的通信是利用包中提供的類直接在程序中實(shí)現(xiàn)網(wǎng)絡(luò)通信。針對(duì)網(wǎng)絡(luò)通信的不同層次,java提供的網(wǎng)絡(luò)功能有四大類:inetaddress 、urls、sockets、datagram。(1)urls:面向應(yīng)用層。

9、通過url,java程序可以直接送出或讀入網(wǎng)絡(luò)上的數(shù)據(jù)。(2)inetaddress:面向的是ip層。用于標(biāo)識(shí)網(wǎng)絡(luò)上的硬件資源。(3)sockets和datagram:面向的則是傳輸層。sockets使用的是tcp協(xié)議,這是傳統(tǒng)網(wǎng)絡(luò)程序最常用的方式,可以想象為兩個(gè)不同的程序通過網(wǎng)絡(luò)的通信信道進(jìn)行通信。datagram則使用udp協(xié)議,是另一種網(wǎng)絡(luò)傳輸方式,它把數(shù)據(jù)的目的地記錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡(luò)上。11.1.5 java網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程java網(wǎng)絡(luò)編程中主要使用的包中的類有:面向ip層的類:inetaddress面向應(yīng)用層的類:url、urlconnectiontcp協(xié)議相關(guān)類:soc

10、ket、serversocketudp協(xié)議相關(guān)類:datagrampacket、datagramsocket、multicastsocket可能產(chǎn)生的異常:bindexception、connectexception、malformedurlexception、noroutetohostexception、protocolexception、socketexception、unknownhostexception、unknownserviceexception 無論你是在打電話、發(fā)送郵件或建立與internet的連接,地址是基礎(chǔ)。inetaddress 類用來封裝ip地址和該地址的域名。ine

11、taddress類可以用于標(biāo)識(shí)網(wǎng)絡(luò)上的硬件資源,它提供了一系列方法以描述、獲取及使用網(wǎng)絡(luò)資源。每個(gè)inetaddress對(duì)象包含了ip地址、主機(jī)名等信息。inetaddress類沒有構(gòu)造方法,因此不能用new來構(gòu)造一個(gè)inetaddress實(shí)例。通常是用它提供的靜態(tài)方法來獲?。簆ublic static inetaddress getbyname(string host)host可以是一個(gè)機(jī)器名,也可以是一個(gè)形如“%d.%d.%d.%d”的四個(gè)十進(jìn)制數(shù)的ip地址或一個(gè)dsn域名。public static inetaddress getlocalhost()public static inet

12、address getallbyname(string host)這三個(gè)方法通常會(huì)產(chǎn)生unknownhostexception異常,應(yīng)在程序中捕獲處理。inetaddress 類也有一些非靜態(tài)的方法,如本書表11-1所示。 11.2.1 創(chuàng)建創(chuàng)建url對(duì)象對(duì)象url類有以下幾種方式創(chuàng)建url對(duì)象:1.url(string, string, int, string):構(gòu)造一個(gè)url類,第一個(gè)string類型的參數(shù)是協(xié)議的類型,可以是http,ftp,file等。第二個(gè)string類型參數(shù)是主機(jī)名,int類型參數(shù)是指定端口號(hào),最后一個(gè)參數(shù)是給出文件名或路徑名。2.url(string, strin

13、g, string):構(gòu)造一個(gè)url類,參數(shù)含義與上相同,使用缺省端口號(hào)。3.url(url, string):構(gòu)造一個(gè)url類,使用給出的url和相對(duì)路徑,string類型參數(shù)是相對(duì)路徑。4.url(string):使用url字符串構(gòu)造一個(gè)url類。當(dāng)創(chuàng)建url時(shí)發(fā)生錯(cuò)誤,系統(tǒng)會(huì)產(chǎn)生異常malformedurlexception,這是非運(yùn)行時(shí)異常,必須在程序中捕獲處理。 11.2.2 獲取獲取url對(duì)象的屬性對(duì)象的屬性一個(gè)url對(duì)象生成后,其屬性是不能被改變的,但可以通過它給定的方法來獲取這些屬性:public string getprotocol():獲取該url的協(xié)議名public st

14、ring gethost() :獲取該url的主機(jī)名public string getport() :獲取該url的端口號(hào)public string getpath() :獲取該url的文件路徑public string getfile() :獲取該url的文件名public string getref() :獲取該url在文件中的相對(duì)位置public string getquery() :獲取該url的查詢名public string toexternalform():獲取代表url的字符串socket(插座)通信屬于網(wǎng)絡(luò)底層通信。socket最先應(yīng)用于unix操作系統(tǒng),如果了解unix系統(tǒng)

15、的輸入/輸出(i/o)的話,就很容易掌握socket,因?yàn)閟ocket數(shù)據(jù)傳輸其實(shí)就是一種特殊的i/o。在傳統(tǒng)的unix環(huán)境下可以操作tcp/ip協(xié)議的接口不止socket一個(gè),socket所支持的協(xié)議種類也不光tcp/ip一種,因此兩者之間是沒有必然聯(lián)系的。在java環(huán)境下,socket編程主要是指基于tcp/ip協(xié)議的網(wǎng)絡(luò)編程。在java中可以將socket類和serversocket類分別用于client端和server端,在任意兩臺(tái)機(jī)器間建立連接。 11.4.1 socket與與serversocket類類網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)

16、socket。socket通常用來實(shí)現(xiàn)客戶方和服務(wù)方的連接。socket是tcp/ip協(xié)議的一個(gè)十分流行的編程界面,一個(gè)socket由一個(gè)ip地址和一個(gè)端口號(hào)唯一確定。盡管socket編程是低層次網(wǎng)絡(luò)編程但并不等于它功能不強(qiáng)大,恰恰相反,正因?yàn)閷哟蔚?,socket編程比基于url的網(wǎng)絡(luò)編程提供了更強(qiáng)大的功能和更靈活的控制,但是卻要更復(fù)雜一些。java在包中提供了兩個(gè)類:socket和serversocket,分別用來表示雙向連接的客戶端和服務(wù)端。這是兩個(gè)封裝得非常好的類,使用很方便。 11.4.2 socket通信通信socket通常用來實(shí)現(xiàn)c/s結(jié)構(gòu)。使用socket進(jìn)行client/ser

17、ver程序設(shè)計(jì)的一般連接過程是這樣的:server端listen(監(jiān)聽)某個(gè)端口是否有連接請(qǐng)求,client端向server端發(fā)出connect(連接)請(qǐng)求,server端向client端發(fā)回accept(接受)消息,一個(gè)連接就建立起來了。server端和client端都可以通過send,write等方法與對(duì)方通信。進(jìn)行socket通信,需要完成三個(gè)部分的工作:1.建立服務(wù)器類在服務(wù)器端,用java中的服務(wù)器類serversocket,使用端口號(hào)作為參數(shù)來創(chuàng)建服務(wù)器對(duì)象。例如:serversocket server = new serversocket(2000)這條語句創(chuàng)建了一個(gè)服務(wù)器對(duì)象,

18、這個(gè)服務(wù)器使用2000號(hào)端口。當(dāng)一個(gè)客戶端程序建立一個(gè)socket連接,所連接的端口號(hào)為2000時(shí),服務(wù)器對(duì)象server便響應(yīng)這個(gè)連接。11.4.2 socket通信通信接下來用server.accept()方法創(chuàng)建一個(gè)socket對(duì)象。服務(wù)器端便可以利用這個(gè)socket對(duì)象與客戶端進(jìn)行通訊。例如:socket incoming = server.accept()緊接著用下面語句得到輸入流和輸出流,并進(jìn)行封裝:bufferedreader in =new bufferedreader(new inputstreamreader(incoming.getinputstream();printw

19、riter out = new printwriter(incoming.getoutputstream(),true);隨后,就可以使用in.readline()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發(fā)送數(shù)據(jù)。從而可以根據(jù)程序的需要對(duì)客戶端的不同請(qǐng)求進(jìn)行回應(yīng)。11.4.2 socket通信通信每一個(gè)socket存在時(shí),都將占用一定的資源,在socket對(duì)象使用完畢時(shí),要其關(guān)閉。關(guān)閉socket可以調(diào)用socket的close()方法。在關(guān)閉socket之前,應(yīng)將與socket相關(guān)的所有的輸入/輸出流全部關(guān)閉,以釋放所有的資源。而且要注意關(guān)閉的順序,與socke

20、t相關(guān)的所有的輸入/輸出該首先關(guān)閉,然后再關(guān)閉socket。例如:in.close();out.close();socket.close();11.4.2 socket通信通信2.建立客戶端代碼相比服務(wù)器端,客戶端要簡(jiǎn)單一些,客戶端只需用服務(wù)器所在機(jī)器的ip以及服務(wù)器的端口作為參數(shù)創(chuàng)建一個(gè)socket對(duì)象。得到這個(gè)對(duì)象后,就可以用前面介紹的方法實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出。例如:socket socket = new socket(,2000);in = new bufferedreader(new inputstreamreader(socket.getinputstream(

21、);out = new printwriter(socket.getoutputstream(),true);以上的程序代碼建立了一個(gè)socket對(duì)象,這個(gè)對(duì)象連接到ip地址為的主機(jī)上、端口為2000的服務(wù)器對(duì)象,并且建立了輸入流和輸出流,分別對(duì)應(yīng)服務(wù)器的輸出和客戶端的寫入。11.4.2 socket通信通信3.建立用戶界面大家可以利用前面講解的知識(shí),根據(jù)自己的喜好建立自己的用戶界面。經(jīng)過以上三個(gè)步驟,就可以建立一個(gè)比較簡(jiǎn)單的對(duì)話程序。但是,為了使這個(gè)程序更加完善,應(yīng)將服務(wù)器端的程序變?yōu)槎嗑€程。這樣可以使服務(wù)器為多個(gè)客戶端服務(wù)。數(shù)據(jù)報(bào)是一種無連接的通信方式,它的速度比較快,但是由于不建立連接,不能保證所有數(shù)據(jù)都能送到目的地,所以一般用于傳送非關(guān)鍵性的數(shù)據(jù)。發(fā)送和接收數(shù)據(jù)報(bào)需要使用java類庫(kù)中的datagrampacket類和datagramsocket類。下面分別介紹:1datagrampacket類它是進(jìn)行數(shù)據(jù)報(bào)通信的基本單位,它包含了需要傳送的數(shù)據(jù)、數(shù)據(jù)報(bào)的長(zhǎng)度、ip地址和端口等。datagr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論