在 Java 網絡編程中,ServerSocket 與 Socket 是實現 TCP 通信的兩大核心類。本文通過官方文檔截圖輔助,系統梳理它們的職責分工、生命週期與典型交互流程,幫助開發者建立清晰的網絡通信心智模型。
accept() 會阻塞直到有新連接到來,然後返回一個新的 Socket 實例代表該連接。accept() 產生)。提供 getInputStream()/getOutputStream() 進行全雙工數據交換。服務端 客戶端
│ │
├─ new ServerSocket(port) ───► │ (綁定端口,進入監聽)
│ │
│ ◄───── new Socket(ip, port) (發起三次握手)
│ │
├─ Socket s = accept() ───────► │ (返回專用通信 Socket)
│ │
├─ s.getInputStream().read() ◄──┤ (阻塞讀取)
│ ├─ s.getOutputStream().write() (發送數據)
│ │
└─ 關閉流與 Socket ◄───────────┘ (四次揮手斷開)

圖中展示了:
1. ServerSocket 綁定 IP:PORT 進入 LISTEN 狀態
2. 客戶端 Socket 發起 SYN,完成三次握手
3. accept() 返回新 Socket(本地端口相同,遠程 IP:PORT 不同)
4. 雙方通過各自 Socket 的輸入/輸出流進行應用層協議交互
accept + 線程池處理每個 Socket」或 NIO 非阻塞模型,避免單線程阻塞導致併發能力受限。shutdownOutput() 發送 FIN,對端 read() 返回 -1,但仍可繼續發送數據,需協議層協商結束標記。setSoTimeout(ms) 可防止 accept()/read() 無限期阻塞,提升健壯性。掌握 ServerSocket/Socket 的本質是「文件描述符」與「內核緩衝區」的抽象,配合多線程或 NIO,即可構建高性能網絡服務。建議結合 netstat -an | grep PORT 觀察連接狀態變化,深化理解。