Java套接字編程(下)(1)
發(fā)表時(shí)間:2023-08-23 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]自尋址套接字(Datagram Sockets) ,因?yàn)槭褂昧魈捉幼值拿總(gè)連接均要花費(fèi)一定的時(shí)間,要減少這種開(kāi)銷(xiāo),網(wǎng)絡(luò)API提供了第二種套接字:自尋址套接字(datagram socket),自...
自尋址套接字(Datagram Sockets)
,因?yàn)槭褂昧魈捉幼值拿總(gè)連接均要花費(fèi)一定的時(shí)間,要減少這種開(kāi)銷(xiāo),網(wǎng)絡(luò)API提供了第二種套接字:自尋址套接字(datagram socket),自尋址使用UDP發(fā)送尋址信息(從客戶(hù)程序到服務(wù)程序或從服務(wù)程序到客戶(hù)程序),不同的是可以通過(guò)自尋址套接字發(fā)送多IP信息包,自尋址信息包含在自尋址包中,此外自尋址包又包含在IP包內(nèi),這就將尋址信息長(zhǎng)度限制在60000字節(jié)內(nèi)。圖2顯示了位于IP包內(nèi)的自尋址包的自尋址信息。
與TCP保證信息到達(dá)信息目的地的方式不同,UDP提供了另外一種方法,如果自尋址信息包沒(méi)有到達(dá)目的地,,那么UDP也不會(huì)請(qǐng)求發(fā)送者重新發(fā)送自尋址包,這是因?yàn)閁DP在每一個(gè)自尋址包中包含了錯(cuò)誤檢測(cè)信息,在每個(gè)自尋址包到達(dá)目的地之后UDP只進(jìn)行簡(jiǎn)單的錯(cuò)誤檢查,如果檢測(cè)失敗,UDP將拋棄這個(gè)自尋址包,也不會(huì)從發(fā)送者那里重新請(qǐng)求替代者,這與通過(guò)郵局發(fā)送信件相似,發(fā)信人在發(fā)信之前不需要與收信人建立連接,同樣也不能保證信件能到達(dá)收信人那里
自尋址套接字工作包括下面三個(gè)類(lèi):DatagramPacket, DatagramSocket,和 MulticastSocket。DatagramPacket對(duì)象描繪了自尋址包的地址信息,DatagramSocket表示客戶(hù)程序和服務(wù)程序自尋址套接字,MulticastSocket描繪了能進(jìn)行多點(diǎn)傳送的自尋址套接字,這三個(gè)類(lèi)均位于java.net包內(nèi)。
DatagramPacket類(lèi)
在使用自尋址包之前,你需要首先熟悉DatagramPacket類(lèi),地址信息和自尋址包以字節(jié)數(shù)組的方式同時(shí)壓縮入這個(gè)類(lèi)創(chuàng)建的對(duì)象中
DatagramPacket有數(shù)個(gè)構(gòu)造函數(shù),即使這些構(gòu)造函數(shù)的形式不同,但通常情況下他們都有兩個(gè)共同的參數(shù):byte [] buffer 和 int length,buffer參數(shù)包含了一個(gè)對(duì)保存自尋址數(shù)據(jù)包信息的字節(jié)數(shù)組的引用,length表示字節(jié)數(shù)組的長(zhǎng)度。
最簡(jiǎn)單的構(gòu)造函數(shù)是DatagramPacket(byte [] buffer, int length),這個(gè)構(gòu)造函數(shù)確定了自尋址數(shù)據(jù)包數(shù)組和數(shù)組的長(zhǎng)度,但沒(méi)有任何自尋址數(shù)據(jù)包的地址和端口信息,這些信息可以后面通過(guò)調(diào)用方法setAddress(InetAddress addr)和setPort(int port)添加上,下面的代碼示范了這些函數(shù)和方法。
byte [] buffer = new byte [100];
DatagramPacket dgp = new DatagramPacket (buffer, buffer.length);
InetAddress ia = InetAddress.getByName ("www.disney.com");
dgp.setAddress (ia);
dgp.setPort (6000); // Send datagram packet to port 6000.
如果你更喜歡在調(diào)用構(gòu)造函數(shù)的時(shí)候同時(shí)包括地址和端口號(hào),可以使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port)函數(shù),下面的代碼示范了另外一種選擇。
byte [] buffer = new byte [100];
InetAddress ia = InetAddress.getByName ("www.disney.com");
DatagramPacket dgp = new DatagramPacket (buffer, buffer.length, ia,
6000);
有時(shí)候在創(chuàng)建了DatagramPacket對(duì)象后想改變字節(jié)數(shù)組和他的長(zhǎng)度,這時(shí)可以通過(guò)調(diào)用setData(byte [] buffer) 和 setLength(int length)方法來(lái)實(shí)現(xiàn)。在任何時(shí)候都可以通過(guò)調(diào)用getData() 來(lái)得到字節(jié)數(shù)組的引用,通過(guò)調(diào)用getLength()來(lái)獲得字節(jié)數(shù)組的長(zhǎng)度。下面的代碼示范了這些方法:
byte [] buffer2 = new byte [256];
dgp.setData (buffer2);
dgp.setLength (buffer2.length);
關(guān)于DatagramPacket的更多信息請(qǐng)參考SDK文檔。