使用UDP Sockets技術完成IP多點傳送2(轉中華技術網)
發表時間:2023-08-18 來源:明輝站整理相關軟件相關文章人氣:
[摘要]DatagramPacket類 我們可以使用DatagramPacket類創建一個用于發送的數據報,而當接收UDP數據報時,可以使用DatagramPacket類讀取數據報中的數據,發送者及其它...
DatagramPacket類
我們可以使用DatagramPacket類創建一個用于發送的數據報,而當接收UDP數據報時,可以使用DatagramPacket類讀取數據報中的數據,發送者及其它信息。
為了創建一個數據報并發送到遠地系統,可以使用下面的構造器:
Public DatagramPacket(byte ibuf,int length,InetAddress iaddr,int iport,);
ibuf是編碼信息數據的字節數組,它的長度length就是數據報放在其中的字節數組的長度,iaddr是一個InetAddress對象,存儲著接收方的主機名和IP地址等信息,iport標識數據報發送到接收主機的端口。
為了接收數據報,必須使用DatagramPacket構造器,其原型為:public DatagramPacket(byte ibuf,int ilength);ibuf是指接收的數據報的數據部分, ilength是該部分數據的長度。如果 ilength 小于機器接收的UDP數據報的尺寸,多余的字節將被Java忽略。
另外,類中有一些方法(method)可以讓我們得到一些相關的信息:
public int getLength(); //得到數據報中數據塊的字節尺寸
public bytegetData();//得到接收數據報中的數據
public InetAddress getAddress(); //為發送者提供一個 InetAddress對象
public int getPort(); //得到UDP端口
值得注意的是,TCP sockets的編程中,我們無須將傳送的數據分塊,然而,當我們創建一個基于UDP的網絡通訊應用程序時,必須創建一套方法,在運行時刻決定需分割的數據報的長度。對于TCP/IP,最大的數據報可以含有65507字節的數據,然而,主機僅能接收最多548字節的數據,支持8192字節的大數據報的平臺是利用IP層對數據報進行分割的。如果在傳送期間,任何含有IP報文的一個數據塊丟失,都會造成整個UDP數據報的丟失,因此,我們在確定應用中數據報尺寸時,對其尺寸的合理性一定要謹慎。
下面就是分割數據的一個例子:
//循環地從輸入流input中讀一行數據
while((nextLine=input.readLine())!=null){
//定義一個空數據報,其尺寸為512
mcastBuffer=new byte[512];
//如果讀入的數據的長度大于定義的數據報的長度,
//則使用定義的長度,否則使用讀入數據的長度
if(nextLine.length()>mcastBuffer.length){
sendLength=mcastBuffer.length;
}else {
sendLenth=nextLine.length();
}
//將讀入的數據轉換為byte類型
lineData=nextLine.getBytes();
//將數據復制到用于創建數據報的byte數組
for(int i=0;i<sendLength;i++){
mcastBuffer[i]=lineData[i];
}
……創建數據報,發送或接收……
}
MulticastSocket類
Java的 MulticastSocket類是實施IP多點傳送網絡特征的關鍵,它允許我們使用多點傳送IP發送或接收UDP數據報。 MulticastSocket的構造器為:
public MulticastSocket () throws IOException; //創建一個多點傳送socket
public MulticastSocket(int port)throws IOException;//在指定端口創建一個多點傳送socket
另外,類中其它常用的方法有:
public void joinGroup(InetAddress mcastaddr)throws IOException{} //加入多點傳送組
public void leaveGroup(InetAddress mcastaddr)throws IOException{} //離開多點傳送組
public synchronized void send(DatagramPacket p,byte ttl) throws IOException{} //發送數據報
public synchronized void receive(DatagramPacket p,byte ttl) throws IOException{} //接收數據報
創建一個DatagramPacket對象之后,我們必須相應地創建一個 MulticastSocket對象,這樣,數據報就可以使用send()方法發送了。下面的代碼演示了如何創建 MulticastSocket、發送和接收IP多點傳送數據報:
int multiPort=2345; //定義端口號,非超級用戶應使用1024以上的端口
int ttl=1; //設定TTL值
InetAddress multiAddr=InetAddress.getByName(″224.0.1.100″); //設定多點傳送IP
byteSmultiBytes={'H','e','1','1','O'}; //定義一個內容為“Hello”的數據報
//創建多點傳送數據報
DatagramPacket SmultiDatagram new Datagram Packet(SmultiBytes,SmultiBytes,length,multiAddr,multiPort);
MulticastSocket multiSocket=new MulticastSocket(); //創建多點傳送socket
multiSocket.send(SmultiDatagram,ttl); //發送數據報(不加入到組中)
……
byteRmultiBytes=new byte[256]; //定義一個空數據報,長度為256字節
//創建接收數據報
DatagramPacket RmultiDatagram=new DatagramPacket(RmultiBytes,RmultiBytes.length);
multiSocket.joinGroup(multiAddr); //加入到多點傳送組中
multiSocket.receive(RmultiDatagram);//接收UDP數據報
……
multiSocket.leaveGroup(multiAddr); //離開多點傳送組
multiSocket.close(); //關閉多點傳送 socket
當調用joinGroup()方法時,機器將關注沿著網絡傳送屬于特定多點傳送組的任何IP報文,也就是說,機器擁有了一個郵箱。主機還應使用IGMP相應地報告組的使用。對于多IP地址的機器,應配置數據報發送的接口:setInterface(oneOfMyLocalAddrs);
在DatagramSocket中沒有類似 setSo Timeout()的方法設置超時。
IP多點傳送應用程序的開發流程
由于IP多點傳送主要用于同組中成員的交流,因此,應用程序的開發流程大體如下:
1.創建一個需發送的按規定編址的數據報DatagramPacket;
2.建立一個用于發送和接收的MulticastSocket;
3.加入一個多點傳送組;
4.將數據報放入MulticastSocket中傳送出去;
5.等待從MulticastSocket接收數據報;
6.解碼數據報提取信息;
7.根據得到的信息作出回應;
8.重復5—7步;
9.離開該多點傳送組,關閉MulticastSocket。
結束語
在實際應用中,發送和接收數據建議分別以單獨的線程同時運行,另外,如果需在屏幕上顯示,建議使用兩個線程在兩個不同的窗口分別負責顯示發送的數據和接收的數據。□
作者單位:建設銀行云南保山地區分行 (云南保山678000)