首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MulticastSocket在失败后没有响应

MulticastSocket在失败后没有响应
EN

Stack Overflow用户
提问于 2009-02-24 22:40:40
回答 2查看 3.3K关注 0票数 3

当尝试在MulticastSocket上调用joinGroup(addr)时,我得到了一个SocketException。这只发生在我们设置为在计算机启动时自动启动应用程序的Windows计算机上。

似乎抛出异常是因为Windows还没有完全完成它的启动过程,下面是异常。

代码语言:javascript
复制
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上加入组失败会影响到在没有任何错误的情况下加入的组,我该如何解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2009-02-26 21:50:03

我从来没有发现为什么socket在成功加入群后不能接收消息。然而,我确实想出了一个变通的办法。

我做的下一件事是尝试在MulticastSocket上设置网络接口。如果这些测试通过,那么我会让套接字尝试加入该组。

代码语言:javascript
复制
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);
    }

}
票数 3
EN

Stack Overflow用户

发布于 2014-06-19 22:01:39

我知道这很古老,但可靠的多播答案似乎很少。

我想你会更好的选择:

代码语言:javascript
复制
final InetAddress localHost = InetAddress.getLocalHost();
final NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);

因为这更简洁,并且还将确保正在获得将实际接收多播消息的NIC。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/583950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档