Java.net.SocketException: 不是多播地址

8
我正在使用MulticastSocket,但每当我尝试加入一个组时,当我在"localhost" IP上运行该组时,它从未生效。然而,我找到了这篇文章http://lycog.com/programming/multicast-programming-java/,它指出范围应该在224.0.0.1和239.255.255.254之间。当我将该IP转换为InetAddress并加入该组时,它就起作用了。请解释为什么这是必要的。
示例:
InetAddress group = InetAddress.getByName("localhost");
int port = 8888;
MulticastSocket socket = new MulticastSocket(port);
socket.joinGroup(group);

//抛出异常

Unable to connect to host:localhost on port:8888
java.net.SocketException: Not a multicast address

有效的示例:

InetAddress group = InetAddress.getByName("224.0.0.1");
int port = 8888;
MulticastSocket socket = new MulticastSocket(port);
socket.joinGroup(group);

我认为:通配符组。 - markspace
1
请解释为什么这是必要的。127.0.0.1不是多播地址,所以为什么不能将其用作多播地址会让人感到惊讶呢? - fge
我原以为它会在给定的端口上打开一个套接字,因此IP地址无关紧要。 - swrap
@swrap 您似乎不了解IP组播的实际含义。在此无法详细解释。 - user207421
@markspace 不,那是针对路由器而非应用程序的。 - user207421
1个回答

12

这与标准有关。来自维基百科文章关于多播地址的简短片段:

IPv4多播地址由前导地址位1110定义,源于早期互联网的分类网络设计,当时将这组地址指定为D类。该组的无类域间路由选择(CIDR)前缀为224.0.0.0/4。该组包括从224.0.0.0到239.255.255.255的地址。

此外,在javadoc中也几乎相同地描述了MulticastSocket

多播组由D类IP地址和标准UDP端口号指定。D类IP地址的范围是224.0.0.0到239.255.255.255,包括这个范围。地址224.0.0.0被保留,不应使用。

当您尝试加入一个多播组时,如果该组地址超出了指定范围(例如本地主机127.0.0.1),则会出现此异常。


我想知道多播套接字和普通套接字之间的区别。例如,为什么不能只为多播套接字提供一个本地主机上的端口号? - swrap
1
@swrap 因为你需要加入到你想要接收的多播组。 - user207421
@EJP 在客户端连接之前,是否需要先在 InetAddress 上创建一个 MulticastServerThread? - swrap
@swrap 多播使用的IP地址范围在此答案中列出。我不知道您所说的“在本地网络上运行”的意思。 - user207421
没事,我已经弄明白了。感谢你们的帮助! - swrap
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接