Java編程基礎(chǔ)及應(yīng)用Java網(wǎng)絡(luò)編程_第1頁
Java編程基礎(chǔ)及應(yīng)用Java網(wǎng)絡(luò)編程_第2頁
Java編程基礎(chǔ)及應(yīng)用Java網(wǎng)絡(luò)編程_第3頁
Java編程基礎(chǔ)及應(yīng)用Java網(wǎng)絡(luò)編程_第4頁
Java編程基礎(chǔ)及應(yīng)用Java網(wǎng)絡(luò)編程_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第十四章Java網(wǎng)絡(luò)編程14.1網(wǎng)絡(luò)編程基礎(chǔ)

14.2基于TCP協(xié)議的Socket編程14.3基于UDP協(xié)議的網(wǎng)絡(luò)編程14.4本章小結(jié)第十四章Java網(wǎng)絡(luò)編程14.1網(wǎng)絡(luò)編程基礎(chǔ)

14.2基于TCP協(xié)議的Socket編程14.3基于UDP協(xié)議的網(wǎng)絡(luò)編程14.4本章小結(jié)14.1網(wǎng)絡(luò)編程基礎(chǔ)14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)

(1)網(wǎng)絡(luò)的分層模型(2)IP地址、域名和端口(3)協(xié)議(4)Socket(套接字)14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持(1)

InetAddress類(2)URL類(3)URLConnection類14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)(1)網(wǎng)絡(luò)的分層模型在計(jì)算機(jī)網(wǎng)絡(luò)發(fā)展歷程中出現(xiàn)過幾種不同的分層模型,分別適合于某種網(wǎng)絡(luò)的需要。本章采用適合Internet標(biāo)準(zhǔn)的TCP/IP四層模型。TCP/IP四層模型如圖14-1所示:圖14-1

TCP/IP四層模型網(wǎng)絡(luò)接口層:相當(dāng)于OSI參考模型中的物理層和數(shù)據(jù)鏈路層。定義了物理介質(zhì)的各種特性,負(fù)責(zé)接收IP數(shù)據(jù)包并封裝成物理幀通過網(wǎng)絡(luò)發(fā)送給接收方,或者從網(wǎng)絡(luò)上接收來自接收方的物理幀,拆封得到IP數(shù)據(jù)包交給網(wǎng)際層。網(wǎng)際層:負(fù)責(zé)相鄰計(jì)算機(jī)之間的通信。其功能包括三個(gè)方面:處理來自傳輸層的分組發(fā)送請(qǐng)求;處理輸入的數(shù)據(jù)報(bào);處理流量控制和網(wǎng)絡(luò)擁塞問題,選擇要到達(dá)目的主機(jī)的路徑。傳輸層:提供應(yīng)用程序間的通信。其功能包括:格式化信息流;提供可靠傳輸。應(yīng)用層:向用戶提供一組常用的應(yīng)用程序,比如遠(yuǎn)程登錄、電子郵件傳輸、文件傳輸訪問等。14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)(2)IP地址、域名和端口為了能夠方便地識(shí)別網(wǎng)絡(luò)上的每個(gè)設(shè)備,網(wǎng)絡(luò)中的每個(gè)設(shè)備都會(huì)有一個(gè)唯一的數(shù)字標(biāo)識(shí),這個(gè)就是IP地址。在計(jì)算機(jī)網(wǎng)絡(luò)中,現(xiàn)在普遍使用的命名IP地址的規(guī)定是IPv4協(xié)議,該協(xié)議規(guī)定每個(gè)IP地址由4個(gè)0-255之間的數(shù)字組成,例如4。每個(gè)接入網(wǎng)絡(luò)的計(jì)算機(jī)都擁有唯一的IP地址。14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)由于IP地址不容易記憶,所以為了方便記憶,又創(chuàng)造了另外一個(gè)概念——域名(DomainName),例如等。在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù),全部是以IP地址作為地址標(biāo)識(shí),所以在實(shí)際傳輸數(shù)據(jù)以前需要將域名轉(zhuǎn)換為IP地址,也就是域名解析,實(shí)現(xiàn)這種功能的服務(wù)器稱之為DNS服務(wù)器(域名服務(wù)器)。例如當(dāng)用戶在瀏覽器輸入域名時(shí),瀏覽器首先請(qǐng)求DNS服務(wù)器,將域名轉(zhuǎn)換為IP地址,然后將轉(zhuǎn)換后的IP地址反饋給瀏覽器,然后再進(jìn)行實(shí)際的數(shù)據(jù)傳輸。14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)雖然IP地址和域名很好地解決了在網(wǎng)絡(luò)中找到一個(gè)計(jì)算機(jī)的問題,但是為了讓一臺(tái)計(jì)算機(jī)可以同時(shí)運(yùn)行多個(gè)網(wǎng)絡(luò)程序,就要用到端口(port)。在同一臺(tái)計(jì)算機(jī)中每個(gè)程序?qū)?yīng)唯一的端口,這樣一臺(tái)計(jì)算機(jī)上就可以通過端口區(qū)分發(fā)送給每個(gè)端口的數(shù)據(jù)了,換句話說,也就是一臺(tái)計(jì)算機(jī)上可以并發(fā)運(yùn)行多個(gè)網(wǎng)絡(luò)程序,而且互相之間不會(huì)產(chǎn)生干擾。14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)(3)協(xié)議

