2012-04-30 24 views
15

Uno de nuestro programa Java cuando se inicia, sólo escuche en IPv6 (8080)Como apoyar IPv4 y IPv6 en Java

por ejemplo,

# netstat -ntpl 

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 0.0.0.0:22    0.0.0.0:*    LISTEN  -    
tcp6  0  0 :::8080     :::*     LISTEN  -    
tcp6  0  0 :::22     :::*     LISTEN  -    

El problema es que no es accesible desde el exterior (excepto localhost), para resolver esto, tengo esto añadir manualmente

-Djava.net.preferIPv4Stack=true 

Pero esto hace que el programa es sólo para la red IPv4.

¿Es posible hacer algo como el sshd sshd como arriba, ambos soportan IPv4 e IPv6?

Respuesta

21

Sospecho que es menos un problema de programación Java de un sistema operativo de red problema de configuración de pila de red/OS:

http://coding.derkeiler.com/Archive/Java/comp.lang.java.help/2009-09/msg00087.html

En algunos sistemas operativos, un solo socket TCP nativo puede escuchar a un puerto en tanto IPv4 e IPv6 simultáneamente. Puede aceptar conexiones de IPv4 remoto y de clientes IPv6 remotos. En otros sistemas operativos (como WinXP) , un socket nativo del sistema operativo NO PUEDE hacerlo, pero solo puede aceptar desde IPv4 o IPv6, no ambos. En esos SO, es necesario tener dos sockets de escucha para poder aceptar conexiones de clientes IPv4 e IPv6 remotos, un socket para escuchar conexiones IPv4 y uno para IPv6.

Windows 7 y Windows Server 2008 manejan dos pilas bien; Windows XP no tanto :)

Parece que está en Linux: la mayoría de los escritorios y servidores Linux modernos también manejan ipv4 doble ipv6 sin ningún problema.

He aquí un buen artículo sobre la interoperabilidad:

Usted sabe cómo se puede "apagar" IPv6 para la aplicación Java: -Djava.net.preferIPv4Stack=true

También puede forzar a su servidor para usar IPV6 como este: echo 0 > /proc/sys/net/ipv6/bindv6only

Esto es sin duda su b fuente est:

Usted debe absolutamente ser capaz de lograr lo que quiere (al menos a nivel de programación Java), a menos que esté limitado por problemas de red externos:

Nodes)  V4 Only V4/V6 V6 Only 
      ------- ----- ------- 
V4 Only  x  x 
V4/V6  x  x  x 
V6 Only    x  x 

PS:

Aquí hay un enlace más, que explica lo que está sucediendo en el nivel de socket.No es Java (que de C), pero exactamente aplicar los principios de muestra:

Cuestiones relacionadas