chronized 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)