如何让Java NIO本地服务器同时支持IPv4与IPv6连接?
为何IPv4正常但IPv6无法连接?
问题概述
- 基于NIO的本地服务器运行在端口
18888,IPv4连接正常,可通过以下地址成功连接客户端:"localhost:18888""127.0.0.1:18888"
- 尝试IPv6连接时,测试的所有地址(
"::1:18888"、"[::1]:18888"、"[0:0:0:0:0:0:0:1]:18888")均失败,抛出异常:java.net.ConnectException: Connection refused: no further information at java.base/sun.nio.ch.Net.pollConnect(Native Method) at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:682) at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:973) - 环境:Windows 11系统、JDK 21,IPv6已启用,
ping [0:0:0:0:0:0:0:1]可正常执行 - 执行
netstat -aon仅发现IPv4监听条目,无IPv6相关记录:TCP 127.0.0.1:18888 0.0.0.0:0 LISTENING 54256
核心原因
你的服务器仅绑定了IPv4地址,并未监听IPv6套接字。IPv6与IPv4是独立的网络协议栈,即使系统启用了IPv6,若服务器未明确绑定IPv6地址,就无法接收IPv6的连接请求。netstat的输出已验证这一点——只有IPv4的监听条目,说明服务器根本没在IPv6端口上开启监听。
修复方案
修改服务器的绑定代码,将其绑定到IPv6通配地址::或本地IPv6地址::1:
示例Java NIO代码
ServerSocketChannel serverChannel = ServerSocketChannel.open(); // 绑定到IPv6通配地址,同时支持IPv4和IPv6连接(默认双栈模式) serverChannel.bind(new InetSocketAddress("::", 18888)); // 若仅需监听本地IPv6连接,可绑定到::1 // serverChannel.bind(new InetSocketAddress("::1", 18888));
绑定::的优势在于,服务器会同时监听IPv4和IPv6的连接请求,无需额外配置即可兼容两种协议的客户端。
验证修复
重启服务器后执行netstat -aon,应能看到类似以下的IPv6监听条目:
TCP [::]:18888 [::]:0 LISTENING 54256
内容的提问来源于stack exchange,提问作者mikera
相关产品推荐
相关产品推荐

