有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

获取“无法分配请求的地址”java。网使用Ehcache多播的SocketException

尝试启动多播提供程序时获取java.net.SocketException

2013-09-11 11:45:44,204 [main] ERROR net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider: Error starting heartbeat. Error was: Can't assign requested address
java.net.SocketException: Can't assign requested address
at java.net.PlainDatagramSocketImpl.join(Native Method)
at java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.java:178)
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:319)
at net.sf.ehcache.distribution.MulticastKeepaliveHeartbeatReceiver.init(MulticastKeepaliveHeartbeatReceiver.java:88)
at net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider.init(MulticastRMICacheManagerPeerProvider.java:95)

共 (3) 个答案

  1. # 1 楼答案

    在加入任何机器中的多播套接字之前,需要向Java VM添加某些配置

    在尝试任何连接之前,请首先添加此行,以确保仅获取IPv4地址:

    System.setProperty("java.net.preferIPv4Stack", "true");
    

    在大多数情况下,您的计算机具有多个网络接口,因此您需要选择正确的网络接口:

    Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
    while (networkInterfaces.hasMoreElements()) {
        NetworkInterface networkInterface = networkInterfaces.nextElement();
        Enumeration<InetAddress> addressesFromNetworkInterface = networkInterface.getInetAddresses();
        while (addressesFromNetworkInterface.hasMoreElements()) {
            InetAddress inetAddress = addressesFromNetworkInterface.nextElement();
            if (inetAddress.isSiteLocalAddress()
                    && !inetAddress.isAnyLocalAddress()
                    && !inetAddress.isLinkLocalAddress()
                    && !inetAddress.isLoopbackAddress()
                    && !inetAddress.isMulticastAddress()) {
                socket.setNetworkInterface(NetworkInterface.getByName(networkInterface.getName()));
            }
        }
    }
    
  2. # 2 楼答案

    对已接受的答案有一点不同:您还可以向java代码中添加以下代码行:

    System.setProperty("java.net.preferIPv4Stack", "true");
    
  3. # 3 楼答案

    在我的例子中,我刚刚开始使用VPN连接到需要身份验证的网络。我的应用程序将启动并可以通过管道连接到数据库,但我的分布式缓存配置使用ehcach中的IP 230.0.0.1。xml是原因。在生产中,一切都很好,在本地,它将简单地失败并回滚到不同的策略,但是通过VPN,多播请求遇到了身份验证挑战,结果就是这个错误。我只需要短期修复,因此在这些环境中,我禁用了ehcache多播配置,一切恢复正常

    这是ehcache.xml中有问题的一行,只是被注释掉了

    <cacheManagerPeerProviderFactory
      class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
      properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"
    />