Java 强制ServerSocket使用IPv4

Java 强制ServerSocket使用IPv4,java,ipv6,serversocket,ipv4,netstat,Java,Ipv6,Serversocket,Ipv4,Netstat,我无法让ServerSocket使用IPv4而不是IPv6,这似乎是我系统上的默认行为 运行 newserversocket(11000,queueLimit,InetAddress.getByName(“0.0.0.0”) 将导致 ➜ ~ netstat -an | grep 11000 tcp46 0 0 *.11000 *.* LISTEN ➜ ~ lsof -i :11000 COMMAND

我无法让
ServerSocket
使用IPv4而不是IPv6,这似乎是我系统上的默认行为

运行
newserversocket(11000,queueLimit,InetAddress.getByName(“0.0.0.0”)
将导致

➜  ~ netstat -an | grep 11000
tcp46      0      0  *.11000                *.*                    LISTEN

➜  ~ lsof -i :11000
COMMAND PID  USER   FD   TYPE DEVICE             SIZE/OFF NODE NAME
java    2845 myuser 383u IPv6 0x5ba3bfaea6c7372d 0t0      TCP *:irisa (LISTEN)
您可以注意到,我们侦听端口11000的地址是IPv6地址,即使我在创建ServerSocket时指定了“0.0.0.0”IPv4地址

另一方面,如果我在vm选项上指定
-Djava.net.preferIPv4Stack=true
,我将得到以下场景

➜  ~ netstat -an | grep 11000
tcp4       0      0  *.11000                *.*                    LISTEN

➜  ~ lsof -i :11000
COMMAND PID  USER   FD   TYPE DEVICE             SIZE/OFF NODE NAME
java    3628 myuser 384u IPv4 0x5ba3bfaeaafaa08d 0t0      TCP *:irisa (LISTEN)
您现在可以注意到,我现在正确地侦听了IPv4地址上的端口11000,这正是我想要的,但我只能通过发送特定的vm选项来实现此解决方案


当打开
服务器套接字时,如何可靠地确定可以侦听哪个版本的IP堆栈?

IPv6套接字还可以侦听传入的IPv4连接,正如您从
tcp46
套接字类型中看到的那样。这没有什么错。IPv6增长非常快,确保您的软件可以与bot一起工作h IPv4和IPv6是一种良好的实践,可以防止将来(以及今天)出现许多问题


强烈建议不要强制套接字只侦听IPv4。

可能是这样,但它肯定有一些有效的使用案例-例如与传统硬件通信,或者处理UDP通信而不使用校验和,因为IPV6需要UDP通信的校验和…@user2366842为什么同时侦听IPv4和IPV6对传统ha来说是一个问题rdware(可能使用IPv4)?感谢您的回复。我有一个后续问题:如果一个应用程序正在侦听计算机IPv6接口上的端口11000,而另一个应用程序正在侦听相同的端口11000,但在IPv4接口上,如果连接到IPv4接口上的端口11000,将联系这两个应用程序中的哪一个?我想我的观点是如果任何一方都不能使用ipv6,这可能是不可行的。听起来OP的情况可能不是这样,但是…Ivano:您给出的示例显示应用程序正在侦听IPv4和ipv6。您不能让另一个应用程序在同一端口上侦听。