You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:43:15