Not a multicast group
multicastSocket = new MulticastSocket(4320);
multicastSocket.setLoopbackMode(true);
InetAddress group = InetAddress.getByName(broad_address);
原因是broad_address不是有效的多播组,多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在 224.0.0.0 和 239.255.255.255 的范围内(包括两者)。地址 224.0.0.0 被保留,不应使用。
下面是可以使用的代码:
MulticastSocket multicastSocket;
int port=getResources().getInteger(R.string.setting_defaultport);
try {
multicastSocket = new MulticastSocket(port);
multicastSocket.setLoopbackMode(true);
InetAddress group = InetAddress.getByName("228.5.6.7");
InetAddress broad_address = NetUtils.getBroadcastAddress(context);
multicastSocket.joinGroup(group);
...
也可以检测多播地址的有效性,捕获程序异常:
if(!receiveAddress.isMulticastAddress()){//测试是否为多播地址
throw new Exception("请使用多播地址");
}
下面是多播IP的划分:
IP多播地址 是D类地址,224.0.0.0 到 239.255.255.255,是通过前四位设置为1110来定义的。在主机和服务器环境中,基本上只使用224.0.0.0/4(CIDR表示法)为多播地址。
224.0.0.1:该子网上的所有主机
224.0.0.2:该子网上的所有路由器
224.0.0.5: 开放最短路径优先算法(OSPF)第2版,设计用于到达某个网络上的所有OSPF路由器。
224.0.0.6:开放OSPF,设计用于到达某个网络上的所有OSPF指定的路由器。
224.0.0.9:路由信息协议第2版
224.0.1.1:网络时间协议
224.0.0.0~224.0.0.255 :局部链接多播地址
224.0.1.0~238.255.255.255:保留的地址
239.0.0.0~239.255.255.255:管理权限多播地址,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围;