// 服務端
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,輸入流仍可讀取回復。