首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java ServerSocket 監聽端口 netstat 顯示兩條記錄原因分析

     編輯:程式設計疑難解答

現象描述

單一 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

控制行為

僅綁定 IPv4


// 方法1:JVM 參數
-Djava.net.preferIPv4Stack=true

// 方法2:代碼指定綁定地址
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 60012));

僅綁定 IPv6(含 IPv4 映射)

默認行為即此,IPv6 socket 啟用 IPV6_V6ONLY=false 時可接受 IPv4 連接(Linux 默認開啟,Windows 需配置)。

連接測試建議

  • 客戶端用 localhost (127.0.0.1 / ::1) 或具體 IP 連接均可。
  • 若連接失敗,檢查防火牆、綁定地址、客戶端 IP 版本匹配,而非 netstat 條數。

總結

兩條 LISTENING 記錄屬正常雙棧綁定,無需修復。專注於業務連通性測試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved