單一 ServerSocket 監聽端口 60012,進程 PID 4036,netstat -aon | findstr "60012" 顯示兩條記錄:
TCP 0.0.0.0:60012 0.0.0.0:0 LISTENING 4036
TCP [::]:60012 [::]:0 LISTENING 4036
雙協議棧綁定:Java 默認啟用 IPv6,ServerSocket 同時綁定:
0.0.0.0:60012 — IPv4 全地址監聽[::]:60012 — IPv6 全地址監聽這是正常行為,單進程雙 socket 文件描述符,均由同一 PID 持有。
ServerSocket server = new ServerSocket(60012);
// server.isBound() -> true
// server.getInetAddress() -> 0.0.0.0 (IPv4)
// 實際底層創建了兩個 socket
// 方法1:JVM 參數
-Djava.net.preferIPv4Stack=true
// 方法2:代碼指定綁定地址
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 60012));
默認行為即此,IPv6 socket 啟用 IPV6_V6ONLY=false 時可接受 IPv4 連接(Linux 默認開啟,Windows 需配置)。
localhost (127.0.0.1 / ::1) 或具體 IP 連接均可。兩條 LISTENING 記錄屬正常雙棧綁定,無需修復。專注於業務連通性測試。