java socket長連接中解決read阻塞的3個辦法
解決的方法有3個 :
1 約定發(fā)送的數(shù)據(jù)長度,比如 http的 keepAlive 就是必須依賴這個的 Content-Length
2 設(shè)置超時的時間,根據(jù)我的經(jīng)驗,只有在Socket級別設(shè)置才有效.
socket.setSoTimeout(100); // 如果超過100毫秒還沒有數(shù)據(jù),則拋出 SocketTimeoutException
3 讓發(fā)送端發(fā)送完數(shù)據(jù)后,關(guān)閉連接。 這個在Http的操作時很常見。
(InputStream如何判斷數(shù)據(jù)已經(jīng)讀取結(jié)束)
某些時候無法修改客戶端的情況下情況一就只有pass掉了,情況二相對來說比較適合,當(dāng)阻塞后直接拋出一個異常。情況三不適合長連接,因為整個通信過程中鏈路是不能中斷的,也不能調(diào)shutdown結(jié)束。其實還有第四種方法:當(dāng)讀取到某些字符就不在往下讀取了,比如讀取到byebye就break。但是這也需要改客戶端代碼。選了一種折中的辦法-設(shè)置超時:
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);
相關(guān)文章
Java序列化中子類、父類構(gòu)造函數(shù)問題實例分析
這篇文章主要介紹了Java序列化中子類、父類構(gòu)造函數(shù)問題,結(jié)合實例形式分析了java父類與子類構(gòu)造函數(shù)中序列化接口調(diào)用相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2019-09-09
JSON.toJSONString()空字段不忽略修改的問題
這篇文章主要介紹了JSON.toJSONString()空字段不忽略修改的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Mybatis-Plus多表關(guān)聯(lián)查詢的使用案例解析
這篇文章主要介紹了Mybatis-Plus多表關(guān)聯(lián)查詢的使用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05

