關(guān)于java網(wǎng)絡(luò)編程client端提示SocketException
問題描述
問題解答
回答1:請(qǐng)指正:?jiǎn)栴}可能的關(guān)鍵點(diǎn):一個(gè)客戶端,只做一次 accept(),不關(guān)閉輸出流
1.客戶端保持了一個(gè) clientSocket 實(shí)例(只調(diào)用了一次connect),服務(wù)器保持了一個(gè) ServerSocket 實(shí)例。只保持一個(gè)客戶端socket并且希望有第二次輸入處理,這似乎是準(zhǔn)備用長(zhǎng)連接。
當(dāng)關(guān)閉輸出流時(shí),該輸出流對(duì)應(yīng)的socket也將隨之關(guān)閉 —— 《瘋狂java講義(第三版)》 p786
2.再往下看服務(wù)端。ss.accept() 放在了循環(huán)里,這是要處理多個(gè)客戶連接;順便對(duì)每個(gè)客戶端有一次讀取操作,然后這里并沒有后續(xù)多次的讀取操作,這可能是問題所在。
短連接 or 長(zhǎng)連接?對(duì)于希望連續(xù)的多次通訊,可以使用一個(gè)連接,多次讀寫(長(zhǎng)連接),也可以多次連接,每個(gè)連接一次讀寫(短連接)你的客戶端想搞長(zhǎng)連接,服務(wù)器似乎想搞短連接。建議:
長(zhǎng)連接:客戶端不變,服務(wù)器對(duì)這一個(gè)客戶端,只做一次 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àn)椴磺宄臉I(yè)務(wù),所以不知道代碼的真實(shí)意圖。另外還值得拓展的關(guān)注點(diǎn)是:
多客戶端連接,多次連接,會(huì)話管理,并發(fā)等等。
回答2:可以好好看看你的代碼,你在while循環(huán)里面每次都進(jìn)行了關(guān)閉。
相關(guān)文章:
1. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問題2. html5 - javascript讀取自定義屬性的值,有的能夠取到,有的取不到怎么回事??3. html - Python2 BeautifulSoup 提取網(wǎng)頁(yè)中的表格數(shù)據(jù)及連接4. python - PyCharm里的一個(gè)文件不小心忽略了wx包5. android - VideoView與百度Map沖突6. python - (2006, ’MySQL server has gone away’)7. 小白學(xué)python的問題 關(guān)于%d和%s的區(qū)別8. python - 使用eclipse運(yùn)行django代碼,修改了views.py這個(gè)文件,但是瀏覽器顯示的還是原有沒修改的結(jié)果,怎么處理?9. django - pycharm 如何配置 python3 的開發(fā)環(huán)境?10. win10 Apache24+PHP8.0,Apache不能正常加載php.ini。
