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

Java TCP 服務端 read() 循環阻塞:客戶端未發送流結束標誌導致

     編輯:程式設計疑難解答

問題代碼

// 服務端
while ((len = in.read(b)) != -1) { ... } // 阻塞在這裡
out.write("成功".getBytes()); // 永遠執行不到

// 客戶端
out.write("嘿嘿嘿".getBytes());
// 缺少 shutdownOutput(),流未關閉

原理

InputStream.read() 在流未關閉時會**阻塞等待數據**,直到讀到 EOF (返回 -1)。客戶端發送完數據後未調用 socket.shutdownOutput(),導致服務端以為還有數據繼續等待。

修正

// 客戶端發送完畢後
socket.shutdownOutput(); // 發送 FIN 包,告知服務端數據結束

// 服務端讀到 -1 退出循環,繼續發送回復
out.write("成功接受到信息".getBytes());
socket.close();

補充

  • shutdownOutput() 僅關閉輸出流,不關閉 Socket,輸入流仍可讀取回復。
  • 或約定應用層協議:固定長度、分隔符、長度前綴等,避免依賴流關閉。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved