第13章 IP组播

来源:互联网 发布:sql server 2012使用 编辑:程序博客网 时间:2024/06/05 23:07

第13章 IP组播

Internet组播建立在UDP基础之上。Java中的组播要使用第12章介绍的DatagramPacket,以及一个新的MulticastSocket类。

13.1 组播

组播比单播的点对点通信宽,但比广播通信窄而且目标更明确。组播将数据从一个主机发送给多个不同的主机,但不是发送给每一个人,数据值传送到加入某个特定的组播组,从而表示对此感兴趣的客户端。

组播地址和组
组播地址是称为组播组的一组主机的共享地址。 
组播组是一组共享一个组播地址的Internet主机.任何发送给该组播地址的数据都会中继给组中的所有成员。组播组中的成员是开放的,主机可以在任何时候进入或离开组。

客户端和服务器
当一台主机希望向组播发送数据时,它会将数据放在组播数据报中,组播数据报也就是发送到组播组的UDP数据报而已。
组播要考虑TTL值。TTL字段是为了防止路由循环而设计的,以保住所有包最终都会被丢弃。防止配置有误的路由器相互之间无限地来回传递包。

路由器和路由
组播最大的限制在于是否有特殊的组播路由器。组播路由器是重新配置的Internet路由器或工作站,支持IP组播扩展。

13.2 使用组播Socket

在Java中,要使用Java.net.MulticastSocket类来组播数据,这是java.net.DatagramSocket的一个子类:
将数据放在DatagramPakcet对象中,然后通过MulticastSocket收发DatagramPacket对象。

打开一个监听端口2300的MulticastSocket:
MulticastSocket ms = new MulticastSocket(2300);

使用joinGroup()方法加入到一个组播组:
InetAddress group = InetAddress.getByName("224.2.2.2");
ms.joinGroup(group);

一旦加入到组播组,就可以像DatagramSocket一样接受UDP数据。
byte[] buffer = new byte[8192];
DatagramPacket dp = new DatagramPacket(buffer,buffer.length);
ms.receive(dp);

不再希望接受数据时,通过调用这个Socket的leaveGroup()方法离开组播组。然后可以用close()方法关闭该Socket:
ms.leaveGroup(group);
ms.close();

不需要加入组播组就可以向组播地址发送数据。可以创建一个新的DatagramPacket,在包中填充数据和组播组的地址,将这个包传入send()方法:
InetAddress ia = InetAddress.getByName("experiment.mcast.net");
byte[] data = "Here's some multicast data\r\n".getBytes("UTF-8");
int port = 4000;
DatagramPacket dp = new DatagramPacket(data,data.length,ia,port);
MulticastSocket  ms = new MulticastSocket();
ms.send(dp);

13.3 两个简单示例

0 0