下面看一個(gè)簡單的例子,以幫助理解網(wǎng)絡(luò)協(xié)議。春節(jié)晚會(huì)上“小沈陽”和趙本山合作的小品《不差錢》中,小沈陽和趙本山之間就設(shè)計(jì)了一個(gè)協(xié)議,協(xié)議的內(nèi)容為:如果點(diǎn)的菜價(jià)錢比較貴,就說沒有。按照該協(xié)議的規(guī)定,就有了下面的對(duì)話:趙本山:4斤的龍蝦小沈陽:(經(jīng)過判斷,得出價(jià)格比較高),沒有

趙本山:鮑魚小沈陽:(經(jīng)過判斷,得出價(jià)格比較高),沒有這就是一種雙方達(dá)成的協(xié)議約定,其實(shí)這種約定的實(shí)質(zhì)和網(wǎng)絡(luò)協(xié)議的實(shí)質(zhì)是一樣的。網(wǎng)絡(luò)協(xié)議的實(shí)質(zhì)就是客戶端程序和服務(wù)器端程序?qū)τ跀?shù)據(jù)格式的一種約定,只是由于以計(jì)算機(jī)為基礎(chǔ),所以更多的是使用數(shù)字來代表內(nèi)容,這樣就顯得比較抽象。14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)在TCP/IP協(xié)議簇中,有兩個(gè)高級(jí)協(xié)議:傳輸控制協(xié)議TCP(TransmissionControlProtocol)和用戶數(shù)據(jù)報(bào)協(xié)議UDP(UserDatagramProtocol)。TCP協(xié)議是一種面向連接的協(xié)議,它實(shí)現(xiàn)了兩臺(tái)計(jì)算機(jī)間的可靠數(shù)據(jù)傳輸。TCP可以保證數(shù)據(jù)能正確地從一端送至連接的另一端,而且接收端收到的數(shù)據(jù)排列順序和送出時(shí)的順序相同,因此,TCP協(xié)議適合用于可靠性要求較高的場(chǎng)合。UDP協(xié)議是無連接通信協(xié)議,不能保證數(shù)據(jù)的可靠傳輸,但是UDP能夠以獨(dú)立發(fā)送數(shù)據(jù)包的方式向若干個(gè)目標(biāo)發(fā)送數(shù)據(jù)。UDP協(xié)議適合用于一些對(duì)數(shù)據(jù)準(zhǔn)確性要求不高的場(chǎng)合,如網(wǎng)絡(luò)聊天室等。14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)(4)Socket(套接字)

