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
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur Andrew Duffy
Sauf si vous avez un besoin spécifique pour les méthodes disponibles uniquement dans
Inet6Address
ouInet4Address
vous ne devriez pas utiliser ces classes directement, au lieu d'utiliserInetAddress
.De cette façon, vous n'aurez pas besoin de cast et le risque d'avoir un CCE.
Dans votre cas, je ne vois pas vraiment de bonnes raisons d'utiliser spécifiquement IPv6 ou IPv4 classes.
Rappelez-vous, le protocole IPv6 est compatible avec IPv4, donc vous n'avez donc pas à vous inquiéter lorsque vous utilisez une adresse IPv4 à IPv6 système.
Ressources :
Inet6Address
qui je puis avoir besoin de passer àInetSocketAddress
pour se connecter à "host2" (passage d'unInet4Address
sera la cause d'une défaillance de la connexion). Donc, même si je viens d'utiliser la super-classeInetAddress
tout le temps, en-dessous, c'est en fait soitInet4Address
ouInet6Address
, n'est-ce pas? Et dans ce cas, je tenais à rendre évident le problème que j'ai en faisant le casting explicitement.Oui, il sera toujours
Inet4Address
seulement ouInet6Address
, et quel est le problème avec elle? IPv6 est compatible avec IPv4, il ne devrait pas être un problème.Eh bien, je ne suis pas sûr, parce que ce n'est pas ce que j'ai vécu. Je ne peux pas utiliser un
Inet6Address
(ouInetAddress
si vous le souhaitez) pour se connecter au serveur à l'écoute sur connexion IPv4 - je obtenir un échec de connexion. Ce:new InetSocketAddress(InetAddress.getByName("host1"), 7777)
avecInetAddress.getByName("host1")
retour d'un Inet6Address/InetAddress, ne fonctionne pas. Mais siInetAddress.getByName("host1")
retourne unInet4Address/InetAddress
, il pourrait fonctionner.Je ne vois pas vraiment le problème ici, mais après avoir regardé cet article : download.oracle.com/javase/1.4.2/docs/guide/net/ipv6_guide Il semble que cela devrait fonctionner sans fonte ou que ce soit
Je ne sais pas si c'est ma machine qui est mal, mais je ne pouvais toujours pas utiliser InetAddress (qui est Inet6Address-dessous) pour vous connecter au serveur à l'écoute sur des connexions IPv4. En cas de questions, le client et le serveur machines sont toutes de Windows XP.
OriginalL'auteur Colin Hebert
Avez-vous essayé avec
Inet6Address.getAllByName("host2")
.ce doit retourner IPv6 adresse de l'hôte, qui peut être utilisé pour créer des sockets.
Inet6Address
ne dispose pas d'une mise en œuvre spécifique degetAllByName(String)
, afin de l'appelantInet6Address.getAllByName(String)
est vraiment le même que l'appel de la mère de la méthode statiqueInetAddress.getAllByName(String)
.OriginalL'auteur krishna