程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> java socket長連接中解決read阻塞的3個辦法

java socket長連接中解決read阻塞的3個辦法

編輯:JAVA編程入門知識

解決的方法有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);
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved