Henter `Kan ikke tildele den anmodede adresse` java.net.SocketException ved hjælp af Ehcache multicast
Dette var forårsaget af en IPv6-adresse, der blev returneret fra java.net.NetworkInterface.getDefault()
. Jeg er på en Macbook og brugte trådløs -- p2p0 (bruges til AirDrop) blev returneret som standard netværksgrænseflade, men min p2p0 har kun en IPv6 ether
indgang (fundet ved at køre ipconfig
).
To løsninger, som begge fungerede for mig (jeg foretrækker den første, fordi den virker, uanset om du bruger en kablet eller trådløs forbindelse)
- Start JVM med
-Djava.net.preferIPv4Stack=true
. Dette forårsagedejava.net.NetworkInterface.getDefault()
for at returnere min vboxnet0-netværksgrænseflade -- ikke sikker på, hvad du får, hvis du ikke kører en VM, der kun er vært for. - Sluk trådløst, og brug en kablet forbindelse
En lille variation af det accepterede svar:Du kan også tilføje følgende kodelinje til din java-kode:
System.setProperty("java.net.preferIPv4Stack", "true");
Du skal tilføje visse konfigurationer til Java VM, før du kan tilslutte en Multicast-socket på en hvilken som helst maskine.
Tilføj først denne linje, før du forsøger at oprette forbindelse for at sikre, at du kun får IPv4-adresser:
System.setProperty("java.net.preferIPv4Stack", "true");
I de fleste tilfælde har din computer mere end én netværksgrænseflade, så du skal vælge den rigtige:
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()));
}
}
}