關(guān)于java網(wǎng)絡(luò)編程client端提示SocketException
問題描述
問題解答
回答1:請指正:問題可能的關(guān)鍵點(diǎn):一個客戶端,只做一次 accept(),不關(guān)閉輸出流
1.客戶端保持了一個 clientSocket 實(shí)例(只調(diào)用了一次connect),服務(wù)器保持了一個 ServerSocket 實(shí)例。只保持一個客戶端socket并且希望有第二次輸入處理,這似乎是準(zhǔn)備用長連接。
當(dāng)關(guān)閉輸出流時,該輸出流對應(yīng)的socket也將隨之關(guān)閉 —— 《瘋狂java講義(第三版)》 p786
2.再往下看服務(wù)端。ss.accept() 放在了循環(huán)里,這是要處理多個客戶連接;順便對每個客戶端有一次讀取操作,然后這里并沒有后續(xù)多次的讀取操作,這可能是問題所在。
短連接 or 長連接?對于希望連續(xù)的多次通訊,可以使用一個連接,多次讀寫(長連接),也可以多次連接,每個連接一次讀寫(短連接)你的客戶端想搞長連接,服務(wù)器似乎想搞短連接。建議:
長連接:客戶端不變,服務(wù)器對這一個客戶端,只做一次 accept(),循環(huán)處理多次輸入通訊,監(jiān)聽流,但不關(guān)閉socket。
短連接:客戶端每次發(fā)起新 socket 連接(建立新socket實(shí)例),每次操作完成,關(guān)閉流,關(guān)閉socket。服務(wù)器循環(huán)體不變,在循環(huán)體里關(guān)閉流,關(guān)閉每次accept()返回的socket。
因為不清楚您的業(yè)務(wù),所以不知道代碼的真實(shí)意圖。另外還值得拓展的關(guān)注點(diǎn)是:
多客戶端連接,多次連接,會話管理,并發(fā)等等。
回答2:可以好好看看你的代碼,你在while循環(huán)里面每次都進(jìn)行了關(guān)閉。
相關(guān)文章:
1. 數(shù)據(jù)庫 - Mysql的存儲過程真的是個坑!求助下面的存儲過程哪里錯啦,實(shí)在是找不到哪里的問題了。2. php傳對應(yīng)的id值為什么傳不了啊有木有大神會的看我下方截圖3. 如何用筆記本上的apache做微信開發(fā)的服務(wù)器4. python - linux怎么在每天的凌晨2點(diǎn)執(zhí)行一次這個log.py文件5. 關(guān)于mysql聯(lián)合查詢一對多的顯示結(jié)果問題6. 冒昧問一下,我這php代碼哪里出錯了???7. windows誤人子弟啊8. mysql優(yōu)化 - MySQL如何為配置表建立索引?9. MySQL主鍵沖突時的更新操作和替換操作在功能上有什么差別(如圖)10. 實(shí)現(xiàn)bing搜索工具urlAPI提交
