国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 15:27:37
字體:
供稿:網(wǎng)友

解決的方法有3個 :

1 約定發(fā)送的數(shù)據(jù)長度,比如 http的 keepAlive 就是必須依賴這個的 Content-Length
2 設(shè)置超時的時間,根據(jù)我的經(jīng)驗(yàn),只有在Socket級別設(shè)置才有效.

復(fù)制代碼 代碼如下:
Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // 如果超過100毫秒還沒有數(shù)據(jù),則拋出 SocketTimeoutException

3 讓發(fā)送端發(fā)送完數(shù)據(jù)后,關(guān)閉連接。 這個在Http的操作時很常見。

(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);
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安国市| 石台县| 陵川县| 建平县| 江西省| 盱眙县| 抚宁县| 凌海市| 遂溪县| 哈密市| 三穗县| 南安市| 乌海市| 缙云县| 华容县| 长沙市| 许昌市| 新巴尔虎左旗| 乌鲁木齐县| 江华| 汨罗市| 楚雄市| 凤阳县| 城口县| 临沂市| 九龙县| 宣城市| 闽清县| 大冶市| 甘泉县| 浏阳市| 浙江省| 辉县市| 来安县| 广德县| 日喀则市| 修水县| 永川市| 公主岭市| 宁陵县| 泰和县|