java.net.SocketException: Connection reset,解決辦法
看評(píng)論很多都說(shuō)了這個(gè)問(wèn)題,但是我的情況完全不一樣(寫(xiě)得和他們的代碼一樣還是會(huì)報(bào)錯(cuò))
經(jīng)過(guò)調(diào)試發(fā)現(xiàn),需要修改兩個(gè)地方:
1.當(dāng)服務(wù)器響應(yīng)客戶(hù)端時(shí),需要在響應(yīng)信息輸完后加入 socket.shutdownOutput(),代表這個(gè)響應(yīng)內(nèi)容已經(jīng)輸完了,這時(shí)才會(huì)發(fā)送給客戶(hù)端讀取這個(gè)響應(yīng)
2.這樣調(diào)試下來(lái)運(yùn)行不再報(bào)錯(cuò),但是直接運(yùn)行依然報(bào)錯(cuò),這是因?yàn)榭蛻?hù)端還沒(méi)有來(lái)得及讀取,服務(wù)器相關(guān)關(guān)閉代碼就已經(jīng)開(kāi)始運(yùn)行了,從而報(bào)錯(cuò),所以需要在關(guān)閉前加個(gè)等待時(shí)間。
我的代碼如下:
服務(wù)端:
package?com.socket.socketsender.socketTest; import?java.io.*; import?java.net.ServerSocket; import?java.net.Socket; public?class?Server?{ ????public?static?void?main(String[]?args)??{ ????????try?{ ????????????ServerSocket?serverSocket?=?new?ServerSocket(8888); ????????????System.out.println("=======服務(wù)器已啟動(dòng),開(kāi)始監(jiān)聽(tīng)========="); ????????????Socket?accept?=?serverSocket.accept(); ????????????InputStream?inputStream?=?accept.getInputStream(); ????????????InputStreamReader?isr?=?new?InputStreamReader(inputStream); ????????????BufferedReader?br?=?new?BufferedReader(isr); ????????????String?str?=?null; ????????????while?((str?=?br.readLine())?!=?null)?{ ????????????????System.out.println("我是服務(wù)器,從客戶(hù)端收到消息:"?+?str); ????????????} ????????????accept.shutdownInput(); ????????????//響應(yīng)給客戶(hù)端 ????????????OutputStream?outputStream?=?accept.getOutputStream(); ????????????PrintWriter?pw?=?new?PrintWriter(outputStream); ????????????pw.write("你很帥氣啊"); ????????????pw.flush(); ???????????accept.shutdownOutput();//如果不加這個(gè),客戶(hù)端一直收不到響應(yīng),直到服務(wù)端關(guān)閉了,客戶(hù)端就報(bào)錯(cuò)了。 ????????????try?{ ????????????????//如果不設(shè)置等待時(shí)間,服務(wù)端已經(jīng)關(guān)閉了,客戶(hù)端還沒(méi)有來(lái)得及讀取這個(gè)響應(yīng),從而報(bào)錯(cuò) ????????????????System.out.println("先不要關(guān)閉"); ????????????????Thread.sleep(5000); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????} ????????????pw.close();//開(kāi)始關(guān)閉相關(guān)資源,如果前面不加shutdownOutput/等待時(shí)間,則從此處開(kāi)始報(bào)錯(cuò) ????????????outputStream.close(); ????????????br.close(); ????????????isr.close(); ????????????inputStream.close(); ????????????accept.close(); ????????????serverSocket.close(); ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????} }
客戶(hù)端:
package?com.socket.socketsender.socketTest; import?java.io.*; import?java.net.Socket; import?java.net.UnknownHostException; public?class?Client?{ ????public?static?void?main(String[]?args)?{ ????????try?{ ????????????Socket?socket?=?new?Socket("localhost",?8888); ????????????OutputStream?outputStream?=?socket.getOutputStream(); ????????????PrintWriter?ps?=?new?PrintWriter(outputStream); ????????????ps.write("用戶(hù)名:小羊,職位:測(cè)試工程師"); ????????????ps.flush(); ????????????socket.shutdownOutput(); ????????????InputStream?inputStream?=?socket.getInputStream(); ????????????BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(inputStream)); ????????????String?str?=?null; ????????????while?((str?=?br.readLine())?!=?null)?{ ????????????????System.out.println("服務(wù)器給出的響應(yīng)是:"?+?str); ????????????} ????????????br.close(); ????????????inputStream.close(); ????????????ps.close(); ????????????outputStream.close(); ????????????socket.close(); ????????}?catch?(UnknownHostException?e)?{ ????????????e.printStackTrace(); ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????} }
雖然這樣能解決問(wèn)題,但是感覺(jué)還是很low,有沒(méi)有什么更加好的辦法,
可以保證客戶(hù)端讀到響應(yīng)后服務(wù)端才關(guān)閉?
或者就讓服務(wù)端一直開(kāi)啟?---我試過(guò)把服務(wù)端所有資源關(guān)閉語(yǔ)句注釋掉,但客戶(hù)端每發(fā)送一次數(shù)據(jù),服務(wù)端還是會(huì)關(guān)閉
2018-10-19
我將你的代碼中這個(gè)去掉,客戶(hù)端是可以接收到服務(wù)端信息的.