應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí),TCP和UDP會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過同一個(gè)TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進(jìn)程或TCP連接,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP,UDP協(xié)議交互提供了稱為套接字(socket)的接口。在網(wǎng)絡(luò)上,一個(gè)套接字由一個(gè)IP地址和一個(gè)端口號(hào)唯一確定。IP地址的作用是讓通信包到達(dá)計(jì)算機(jī),端口是用來確定哪個(gè)應(yīng)用程序接收此信息。14.1.1網(wǎng)絡(luò)基礎(chǔ)知識(shí)(1)

InetAddress類Internet上的計(jì)算機(jī)有兩種表示地址的方式:域名和IP地址。在應(yīng)用程序編寫過程中,有時(shí)需要通過域名來查找它對(duì)應(yīng)的IP地址,有時(shí)需要通過IP地址來查找主機(jī)名或域名。在這些情況下,可以利用包中的InetAddress類來完成任務(wù)。14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持該類常用的一些方法如下:(1)publicstaticInetAddress

getByName(Stringhostname):根據(jù)給定的主機(jī)名hostname創(chuàng)建一個(gè)InetAddress對(duì)象,可用來查找該主機(jī)的IP地址(2)publicstaticInetAddress

getByAddress(byte[]addre):根據(jù)給定的IP地址addre創(chuàng)建一個(gè)InetAddress對(duì)象,可用來查找該IP地址對(duì)應(yīng)的主機(jī)名(3)publicStringgetHostAddress():獲取InetAddress對(duì)象所含的IP地址(4)publicStringgetHostName():獲取主機(jī)名(5)publicstaticInetAddress

getLocalHost():創(chuàng)建一個(gè)InetAddress對(duì)象,用來獲取本地主機(jī)的IP地址14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持例14.1InetAddress類使用實(shí)例14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持程序運(yùn)行結(jié)果(2)URL類

URL類代表統(tǒng)一資源定位符,它是指向互聯(lián)網(wǎng)“資源”的指針,也是Java網(wǎng)絡(luò)程序中用于定位和獲取網(wǎng)絡(luò)數(shù)據(jù)的最簡單的方法。URL的構(gòu)造方法如下:1、publicURL(Stringurl)2、publicURL(Stringprotocol,Stringhostname,Stringfile)3、PublicURL(URLbase,Stringrelative_addr)

14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持使用URL類可以通過以下方法獲?。海?)publicStringgetProtocol():以字符串的格式返回URL中協(xié)議部分的內(nèi)容,如“http”或“file”(2)publicStringgetHost():以字符串的格式返回URL主機(jī)名部分的內(nèi)容(3)publicint

getPort():以整型格式返回URL中指定的端口號(hào)。如果在URL中沒有指定端口,使用getPort()方法返回-1,表示該URL沒有顯式地指定端口,將使用該協(xié)議的默認(rèn)端口。(4)publicStringgetFile():以字符串的格式返回URL中的文件部分。

(5)publicStringgetPath():以字符串格式返回URL中的路徑和文件部分,但是與getFile()方法不同的是,getPath()方法返回的字符串中不包括查詢字符串

14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持例14.2URL類的基本用法示例14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持程序運(yùn)行結(jié)果:(3)URLConnection類

URLConnection是一個(gè)抽象類,代表與URL指定的數(shù)據(jù)源的動(dòng)態(tài)連接。URLConnection類提供比URL類更強(qiáng)的服務(wù)器(特別是HTTP服務(wù)器)交互控制,通過URLConnection,可以查看服務(wù)器發(fā)送的響應(yīng)的首部;URLConnection允許用POST或PUT和其他HTTP請(qǐng)求方法將數(shù)據(jù)送回服務(wù)器。14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持使用URLConnection對(duì)象的一般步驟為:

