關于java網絡編程client端提示SocketException
問題描述
問題解答
回答1:請指正:問題可能的關鍵點:一個客戶端,只做一次 accept(),不關閉輸出流
1.客戶端保持了一個 clientSocket 實例(只調用了一次connect),服務器保持了一個 ServerSocket 實例。只保持一個客戶端socket并且希望有第二次輸入處理,這似乎是準備用長連接。
當關閉輸出流時,該輸出流對應的socket也將隨之關閉 —— 《瘋狂java講義(第三版)》 p786
2.再往下看服務端。ss.accept() 放在了循環(huán)里,這是要處理多個客戶連接;順便對每個客戶端有一次讀取操作,然后這里并沒有后續(xù)多次的讀取操作,這可能是問題所在。
短連接 or 長連接?對于希望連續(xù)的多次通訊,可以使用一個連接,多次讀寫(長連接),也可以多次連接,每個連接一次讀寫(短連接)你的客戶端想搞長連接,服務器似乎想搞短連接。建議:
長連接:客戶端不變,服務器對這一個客戶端,只做一次 accept(),循環(huán)處理多次輸入通訊,監(jiān)聽流,但不關閉socket。
短連接:客戶端每次發(fā)起新 socket 連接(建立新socket實例),每次操作完成,關閉流,關閉socket。服務器循環(huán)體不變,在循環(huán)體里關閉流,關閉每次accept()返回的socket。
因為不清楚您的業(yè)務,所以不知道代碼的真實意圖。另外還值得拓展的關注點是:
多客戶端連接,多次連接,會話管理,并發(fā)等等。
回答2:可以好好看看你的代碼,你在while循環(huán)里面每次都進行了關閉。
相關文章:
1. angular.js - angular內容過長展開收起效果2. angular.js - angularjs的自定義過濾器如何給文字加顏色?3. 關于nginx location配置的問題,root到底是什么4. docker鏡像push報錯5. 關于docker下的nginx壓力測試6. 大家好,請問在python腳本中怎么用virtualenv激活指定的環(huán)境?7. 并發(fā)模型 - python將進程池放在裝飾器里為什么不生效也沒報錯8. python2安裝失敗9. python 怎樣用pickle保存類的實例?10. python的前景到底有大?如果不考慮數據挖掘,機器學習這塊?
