Java >> Java tutorial >  >> Tag >> java.net

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)

  1. Start JVM med -Djava.net.preferIPv4Stack=true . Dette forårsagede java.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.
  2. 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()));
        }
    }
}

Java tag