(1)創(chuàng)建一個(gè)URL對(duì)象(2)調(diào)用URL對(duì)象的openConnection()方法創(chuàng)建URL的URLConnection對(duì)象(3)配置URLConnection對(duì)象(4)讀取首部字段(5)獲取輸入流并讀取數(shù)據(jù)(6)獲取輸出流并寫入數(shù)據(jù)(7)關(guān)閉連接14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持第十四章Java網(wǎng)絡(luò)編程14.1網(wǎng)絡(luò)編程基礎(chǔ)

14.2基于TCP協(xié)議的Socket編程14.3基于UDP協(xié)議的網(wǎng)絡(luò)編程14.4本章小結(jié)14.2.1TCP網(wǎng)絡(luò)編程的客戶端14.2.2TCP網(wǎng)絡(luò)編程的服務(wù)器端14.2.3基于TCP協(xié)議的Socket編程示例14.2基于TCP協(xié)議的Socket編程

TCP方式的網(wǎng)絡(luò)通訊是指在通訊的過程中保持連接,有點(diǎn)類似于打電話,只需要撥打一次號(hào)碼(建立一次網(wǎng)絡(luò)連接),就可以多次通話(多次傳輸數(shù)據(jù))。對(duì)于超出URL類所提供的聯(lián)網(wǎng)應(yīng)用程序,在Java語言中提供了套接字類(Socket)和服務(wù)器套接字類(ServerSocket)對(duì)TCP方式的網(wǎng)絡(luò)編程提供良好的支持。在進(jìn)行網(wǎng)絡(luò)編程時(shí),底層網(wǎng)絡(luò)通訊的細(xì)節(jié)已經(jīng)實(shí)現(xiàn)了比較高的封裝,所以在程序員實(shí)際編程時(shí),只需要指定IP地址和端口號(hào)碼就可以建立連接了。正是Java語言這種高度的封裝,簡化了其進(jìn)行網(wǎng)絡(luò)編程的難度。14.2基于TCP協(xié)議的Socket編程

在Java語言中,對(duì)于TCP方式的網(wǎng)絡(luò)編程,客戶端通常使用Socket類,其工作過程包含以下五個(gè)基本步驟:

(1)用構(gòu)造函數(shù)創(chuàng)建一個(gè)Socket對(duì)象;(2)Socket對(duì)象嘗試連接到遠(yuǎn)程主機(jī);(3)一旦建立了連接,打開連接到Socket對(duì)象的輸入流/輸出流;(4)按照一定的協(xié)議對(duì)Socket對(duì)象進(jìn)行讀/寫操作;(5)當(dāng)數(shù)據(jù)傳輸完畢后,關(guān)閉連接。14.2.1TCP網(wǎng)絡(luò)編程的客戶端Socket類通??梢允褂萌缦聝蓚€(gè)構(gòu)造函數(shù):Socket(InetAddress/StringremoteAddress,intport):創(chuàng)建連接到指定遠(yuǎn)程主機(jī)、遠(yuǎn)程端口的Socket對(duì)象,該構(gòu)造函數(shù)沒有指定本地地址、本地端口,默認(rèn)使用本地主機(jī)的默認(rèn)IP地址和系統(tǒng)動(dòng)態(tài)分配的端口。Socket(InetAddress/StringremoteAddress,int

port,InetAddress

localAddress,int

localport):創(chuàng)建連接到指定遠(yuǎn)程主機(jī)、遠(yuǎn)程端口的Socket對(duì)象,并指定本地IP地址和本地端口,適用于本地主機(jī)有多個(gè)IP地址的情形。14.2.1TCP網(wǎng)絡(luò)編程的客戶端Socket類提供的常用方法有以下幾種:

(1)getLocalAddress():返回本地主機(jī)的地址對(duì)象(2)getLoaclPort():返回本地主機(jī)的地址端口號(hào)(3)getInetAddress():返回此套接字連接的地址對(duì)象(4)getPort():返回此套接字鏈接地址的端口(5)getInputStream():返回此套接字鏈接地址的輸入流(6)getOutputStream():返回此套接字鏈接地址的輸出流(7)toString():返回套接字字符串(8)close():關(guān)閉套接字

