【问题标题】:java.net.SocketException: Not a multicast addressjava.net.SocketException:不是多播地址
【发布时间】:2016-02-29 23:40:27
【问题描述】:

我正在使用 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);

【问题讨论】:

  • 我认为:wildcard group.
  • "请解释为什么这是必要的"
  • 我假设它会从给它的端口中打开一个套接字。因此,ip 是什么并不重要。
  • @swrap 您似乎不明白 IP 多播到底是什么。过于宽泛,无法在此处解释所有内容。
  • @markspace 不,这是针对路由器的,不是针对应用程序的。

标签: java networking network-programming datagram multicastsocket


【解决方案1】:

一切都与标准有关。来自wiki article 的关于组播地址的简短消息:

IPv4 多播地址由 1110 的前导地址位定义,起源于早期 Internet 的有类网络设计,当时这组地址被指定为 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 已保留,不应使用。

所以,是的,当您尝试加入组地址超出此范围的多播组时(例如 localhost 127.0.0.1),您会收到此异常。

【讨论】:

  • 我想知道多播套接字和普通套接字有什么区别。例如,为什么不能只为多播套接字提供一个端口号以在 localhost 上运行?
  • @swrap 因为你需要加入你想要接收的组播组。
  • @EJP 是否需要先在 InetAddress 上创建 MulticastServerThread,然后才能连接客户端?
  • @srwap 什么是MulticastServerThread? JDK中没有这样的类。
  • @EJP 抱歉,我在看一个示例,但没有阅读文本。用于多播组的 IP 地址范围是否在本地网络上运行?我试图更好地理解多播是什么。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2014-03-27
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多