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ù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(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ǔ)知識

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

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

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

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

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

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

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

getLocalHost():創(chuàng)建一個InetAddress對象,用來獲取本地主機(jī)的IP地址14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持例14.1InetAddress類使用實例14.1.2網(wǎng)絡(luò)編程的基本網(wǎng)絡(luò)支持程序運行結(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中指定的端口號。如果在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ò)支持程序運行結(jié)果:(3)URLConnection類

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

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

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

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

port,InetAddress

localAddress,int

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

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

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

(4)ServerSocket(int

port,int

backlog,InetAddress

bindAddress):創(chuàng)建隊列長度為backlog并指定到本地IP地址、指定到特定端口的服務(wù)器套接字。這種情況適用于計算機(jī)有多個IP地址的情況14.2.2TCP網(wǎng)絡(luò)編程的服務(wù)器端ServerSocket類提供的常用方法有以下幾種:(1)accept():返回與服務(wù)器端建立連接的套接字(2)bind():設(shè)置服務(wù)器端Socket與特定端口綁定(3)listen():監(jiān)聽來自客戶端的連接請求(4)getLoalPort():返回服務(wù)器所綁定的端口號(5)getInetAddress():返回套接字鏈接的地址對象(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()方法,將返回一個與客戶端Socket對象相連接的Socket對象,服務(wù)器端的Socket對象使用getOutputStream()方法獲得的輸出流對象,將會指向客戶端Socket對象使用getInputStream()方法獲得的輸入流對象;類似的,服務(wù)器端的Socket對象使用getInputStream()方法獲得的輸入流對象,將會指向客戶端Socket對象使用getOutputStream()方法獲得的輸出流對象。即當(dāng)服務(wù)器向輸出流寫入信息時,客戶端通過相應(yīng)的輸入流就能讀取到數(shù)據(jù);當(dāng)客戶端向輸出流寫入信息時,服務(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ò)上的兩個進(jìn)程采用C/S模式進(jìn)行通信,當(dāng)兩臺主機(jī)準(zhǔn)備進(jìn)行交談時,都必須建立一個Socket,其中一方作為服務(wù)器打開一個Socket并監(jiān)聽來自網(wǎng)絡(luò)的連接請求,另一方作為客戶端,它向網(wǎng)路上的服務(wù)器發(fā)送請求,通過Socket向服務(wù)器傳遞信息,要建立連接,只需指定主機(jī)的IP地址和端口號即可。14.2.3基于TCP協(xié)議的Socket編程示例圖14-2是一個典型的面向連接的Socket通信機(jī)制的示意圖14.2.3基于TCP協(xié)議的Socket編程示例圖14-2基于連接的服務(wù)器、客戶端流程圖程序首先由服務(wù)器方建立Socket并將該Socket聯(lián)編到某個端口,并進(jìn)入監(jiān)聽狀態(tài),同時監(jiān)聽是否有與自己端口相對應(yīng)的連接請求。連接是由客戶端發(fā)出的,客戶端在建立自己的Socket后,向服務(wù)器發(fā)出連接請求,服務(wù)器在檢測到連接后接收連接,這樣就建立起了一個完整的Socket連接。從圖14-2可以看出,服務(wù)器端必須首先啟動,然后守候在某一個端口上監(jiān)聽客戶端的連接請求,一旦連接建立,就可以像普通流程機(jī)制那樣進(jìn)行讀/寫,只需調(diào)用close()即可結(jié)束Socket連接。通過該方式建立起來的C/S程序即可實現(xiàn)一臺服務(wù)器和一臺客戶端的通信。14.2.3基于TCP協(xié)議的Socket編程示例例14.3實現(xiàn)客戶端與服務(wù)器端一對一的聊天程序

(1)客戶端程序14.2.3基于TCP協(xié)議的Socket編程示例(2)服務(wù)器端程序14.2.3基于TCP協(xié)議的Socket編程示例運行程序時一定要先啟動服務(wù)器端的程序,讓服務(wù)器監(jiān)聽來自客戶端的請求,此時服務(wù)器端顯示“等待連接….”,一旦運行客戶端的程序后,服務(wù)器端會提示“連接成功!!!”。然后客戶端就可以向服務(wù)器發(fā)送消息,服務(wù)器也可以向客戶端反饋消息,實現(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ā)短信這種通訊方式,使用該種方式無需建立專用的虛擬連接,由于無需建立專用的連接,所以對于服務(wù)器的壓力要比TCP小很多,所以也是一種常見的網(wǎng)絡(luò)編程方式。它在通信實例的兩端各建立一個Socket,但這兩個Socket之間并沒有虛擬鏈路,這兩個Socket只是發(fā)送、接受數(shù)據(jù)報的對象。Java提供了DatagramSocket對象最為基于UDP協(xié)議的Socket,使用DatagramPacket代表DatagramSocket發(fā)送、接受的數(shù)據(jù)報。14.3基于UDP協(xié)議的網(wǎng)絡(luò)編程Java使用DatagramSocket代表UDP協(xié)議的Socket。DatagramSocket類實現(xiàn)“網(wǎng)絡(luò)連接”,包括客戶端網(wǎng)絡(luò)連接和服務(wù)器端網(wǎng)絡(luò)連接。雖然UDP方式的網(wǎng)絡(luò)通訊不需要建立專用的網(wǎng)絡(luò)連接,但是畢竟還是需要發(fā)送和接收數(shù)據(jù),DatagramSocket實現(xiàn)的就是發(fā)送數(shù)據(jù)時的發(fā)射器,以及接收數(shù)據(jù)時的監(jiān)聽器的角色。14.3.1DatagramSocket類DatagramSocket的包含如下三個構(gòu)造函數(shù):(1)DatagramSocket():創(chuàng)建一個DatagramSocket實例,并將該對象綁定到本機(jī)默IP地址、本機(jī)所有可用端口中隨機(jī)選擇的某個端口。(2)DatagramSocket(int

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

port,InetAddress

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

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

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

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

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

length,InetAddress

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

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

offset,int

length,InetAddress

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

InetAddress

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

溫馨提示

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

最新文檔

評論

0/150

提交評論