14.2.1TCP網(wǎng)絡(luò)編程的客戶端在Java語言中,對(duì)于TCP方式的網(wǎng)絡(luò)編程,服務(wù)器端通常使用ServerSocket類,其主要功能是等待來自網(wǎng)絡(luò)上的“請(qǐng)求”,它可以通過指定的端口來等待連接的套接字。服務(wù)器套接字一次可以與一個(gè)套接字連接,如果多臺(tái)客戶機(jī)同時(shí)提出連接請(qǐng)求,服務(wù)器套接字會(huì)將請(qǐng)求連接的客戶機(jī)存入隊(duì)列中,然后從中取出一個(gè)套接字,與服務(wù)器新建的套接字連接起來。若請(qǐng)求連接的客戶機(jī)數(shù)量大于最大容納數(shù),則多出的連接請(qǐng)求被拒絕。14.2.2TCP網(wǎng)絡(luò)編程的服務(wù)器端ServerSocket類的工作過程包含以下六個(gè)基本步驟:(1)用構(gòu)造函數(shù)創(chuàng)建一個(gè)ServerSocket對(duì)象;(2)ServerSocket對(duì)象使用其accept()方法監(jiān)聽此端口的入站連接。Accept()方法會(huì)一直阻塞,直到客戶端嘗試進(jìn)行連接,這時(shí)accept()將返回一個(gè)連接客戶端和服務(wù)器的Socket對(duì)象;(3)根據(jù)服務(wù)類型,調(diào)用Socket的getInputStream()方法或getOutputStream()方法,或者這兩個(gè)方法都調(diào)用,以獲得與客戶端通信的輸入流或輸出流;(4)按照一定的協(xié)議對(duì)Socket對(duì)象進(jìn)行讀/寫操作;(5)服務(wù)器或客戶端(或兩者)關(guān)閉連接;(6)服務(wù)器返回到步驟(2),等待下一次連接。14.2.2TCP網(wǎng)絡(luò)編程的服務(wù)器端ServerSocket類的構(gòu)造函數(shù)有以下幾種:

(1)ServerSocket():創(chuàng)建非指定的服務(wù)器套接字

(2)ServerSocket(int

port):創(chuàng)建指定到特定端口的服務(wù)器套接字

(3)ServerSocket(int

port,intbacklog):創(chuàng)建隊(duì)列長度為backlog并指定到特定端口的服務(wù)器套接字

(4)ServerSocket(int

port,int

backlog,InetAddress

bindAddress):創(chuàng)建隊(duì)列長度為backlog并指定到本地IP地址、指定到特定端口的服務(wù)器套接字。這種情況適用于計(jì)算機(jī)有多個(gè)IP地址的情況14.2.2TCP網(wǎng)絡(luò)編程的服務(wù)器端ServerSocket類提供的常用方法有以下幾種:(1)accept():返回與服務(wù)器端建立連接的套接字(2)bind():設(shè)置服務(wù)器端Socket與特定端口綁定(3)listen():監(jiān)聽來自客戶端的連接請(qǐng)求(4)getLoalPort():返回服務(wù)器所綁定的端口號(hào)(5)getInetAddress():返回套接字鏈接的地址對(duì)象(6)getChannel():返回服務(wù)器套接字通道(7)setSoTimeout(inttimeout):設(shè)置服務(wù)器套接字的有效期限值(8)toString():返回服務(wù)器套接字字符串(9)close():關(guān)閉服務(wù)器套接字

