2012-04-30 67 views
15

我们的一个Java程序在启动时只监听IPv6(8080)如何在Java上支持IPv4和IPv6

例如,

# 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  -    

的问题是它不是从外部接近(除本地主机),要解决这个问题,我有这个手动添加

-Djava.net.preferIPv4Stack=true 

但是,这使该方案仅适用于IPv4网络。

是否可以像上面的sshd这样做,都支持IPv4和IPv6?

回答

21

我怀疑这是少了Java编程的问题不是一个操作系统的网络堆栈/ OS的网络配置问题:

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

在一些操作系统中,一个单独的本地TCP套接字可以收听到两个端口 IPv4和IPv6同时。它能够接受来自 远程IPv4和来自远程IPv6客户端的连接。在其他操作系统(如WinXP) 上,一个OS本地套接字不能这样做,但只能接受来自IPv4或 的IPv6,而不能同时接受。在这些操作系统上,为了能够接受来自远程IPv4 和IPv6客户端的连接,一个监听IPv4连接的套接字和一个监听IPv6的 套接字,必须有两个监听套接字。

Windows 7和Windows Server 2008处理双堆栈就好了; Windows XP没有这么多:)

你似乎在Linux上 - 大多数现代Linux桌面和服务器也处理双ipv4 ipv6没有问题。

这里的互操作性的好文章:

你知道你怎么可以 “关闭” IPV6为您的Java应用程序:-Djava.net.preferIPv4Stack=true

您还可以强制服务器使用这样的IPV6:echo 0 > /proc/sys/net/ipv6/bindv6only

这可以说是你的b EST来源:

你绝对应该可以完成你想要的(至少在Java编程水平),除非你通过外部网络问题的限制:

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

PS:

这里有一个更好的链接,它解释了在套接字级发生了什么。这不是Java的(它的C),但究竟样品原则: