繁体   English   中英

如何在Java上支持IPv4和IPv6

[英]How to support both IPv4 & IPv6 on Java

我们的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      -               

问题是它无法从外部访问(localhost除外),为了解决这个问题,我手动添加了这个

-Djava.net.preferIPv4Stack=true

但这使得该程序仅适用于IPv4网络。

是否有可能像上面的sshd那样,支持IPv4和IPv6?

我怀疑它不是一个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没有问题。

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

您知道如何为您的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),但确切的示例原则适用:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM