Java-Anwendung nutzen wollen, die beide Inet4Address und Inet6Address zur gleichen Zeit

Ich habe eine Java-Anwendung, um eine Verbindung über sockets bis zu zwei Server auf zwei getrennten Maschinen. Ein server so konfiguriert wurde, hören Sie auf IPv4-verbindungen, während die anderen, die so konfiguriert wurde, zu hören auf IPv6-verbindungen.

Nun, davon ausgehend, "host1" ist der Computername des server lauscht auf IPv4-verbindungen, während "host2" ist der Computername des server listening on IPv6-verbindungen. Ich brauche, um eine Inet4Address für "host1" und ein Inet6Address für "host2" zum erstellen einer socket-Verbindung zu jedem server, wie den folgenden:

Inet4Address inet4 = (Inet4Address)InetAddress.getByName("host1");
InetSocketAddress soc4 = new InetSocketAddress(inet4, 7777);
...

Inet6Address inet6 = (Inet6Address)InetAddress.getByName("host2");
InetSocketAddress soc6 = new InetSocketAddress(inet6, 7777);
...

Jedoch die JVM standardmäßig bevorzugt IPv4-Adressen auf IPv6-Adressen aus Gründen der Abwärtskompatibilität. Also, der obige code, der erste Versuch, eine Verbindung zu "host1" gelingt, aber der zweite Versuch, eine Verbindung zu "host2" schlägt fehl, weil InetAddress.getByName("host2") gibt ein Inet4Address statt Inet6Address.

Ich verstehe, dass ich kann die system-property java.net.preferIPv6Addresses um wahr zu bevorzugen IPv6-Adressen gegenüber IPv4, aber dies wiederum bewirkt, dass der zweite Versuch eine Verbindung zu "host2" gelingt, aber der erste Versuch, eine Verbindung zu "host1" ist fehlgeschlagen(!) da InetAddress.getByName("host1") gibt ein Inet6Address statt Inet4Address.

Dem system property java.net.preferIPv6Addresses ist nur einmal gelesen (siehe InetAddress-line 212-218) und so hätte es keine Auswirkungen, auch wenn ich ändern Sie den Wert zurück auf false, nachdem Sie es auf true.

Also, was kann ich tun in diesem Fall? Dies scheint ein häufiges problem, so gibt es sicherlich einen Weg geben, schon um es zu tun.

Beachten Sie, dass kann ich natürlich InetAddress.getByAddress() und liefern jede Maschine mit der IP-Adresse explizit statt, um wieder ein Inet4Address und Inet6Address, aber ich will nicht, dies zu tun, es sei denn, ich habe wirklich zu. Also andere Lösungen bitte.

Oh, ich bin mit java 1.6.0_19 in Fall ist es wichtig.

Dank!

InformationsquelleAutor His | 2010-10-04
Schreibe einen Kommentar