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

Posted

技术标签:

【中文标题】使用 Ehcache 多播获取“无法分配请求的地址”java.net.SocketException【英文标题】:Getting `Can't assign requested address` java.net.SocketException using Ehcache multicast 【发布时间】:2013-09-15 19:53:11 【问题描述】:

尝试启动多播提供程序时获取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)

【问题讨论】:

【参考方案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()));
        
    

【讨论】:

谢谢。这对我的 MacBook 有用。只设置JVM设置不起作用。【参考方案2】:

这是由从java.net.NetworkInterface.getDefault() 返回的 IPv6 地址引起的。我在 Macbook 上并且使用无线 - p2p0(用于 AirDrop)作为默认网络接口返回,但我的 p2p0 只有一个 IPv6 ether 条目(通过运行 ipconfig 找到)。

两种解决方案,都对我有用(我更喜欢第一种,因为无论您使用的是有线连接还是无线连接,它都适用)

    -Djava.net.preferIPv4Stack=true 启动JVM。这导致java.net.NetworkInterface.getDefault() 返回我的 vboxnet0 网络接口——如果您没有运行仅主机的虚拟机,不确定您会得到什么。 关闭无线并使用有线连接

【讨论】:

谢谢,直到我厌倦了才能让多播在我的 macbook 上工作。 java -Djava.net.preferIPv4Stack=true MyProgram 以下是使用 maven 时如何设置这些属性:***.com/a/7579853/32453 很棒的解决方案!!在调试一天后终于找到了这个!更多人应该看到。 对于那些想知道如何在 Eclipse 中设置 -Djava.net.preferIPv4Stack=true 的人:右键单击您的项目并选择“Run As”,然后选择“Run Configurations...”。将“-Djava.net.preferIPv4Stack=true”附加到 VM 参数中,然后单击“应用”。【参考方案3】:

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

这是ehcache.xml 中的违规行,被简单地注释掉了

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

【讨论】:

【参考方案4】:

接受的答案略有不同:您还可以将以下代码行添加到您的 java 代码中:

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

【讨论】:

这并不总是有效;至少在 macOS 下,“java.net.preferIPv4Stack”-property 仅在 JVM 启动时读取 - 以编程方式设置它没有效果。 @K. Biermann 有不同的方法来管理具有属性的应用程序配置数据,其中一个 user3697700 向我们展示了工作正常。见***.com/questions/39188826/… 和docs.oracle.com/javase/tutorial/essential/environment/…

以上是关于使用 Ehcache 多播获取“无法分配请求的地址”java.net.SocketException的主要内容,如果未能解决你的问题,请参考以下文章

Uwsgi:“无法分配请求的地址”

无法分配请求的地址 - bind(2) (Errno::EADDRNOTAVAIL)

ssh_init:网络错误:无法分配请求的地址

Docker 无法分配请求的地址

无法在 localhost:8000 上侦听(原因:无法分配请求的地址)

JMeter:java.net.NoRouteToHostException:无法分配请求的地址(地址不可用)