14.2.2TCP網(wǎng)絡(luò)編程的服務(wù)器端服務(wù)器端程序調(diào)用ServerSocket類的accept()方法,將返回一個(gè)與客戶端Socket對(duì)象相連接的Socket對(duì)象,服務(wù)器端的Socket對(duì)象使用getOutputStream()方法獲得的輸出流對(duì)象,將會(huì)指向客戶端Socket對(duì)象使用getInputStream()方法獲得的輸入流對(duì)象;類似的,服務(wù)器端的Socket對(duì)象使用getInputStream()方法獲得的輸入流對(duì)象,將會(huì)指向客戶端Socket對(duì)象使用getOutputStream()方法獲得的輸出流對(duì)象。即當(dāng)服務(wù)器向輸出流寫入信息時(shí),客戶端通過相應(yīng)的輸入流就能讀取到數(shù)據(jù);當(dāng)客戶端向輸出流寫入信息時(shí),服務(wù)器端通過相應(yīng)的輸入流能讀取到數(shù)據(jù)。14.2.2TCP網(wǎng)絡(luò)編程的服務(wù)器端TCP是一種可靠的、基于連接的網(wǎng)絡(luò)協(xié)議,在Internet上大都使用TCP/IP協(xié)議進(jìn)行互聯(lián)。網(wǎng)絡(luò)上的兩個(gè)進(jìn)程采用C/S模式進(jìn)行通信,當(dāng)兩臺(tái)主機(jī)準(zhǔn)備進(jìn)行交談時(shí),都必須建立一個(gè)Socket,其中一方作為服務(wù)器打開一個(gè)Socket并監(jiān)聽來自網(wǎng)絡(luò)的連接請(qǐng)求,另一方作為客戶端,它向網(wǎng)路上的服務(wù)器發(fā)送請(qǐng)求,通過Socket向服務(wù)器傳遞信息,要建立連接,只需指定主機(jī)的IP地址和端口號(hào)即可。14.2.3基于TCP協(xié)議的Socket編程示例圖14-2是一個(gè)典型的面向連接的Socket通信機(jī)制的示意圖14.2.3基于TCP協(xié)議的Socket編程示例圖14-2基于連接的服務(wù)器、客戶端流程圖程序首先由服務(wù)器方建立Socket并將該Socket聯(lián)編到某個(gè)端口,并進(jìn)入監(jiān)聽狀態(tài),同時(shí)監(jiān)聽是否有與自己端口相對(duì)應(yīng)的連接請(qǐng)求。連接是由客戶端發(fā)出的,客戶端在建立自己的Socket后,向服務(wù)器發(fā)出連接請(qǐng)求,服務(wù)器在檢測(cè)到連接后接收連接,這樣就建立起了一個(gè)完整的Socket連接。從圖14-2可以看出,服務(wù)器端必須首先啟動(dòng),然后守候在某一個(gè)端口上監(jiān)聽客戶端的連接請(qǐng)求,一旦連接建立,就可以像普通流程機(jī)制那樣進(jìn)行讀/寫,只需調(diào)用close()即可結(jié)束Socket連接。通過該方式建立起來的C/S程序即可實(shí)現(xiàn)一臺(tái)服務(wù)器和一臺(tái)客戶端的通信。14.2.3基于TCP協(xié)議的Socket編程示例例14.3實(shí)現(xiàn)客戶端與服務(wù)器端一對(duì)一的聊天程序

(1)客戶端程序14.2.3基于TCP協(xié)議的Socket編程示例(2)服務(wù)器端程序14.2.3基于TCP協(xié)議的Socket編程示例運(yùn)行程序時(shí)一定要先啟動(dòng)服務(wù)器端的程序,讓服務(wù)器監(jiān)聽來自客戶端的請(qǐng)求,此時(shí)服務(wù)器端顯示“等待連接….”,一旦運(yùn)行客戶端的程序后,服務(wù)器端會(huì)提示“連接成功!!!”。然后客戶端就可以向服務(wù)器發(fā)送消息,服務(wù)器也可以向客戶端反饋消息,實(shí)現(xiàn)客戶端、服務(wù)器之間的通信。第十四章Java網(wǎng)絡(luò)編程14.1網(wǎng)絡(luò)編程基礎(chǔ)

