java socket長銜接中處理read壅塞的3個方法。本站提示廣大學習愛好者:(java socket長銜接中處理read壅塞的3個方法)文章只能為提供參考,不一定能成為您想要的結果。以下是java socket長銜接中處理read壅塞的3個方法正文
處理的辦法有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);