尝试在MulticastSocket上调用joinGroup(addr)时出现SocketException。这只发生在我们设置为启动机器时自动启动应用程序的Windows机器上。
似乎引发了异常,因为Windows还没有完全完成其启动过程,这是例外。
java.net.SocketException: error setting options
at java.net.PlainDatagramSocketImpl.join(Native Method)
at java.net.PlainDatagramSocketImpl.join(Unknown Source)
at java.net.MulticastSocket.joinGroup(Unknown Source)
在启动我们的应用程序时,如果我们在尝试加入该组之前等待一分钟,一切正常。
因此我们决定进行重试循环,以便在网络可用时立即连接,这似乎有效。在两次失败后,第三次尝试加入该小组的工作正常。
问题是,现在MulticastSocket没有收到来自该组的任何消息,即使它加入了很好。
我在每次失败后创建一个新的MulticastSocket并丢弃旧的。
为什么在一个MulticastSocket上加入组的失败会影响加入的组没有任何错误,我怎么能解决这个问题呢?
答案 0 :(得分:3)
我从来没有发现为什么套接字在成功加入组后不会收到消息。然而,我确实想出了一个解决方案。
我遍历所有网络接口并确保列表中有一个有效的接口,并且它已启动并运行。我接下来要做的是尝试在MulticastSocket上设置该网络接口。如果这些测试通过,那么我让套接字尝试加入该组。它似乎有效,但我仍然想知道更多关于幕后发生的事情。
private void validateNetworkInterfaces() throws IOException {
Enumeration nis = NetworkInterface.getNetworkInterfaces();
List<NetworkInterface> nics = new ArrayList<NetworkInterface>();
while (nis.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) nis.nextElement();
logger.debug("nic name: " + ni.getDisplayName());
logger.debug("nic isLoopback(): " + ni.isLoopback());
logger.debug("nic isPointToPoint(): " + ni.isPointToPoint());
logger.debug("nic isVirtual(): " + ni.isVirtual());
logger.debug("nic isUp(): " + ni.isUp());
logger.debug("nic supportsMulticast(): " + ni.supportsMulticast());
if (!ni.isLoopback() && !ni.isPointToPoint() && !ni.isVirtual() && ni.isUp() && ni.supportsMulticast()) {
logger.debug("adding nic: " + ni.getDisplayName());
nics.add(ni);
}
}
//check to make sure at least one network interface was found that supports multicast.
if (nics.size() == 0) throw new SocketException("No network interfaces were found that support multicast.");
//make sure the network interface can be set on a multicast socket
for (NetworkInterface nic : nics) {
logger.debug("attempting to set network interface on nic: " + nic.getDisplayName());
MulticastSocket ms1 = new MulticastSocket(45599);
ms1.setNetworkInterface(nic);
}
}
答案 1 :(得分:1)
我知道这是旧的,但实体多播答案似乎很少见。
我认为你会更好:
final InetAddress localHost = InetAddress.getLocalHost();
final NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
由于这更简洁,并且还可以确保获得实际将接收多播消息的NIC。