14.2基于TCP協(xié)議的Socket編程14.3基于UDP協(xié)議的網(wǎng)絡(luò)編程14.4本章小結(jié)14.3.1DatagramSocket類14.3.2DatagramPacket類14.3.3基于UDP協(xié)議的網(wǎng)絡(luò)編程示例14.3基于UDP協(xié)議的網(wǎng)絡(luò)編程UDP協(xié)議是一種不可靠的網(wǎng)絡(luò)協(xié)議,就像發(fā)短信這種通訊方式,使用該種方式無需建立專用的虛擬連接,由于無需建立專用的連接,所以對(duì)于服務(wù)器的壓力要比TCP小很多,所以也是一種常見的網(wǎng)絡(luò)編程方式。它在通信實(shí)例的兩端各建立一個(gè)Socket,但這兩個(gè)Socket之間并沒有虛擬鏈路,這兩個(gè)Socket只是發(fā)送、接受數(shù)據(jù)報(bào)的對(duì)象。Java提供了DatagramSocket對(duì)象最為基于UDP協(xié)議的Socket,使用DatagramPacket代表DatagramSocket發(fā)送、接受的數(shù)據(jù)報(bào)。14.3基于UDP協(xié)議的網(wǎng)絡(luò)編程Java使用DatagramSocket代表UDP協(xié)議的Socket。DatagramSocket類實(shí)現(xiàn)“網(wǎng)絡(luò)連接”,包括客戶端網(wǎng)絡(luò)連接和服務(wù)器端網(wǎng)絡(luò)連接。雖然UDP方式的網(wǎng)絡(luò)通訊不需要建立專用的網(wǎng)絡(luò)連接,但是畢竟還是需要發(fā)送和接收數(shù)據(jù),DatagramSocket實(shí)現(xiàn)的就是發(fā)送數(shù)據(jù)時(shí)的發(fā)射器,以及接收數(shù)據(jù)時(shí)的監(jiān)聽器的角色。14.3.1DatagramSocket類DatagramSocket的包含如下三個(gè)構(gòu)造函數(shù):(1)DatagramSocket():創(chuàng)建一個(gè)DatagramSocket實(shí)例,并將該對(duì)象綁定到本機(jī)默IP地址、本機(jī)所有可用端口中隨機(jī)選擇的某個(gè)端口。(2)DatagramSocket(int

port):創(chuàng)建一個(gè)DatagramSocket實(shí)例,并將該對(duì)象綁定到本機(jī)默認(rèn)IP地址、指定端口。(3)DatagramSocket(int

port,InetAddress

laddr):創(chuàng)建一個(gè)DatagramSocket實(shí)例,并將該對(duì)象綁定到指定IP地址、指定端口。14.3.1DatagramSocket類一旦得到了DatagramSocket實(shí)例之后,就可以通過如下兩個(gè)方法來接收和發(fā)送數(shù)據(jù)。(1)receive(DatagramPacket

p):從DatagramSocket中接收數(shù)據(jù)報(bào)(2)send(DatagramPacket

p):以該DatagramSocket對(duì)象向外發(fā)送數(shù)據(jù)報(bào)。

從上面兩個(gè)方法可以看出,使用DatagramSocket發(fā)送數(shù)據(jù)報(bào)時(shí),DatagramSocket并不知道將該數(shù)據(jù)報(bào)發(fā)送到哪里,而是由DatagramPacket自身決定數(shù)據(jù)報(bào)的目的地。14.3.1DatagramSocket類Java中使用DatagramPacket類實(shí)現(xiàn)對(duì)于網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)封裝,也就是說,該類的對(duì)象代表網(wǎng)絡(luò)中交換的數(shù)據(jù)。在UDP方式的網(wǎng)絡(luò)編程中,無論是需要發(fā)送的數(shù)據(jù)還是需要接收的數(shù)據(jù),都必須被處理成DatagramPacket類型的對(duì)象,該對(duì)象中包含發(fā)送到的地址、發(fā)送到的端口號(hào)以及發(fā)送的內(nèi)容等。在接收數(shù)據(jù)時(shí),接收到的數(shù)據(jù)被處理成DatagramPacket類型的對(duì)象,在該對(duì)象中包含發(fā)送方的地址、端口號(hào)等信息,也包含數(shù)據(jù)的內(nèi)容。14.3.2DatagramPacket類DatagramPacket類包含如下的構(gòu)造函數(shù):(1)

