解決的方法有3個:
1 約定發送的資料長度,例如http的keepAlive 就是必須依賴這個的Content-Length
2 設定超時的時間,根據我的經驗,只有在Socket等級設定才有效.
複製代碼代碼如下:Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // 如果超過100毫秒還沒有數據,則拋出SocketTimeoutException
3 讓發送端發送完資料後,關閉連線。 這個在Http的操作時很常見。
(InputStream如何判斷資料已經讀取結束)
某些時候無法修改客戶端的情況下情況一就只有pass掉了,情況二相對來說比較適合,當阻塞後直接拋出一個異常。情況三不適合長連接,因為整個通訊過程中鏈路是不能中斷的,也不能調shutdown結束。其實還有第四種方法:讀取到某些字元就不在往下讀取了,像是讀取到byebye就break。但是這也需要改客戶端程式碼。選了一種折衷的辦法-設定超時:
StringBuilder sb = new StringBuilder();try { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(new String(buf, 0, a)); if (a != size) { break; } }} catch (Exception e) {}System.out.println(sb);