国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 红桥区| 通化县| 灵台县| 西和县| 盖州市| 丹凤县| 廉江市| 张北县| 夏津县| 阳西县| 若羌县| 嵊州市| 商都县| 高唐县| 兴安盟| 营山县| 隆回县| 丰都县| 大英县| 梨树县| 宜黄县| 湘阴县| 五华县| 通榆县| 云安县| 伽师县| 哈尔滨市| 晋宁县| 华亭县| 宜宾县| 阳春市| 长宁县| 鱼台县| 米林县| 乐业县| 永定县| 揭东县| 庆云县| 萍乡市| 西华县| 揭东县|