尝试启动多播提供商时获取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)
答案 0 :(得分:88)
这是由java.net.NetworkInterface.getDefault()
返回的IPv6地址引起的。我在Macbook上使用无线 - p2p0(用于AirDrop)作为默认网络接口返回,但我的p2p0只有一个IPv6 ether
条目(通过运行ipconfig
找到)。 / p>
两种解决方案,两者都适用于我(我更喜欢第一种解决方案,因为无论您使用的是有线连接还是无线连接,它都能正常工作)
-Djava.net.preferIPv4Stack=true
启动JVM。这导致java.net.NetworkInterface.getDefault()
返回我的vboxnet0网络接口 - 如果您没有运行仅限主机的VM,则不确定会得到什么。答案 1 :(得分:8)
对接受的答案略有不同:您还可以在Java代码中添加以下代码行:
System.setProperty("java.net.preferIPv4Stack", "true");
答案 2 :(得分:7)
您需要先向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()));
}
}
}
答案 3 :(得分:0)
在我的情况下,我刚开始使用VPN到需要身份验证的网络。我的应用程序将启动并可以通过管道连接到其数据库,但我使用ehcach.xml中的IP 230.0.0.1配置分布式缓存是原因。在生产中一切都很好,在本地它只会失败并回滚到不同的策略,但通过VPN,多播请求遇到了身份验证质询,结果就是这个错误。我只需要一个短期修复,所以在这些环境中我禁用了ehcache组播配置,事情恢复正常。
这是ehcache.xml
中的违规行,只是被注释掉了
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"
/>