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

Java ServerSocket.accept() 迴圈機制:單一 Socket 維持長連線

     編輯:程式設計綜合問答

程式碼片段

while (true) {
    Socket s = serverSocket.accept(); // 阻塞等待客戶端連線
    // 處理 s ...
}

運作原理

  • accept() **每次返回一個新的 Socket**,代表**一個新的客戶端連線**。
  • 同一客戶端**首次連線**時觸發一次 accept() 返回 Socket。
  • 該 Socket **持續存在**,雙方可在上面進行**多次收發**(長連線),**不需要**每次資料到達都重新 accept()。
  • 迴圈下一次 accept() 等待**下一個新客戶端**連線。

正確架構

  1. 主執行緒跑 accept() 迴圈。
  2. 拿到 Socket s 後,**立即交給工作執行緒池** 處理該客戶端的完整會話(讀寫迴圈)。
  3. 主執行緒繼續 accept() 等待新連線。
ExecutorService pool = Executors.newCachedThreadPool();
while (true) {
    Socket client = serverSocket.accept();
    pool.execute(() -> handleClient(client)); // 處理完整會話
}

常見誤區

以為「客戶端每發一次資料就 accept 一次」 → 會導致伺服器只能處理單一請求隨即關閉,無法支援長連線或多路複用。

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