如何在Java上同时支持IPv4和IPv6

霍华德:

我们的Java程序之一,启动时仅侦听IPv6(8080)

例如

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

paulsm4:

我怀疑这不是Java编程问题,而是OS网络堆栈/ OS网络配置问题:

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

在某些操作系统上,单个本机TCP套接字可以同时侦听IPv4和IPv6上的端口。它能够接受来自远程IPv4和远程IPv6客户端的连接。在其他操作系统(例如WinXP)上,操作系统本机套接字无法执行此操作,但只能接受IPv4或IPv6,不能同时接受两者。在这些OS上,必须具有两个侦听套接字才能接收来自远程IPv4和IPv6客户端的连接,一个套接字侦听IPv4连接,另一个套接字侦听IPv6。

Windows 7和Windows Server 2008可以很好地处理双堆栈。Windows XP没有那么多:)

您似乎在Linux上-大多数现代Linux台式机和服务器也可以毫无问题地处理双ipv4 ipv6。

这是一篇关于互操作性的好文章:

您知道如何为Java应用程序“关闭” IPV6: -Djava.net.preferIPv4Stack=true

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

可以说这是您的最佳来源:

除非受到外部网络问题的限制,否则您应该绝对能够完成所需的工作(至少在Java编程级别上):

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

PS:

这是另一个更好的链接,它说明了套接字级别上发生的情况。它不是Java(它是C),但实际上适用示例原则:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章