首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Socket 單線程阻塞通訊完整範例:Server/Client 雙向收發

     編輯:Java 相關知識

前言

雖然生產環境多採用 Netty、Mina、gRPC 等高階框架,但理解原生 java.net.Socket 阻塞 I/O 模型是網路編程基石。本文提供最精簡的單線程 Server/Client 雙向通訊範例,涵蓋連線建立、行訊息收發、優雅關閉。

架構概覽

  • Server:ServerSocket.accept() 阻塞等待單一連線 → 輸入/輸出流包裝 → 迴圈 readLine() / println() → 收到 "bye" 斷開。
  • Client:new Socket(host, port) 連線 → 標準輸入 System.in 讀取使用者輸入 → 發送至 Server → 讀取 Server 回應 → 輸入 "bye" 結束。

Server 端代碼


Client 端代碼


關鍵技術細節

細節說明注意事項
try-with-resourcesJDK 7+ 自動關閉 Socket/Stream,防洩漏單線程模式下簡單可靠
PrintWriter(..., true)啟用 autoFlush,println 立即發送否則需手動 flush()
指定 Charset (UTF-8)避免平台預設編碼不一致導致亂碼雙端必須一致
readLine() 阻塞遇到 \n, \r\n, EOF 返回客戶端需換行送出
單線程限制同一時間只能服務一個 Client生產需多線程/IO 多路復用

執行驗證

  1. 先啟動 SimpleServer,控制台顯示「Server 啟動,監聽 10000...」
  2. 啟動 SimpleClient,顯示「已連線至 Server」
  3. Client 輸入:Hello Socket → Enter
  4. Server 輸出:收到: Hello Socket
  5. Client 顯示:Server 回應: Server Echo: Hello Socket
  6. Client 輸入 bye → 雙向關閉

進階擴充方向

  1. 多線程 Server:while(true) { new Thread(new Handler(server.accept())).start(); }
  2. 協議框架:定義長度前綴/分隔符/序列化 (Protobuf/JSON),解決黏包/半包。
  3. NIO 非阻塞:ServerSocketChannel + Selector 單線程處理萬級連線。
  4. Netty 框架:事件驅動、管道編碼解碼、內建心跳/重連/SSL。
  5. 優雅關閉:socket.shutdownOutput() 發送 FIN,對端讀到 -1/EOF,再關閉輸入。

總結

原生 Socket 阻塞 I/O 模型代碼簡潔、語義清晰,適合學習網路分層 (傳輸層/應用層協議)、流操作、同步阻塞語義。實務開發中,除極簡單工具/測試外,建議直接採用 Netty 等成熟框架,專注業務邏輯而非底層連線管理。

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