组播是比单播宽比广播窄的目标性更强的点对点通信。组播将数据从一台主机发送给多个不同
的主机。数据只传到某些通过加入组播组的客户端。
程序员和网络管理员不用负责选择在哪些点上复制数据,甚至不用负责发送多个副本。
Internet路由器会处理这些事情。
应用程序只将数据报包发送给组播地址,路由器将确保包被发送到改组播组中的所有主机。
组播地址:称为组播组的一组主机所共享的地址。组播地址的范围在224.0.0.0---
239.255.255.255之间(都为D类地址 1110开头)。
从应用程序来讲组播和普通UDP socket之间的区别在于必须考虑TTL值。这时IP首部中取值 0-
255的一个字节。 它的含义为包被丢弃前通过的路由数目。每通过一个路由器,其TTL减少1,
有些路由器减少2或更多。当TTL值为0时包就被丢弃。
组播最大的限制在于特殊的组播路由器是否可用。 ping all-routers.mcast.net
查看网络是否连接组播路由器。
[b]常用的API函数:[/b]
MulticastSocket()throws SocketException:绑定匿名端口
MulticastSocket(int port)throws SocketException:绑定已知端口
MulticastSocket(SocketAddress address)throws IOException:
你还可以向构造函数传送null,然后通过bind()方法进行连接
leaveGroup(InetAddress address)
public void joinGroup(InetAddress address)throws IOException
加入组播组
下面例子代码:
[b]例子2:将数据包发往组播组中的每台主机[/b]
的主机。数据只传到某些通过加入组播组的客户端。
程序员和网络管理员不用负责选择在哪些点上复制数据,甚至不用负责发送多个副本。
Internet路由器会处理这些事情。
应用程序只将数据报包发送给组播地址,路由器将确保包被发送到改组播组中的所有主机。
组播地址:称为组播组的一组主机所共享的地址。组播地址的范围在224.0.0.0---
239.255.255.255之间(都为D类地址 1110开头)。
从应用程序来讲组播和普通UDP socket之间的区别在于必须考虑TTL值。这时IP首部中取值 0-
255的一个字节。 它的含义为包被丢弃前通过的路由数目。每通过一个路由器,其TTL减少1,
有些路由器减少2或更多。当TTL值为0时包就被丢弃。
组播最大的限制在于特殊的组播路由器是否可用。 ping all-routers.mcast.net
查看网络是否连接组播路由器。
[b]常用的API函数:[/b]
MulticastSocket()throws SocketException:绑定匿名端口
MulticastSocket(int port)throws SocketException:绑定已知端口
MulticastSocket(SocketAddress address)throws IOException:
你还可以向构造函数传送null,然后通过bind()方法进行连接
leaveGroup(InetAddress address)
public void joinGroup(InetAddress address)throws IOException
加入组播组
下面例子代码:
try
{
MulticastSocket ms =new MulticastSocket(4000);
InetAddress ia = InetAddress.getByName("224.2.2.2");
ms.joinGroup(ia);
byte[] buffer=new byte[8192];
while(true)
{
DatagramPacket dp =new DatagramPacket(buffer,buffer.length);
ms.receive(dp);
String s=new String(dp.getData(),"8859_1");
System.out.println(s);
}
}
[b]例子2:将数据包发往组播组中的每台主机[/b]
try
{
InetAddress ia= InetAddress.getByName("experiment.mcast.net");
byte[] data= "dddffssdfdfdf".getBytes();
int port=4000;
DatagramPacket dp =new DatagramPacket(data,data.length,ia,port);
MulticastSocket ms =new MulticastSocket();
ms.send(dp);
}
catch(IOException ex)
{
}