如何在Java上同时支持IPv4和IPv6
我们的Java程序之一在启动时仅监听IPv6(8080)
例如
# netstat -ntplProto 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网络。
是否可以执行上述类似 操作,并且都支持IPv4和IPv6?
回答:
我怀疑这不是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。
这是一篇关于互操作性的好文章:
- http://ntrg.cs.tcd.ie/undergrad/4ba2.02/ipv6/interop.html
您知道如何为您的Java应用程序“关闭” IPV6: -Djava.net.preferIPv4Stack=true
您还可以像这样强制服务器使用IPV6: echo 0 > /proc/sys/net/ipv6/bindv6only
可以说这是您的最佳来源:
- http://docs.oracle.com/javase/6/docs/technotes/guides/net/ipv6_guide/index.html
除非受到外部网络问题的限制,否则您应该绝对能够完成所需的工作(至少在Java编程级别)。
Nodes) V4 Only V4/V6 V6 Only ------- ----- -------
V4 Only x x
V4/V6 x x x
V6 Only x x
PS:
这里还有一个很好的链接,它解释了套接字级别发生的情况。它不是Java(它是C),但实际上适用了示例原则:
- 接受来自IPv6和IPv4客户端的连接
以上是 如何在Java上同时支持IPv4和IPv6 的全部内容, 来源链接: utcz.com/qa/434123.html