gpt4 book ai didi

java - MulticastSocket 失败后没有响应

转载 作者:可可西里 更新时间:2023-11-01 11:22:54 26 4
gpt4 key购买 nike

尝试调用 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 上加入组失败会影响没有任何错误加入的组,我怎么可能解决这个问题?

最佳答案

我从来没有弄清楚为什么套接字在成功加入群组后收不到消息。不过,我确实想出了一个变通办法。

我遍历所有网络接口(interface)并确保列表中有一个有效接口(interface)并且它已启动并正在运行。接下来我要做的是尝试在 MulticastSocket 上设置该网络接口(interface)。如果这些测试通过,那么我让套接字尝试加入组。看起来可行,但我还是想知道更多幕后情况。

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);
}

}

关于java - MulticastSocket 失败后没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com