解決的方法有3個 :
1 約定發(fā)送的數(shù)據(jù)長度,比如 http的 keepAlive 就是必須依賴這個的 Content-Length
2 設(shè)置超時的時間,根據(jù)我的經(jīng)驗(yàn),只有在Socket級別設(shè)置才有效.
(InputStream如何判斷數(shù)據(jù)已經(jīng)讀取結(jié)束)
某些時候無法修改客戶端的情況下情況一就只有pass掉了,情況二相對來說比較適合,當(dāng)阻塞后直接拋出一個異常。情況三不適合長連接,因?yàn)檎麄€通信過程中鏈路是不能中斷的,也不能調(diào)shutdown結(jié)束。其實(shí)還有第四種方法:當(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);
新聞熱點(diǎn)
疑難解答
圖片精選