DatagramPacket(byte[]buf,intlength):以一個(gè)空數(shù)組來創(chuàng)建DatagramPackket對(duì)象,該對(duì)象的作用是接收DatagramSocket中的數(shù)據(jù)。(2)DatagramPacket(byte[]buf,int

length,InetAddress

addr,intport):以一個(gè)包含數(shù)據(jù)的數(shù)組來創(chuàng)建DatagramPacket對(duì)象,創(chuàng)建該DatagramPacket對(duì)象時(shí)還指定了IP地址和端口——這就決定了該數(shù)據(jù)報(bào)的目的地。(3)DatagramPacket(byte[]buf,int

offset,intlength):以一個(gè)空數(shù)組來創(chuàng)建DatagramPacket對(duì)象,并指定接收到的數(shù)據(jù)放入buf數(shù)組中時(shí)從offset開始,最多放length個(gè)字節(jié)。(4)DatagramPacket(byte[]buf,int

offset,int

length,InetAddress

addr,intport):創(chuàng)建一個(gè)用于發(fā)送的DatagramPacket對(duì)象,指定發(fā)送buf數(shù)組中從offset開始,總共length個(gè)字節(jié)。14.3.2DatagramPacket類在接收數(shù)據(jù)之前,應(yīng)該采用上面的第一個(gè)或第三個(gè)構(gòu)造函數(shù)生成一個(gè)DatagramPacket對(duì)象,給出接收數(shù)據(jù)的字節(jié)數(shù)組及其長度。然后調(diào)用DatagramSocket的receive()方法等待數(shù)據(jù)報(bào)的到來,receive()將一直等待,直到收到一個(gè)數(shù)據(jù)報(bào)為止。在發(fā)送數(shù)據(jù)之前,調(diào)用第二個(gè)或第四個(gè)構(gòu)造函數(shù)創(chuàng)建DatagramPacket對(duì)象,此時(shí)的字節(jié)數(shù)組里存放了想要發(fā)送的數(shù)據(jù)。除此之外,還要給出完整的目的地址,包括IP地址和端口號(hào)。發(fā)送數(shù)據(jù)是通過DatagramSocket的send()方法實(shí)現(xiàn)的,send()方法根據(jù)數(shù)據(jù)報(bào)的目的地址來尋找路徑以傳送數(shù)據(jù)報(bào)。14.3.2DatagramPacket類當(dāng)服務(wù)器端(或客戶端)接收到一個(gè)DatagramPacket對(duì)象后,如果想要向該數(shù)據(jù)報(bào)的發(fā)送者反饋一些信息,但是由于UDP協(xié)議是面向非連接的,所以接收者并不知道每個(gè)數(shù)據(jù)報(bào)由誰發(fā)送過來,但程序可以調(diào)用DatagramPacket的如下3個(gè)方法來獲取發(fā)送者的IP地址和端口。(1)

InetAddress

getAddress():當(dāng)程序準(zhǔn)備發(fā)送此數(shù)據(jù)時(shí),該方法返回此數(shù)據(jù)報(bào)的目標(biāo)機(jī)器的IP地址;當(dāng)程序剛接收到1個(gè)數(shù)據(jù)報(bào)時(shí),該方法返回該數(shù)據(jù)報(bào)的發(fā)送主機(jī)的IP地址。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論