Application Java qui souhaitent utiliser les deux Inet4Address et Inet6Address en même temps

J'ai une application Java qui doit se connecter via les sockets à deux serveurs différents sur deux machines distinctes. Un serveur a été configuré pour écouter sur des connexions IPv4, tandis que l'autre a été configuré pour écouter sur des connexions IPv6.

Maintenant, en supposant que "host1" est le nom de machine du serveur écoute sur des connexions IPv4, alors que "host2" est le nom de machine du serveur écoute les connexions IPv6. J'ai besoin d'obtenir un Inet4Address pour "host1" et un Inet6Address pour "host2" pour créer une connexion de socket à chaque serveur, telles que les suivantes:

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

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

Cependant, la JVM par défaut préfère utiliser des adresses IPv4 à IPv6 adresses pour des raisons de compatibilité descendante. Ainsi, dans le code ci-dessus, la première tentative de connexion à "host1" réussit, mais la deuxième tentative de se connecter à "host2" échoue parce que InetAddress.getByName("host2") retourne un Inet4Address au lieu de Inet6Address.

Je comprends que je peux définir le système de la propriété java.net.preferIPv6Addresses à vrai préférer les adresses IPv6 sur IPv4, mais cela provoque à son tour la deuxième tentative de se connecter à "host2" réussit, mais la première tentative de connexion à "host1" a échoué(!) parce que InetAddress.getByName("host1") retourne un Inet6Address au lieu de Inet4Address.

Le système de la propriété java.net.preferIPv6Addresses n'est lu qu'une seule fois (voir InetAddress ligne 212-218) et donc il n'aurait pas d'effets, même si je change sa valeur à false, une fois la valeur true.

Donc ce que je peux je faire dans ce cas? Cela semble être un problème commun, alors certes, il y a un chemin déjà à le faire.

Remarque que je peux bien sûr utiliser InetAddress.getByAddress() et de fournir à chaque adresse IP de l'ordinateur explicitement au lieu de revenir un Inet4Address et Inet6Address, mais je ne veux pas faire cela, sauf si j'ai vraiment besoin de. Donc, d'autres solutions s'il vous plaît.

Oh, je suis en utilisant java 1.6.0_19 en cas de questions.

Merci!

OriginalL'auteur His | 2010-10-04