今天在做UDP组播发送和接收数据的时候,遇到一个错误,如下:
public static void main(String[] args) throws IOException {
Properties properties = Resources.getProperties("src/main/resources/ftp.properties");
System.out.println(properties.toString());
MulticastSocket multicastSocket = new MulticastSocket(66);
InetAddress[] inetAddress = InetAddress.getAllByName(properties.getProperty("groupip"));
System.out.println(Arrays.toString(inetAddress));
multicastSocket.joinGroup(inetAddress[0]);
System.out.println(inetAddress.toString());
}
解决办法:
- 网上查找各种资料之后,尝试了个方法都不对。
- 仔细排查自己的代码发现没有错误,所以开始思考IP或者端口引起的UDP无法加入组中。
- 排查之后发现UDP组播IP写错了,记得组播IP是IP的D类地址,范围在224.0.0.0~239.255.255.255
-
组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。
224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
判断一个IP地址是否为组播地址,只需要判断该地址是否在224.0.0.255(不含)到239.255.255.255之间,
IP地址本身是一个32位的数值,即0x00000000-0xffffffff之间,所以只需判断IP对应的Long值是否大于0xE00000FF且小于等于0xEFFFFFFF即可(该方法并非原创,而是摘自与live555源代码)