ServerSocket 提供四種建構子與 bind() 方法,支援端口綁定、請求佇列長度設定、指定 IP 綁定。本文詳細解析各參數意義、掃描端口實作、佇列滿載行為、多網卡 IP 綁定策略,並說明 bind() 在選項設定上的優勢。
ServerSocket()
ServerSocket(int port)
ServerSocket(int port, int backlog)
ServerSocket(int port, int backlog, InetAddress bindAddr)
port:0 表系統隨機分配匿名端口;1~1023 為系統保留(Linux 需 root)。backlog:請求佇列長度(預設通常 50);≤0 或 >OS 上限則採 OS 預設。bindAddr:指定綁定 IP,限制僅接受該介面連接。ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=1320]
addr:綁定 IP(0.0.0.0 表所有介面)。port:固定為 0(歷史遺留)。localport:實際綁定端口。嘗試綁定端口,捕捉 BindException 判斷端口佔用:
for (int port = min; port <= max; port++)
try { new ServerSocket(port).close(); }
catch (BindException e) { System.err.println("端口 " + port + " 已開放!"); }
accept() 從中取出連接。SocketException: Connection reset by peer。new ServerSocket(1234, 2) 設佇列長度 2,客戶端快速建立 10 連接,前 2 成功,第 3 失敗;按 Enter 讓伺服器 accept() 釋放佇列位置。new ServerSocket(1234, 0, InetAddress.getByName("192.168.18.10"));
僅監聽內網介面,外網無法訪問,提升安全性。
ServerSocket ss = new ServerSocket();
ss.setReuseAddress(true); // 必須在 bind 前設定選項
ss.bind(new InetSocketAddress(1234)); // 或 bind(addr, backlog)
SO_REUSEADDR)。bind() 允許「建立 → 設定選項 → 綁定」順序,支援 IP+端口+backlog 任意組合。根據部署環境(單/多網卡、高併發、安全需求)選擇建構子或 bind(),正確設定 backlog 避免連接丟失,善用選項微調行為,是穩健伺服器開發的關鍵。