自定址通訊端(Datagram Sockets)
,因為使用流通訊端的每個串連均要花費一定的時間,要減少這種開銷,網路API提供了第二種通訊端:自定址通訊端(datagram socket),自定址使用UDP發送定址資訊(從客戶程式到服務程式或從服務程式到客戶程式),不同的是可以通過自定址通訊端發送多IP資訊包,自定址資訊包含在自定址包中,此外自定址包又包含在IP包內,這就將定址資訊長度限制在60000位元組內。圖2顯示了位於IP包內的自定址包的自定址資訊。
與TCP保證資訊到達資訊目的地的方式不同,UDP提供了另外一種方法,如果自定址資訊包沒有到達目的地,,那麼UDP也不會請求寄件者重新發送自定址包,這是因為UDP在每一個自定址包中包含了錯誤偵測資訊,在每個自定址包到達目的地之後UDP只進行簡單的錯誤檢查,如果檢測失敗,UDP將拋棄這個自定址包,也不會從寄件者那裡重新請求替代者,這與通過郵局發送信件相似,發信人在發信之前不需要與收信人建立串連,同樣也不能保證信件能到達收信人那裡
自定址通訊端工作包括下面三個類:DatagramPacket, DatagramSocket,和 MulticastSocket。DatagramPacket對象描繪了自定址包的地址資訊,DatagramSocket表示客戶程式和服務程式自定址通訊端,MulticastSocket描繪了能進行多點傳送的自定址通訊端,這三個類均位於java.net包內。
DatagramPacket類
在使用自定址包之前,你需要首先熟悉DatagramPacket類,地址資訊和自定址包以位元組數組的方式同時壓縮入這個類建立的對象中
DatagramPacket有數個建構函式,即使這些建構函式的形式不同,但通常情況下他們都有兩個共同的參數:byte [] buffer 和 int length,buffer參數包含了一個對儲存自定址資料包資訊的位元組數組的引用,length表示位元組數組的長度。
最簡單的建構函式是DatagramPacket(byte [] buffer, int length),這個建構函式確定了自定址資料包數組和數組的長度,但沒有任何自定址資料包的地址和連接埠資訊,這些資訊可以後面通過調用方法setAddress(InetAddress addr)和setPort(int port)添加上,下面的代碼示範了這些函數和方法。
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.
如果你更喜歡在調用建構函式的時候同時包括地址和連接埠號碼,可以使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port)函數,下面的代碼示範了另外一種選擇。
byte [] buffer = new byte [100];
InetAddress ia = InetAddress.getByName ("www.disney.com");
DatagramPacket dgp = new DatagramPacket (buffer, buffer.length, ia,
6000);
有時候在建立了DatagramPacket對象後想改變位元組數組和他的長度,這時可以通過調用setData(byte [] buffer) 和 setLength(int length)方法來實現。在任何時候都可以通過調用getData() 來得到位元組數組的引用,通過調用getLength()來獲得位元組數組的長度。下面的代碼示範了這些方法:
byte [] buffer2 = new byte [256];
dgp.setData (buffer2);
dgp.setLength (buffer2.length);
關於DatagramPacket的更多資訊請參考SDK文檔。