java.net.SocketException: Connection reset,解決辦法
看評論很多都說了這個問題,但是我的情況完全不一樣(寫得和他們的代碼一樣還是會報錯)
經(jīng)過調(diào)試發(fā)現(xiàn),需要修改兩個地方:
1.當服務(wù)器響應(yīng)客戶端時,需要在響應(yīng)信息輸完后加入 socket.shutdownOutput(),代表這個響應(yīng)內(nèi)容已經(jīng)輸完了,這時才會發(fā)送給客戶端讀取這個響應(yīng)
2.這樣調(diào)試下來運行不再報錯,但是直接運行依然報錯,這是因為客戶端還沒有來得及讀取,服務(wù)器相關(guān)關(guān)閉代碼就已經(jīng)開始運行了,從而報錯,所以需要在關(guān)閉前加個等待時間。
我的代碼如下:
服務(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ù)器已啟動,開始監(jiān)聽========="); ????????????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ù)器,從客戶端收到消息:"?+?str); ????????????} ????????????accept.shutdownInput(); ????????????//響應(yīng)給客戶端 ????????????OutputStream?outputStream?=?accept.getOutputStream(); ????????????PrintWriter?pw?=?new?PrintWriter(outputStream); ????????????pw.write("你很帥氣啊"); ????????????pw.flush(); ???????????accept.shutdownOutput();//如果不加這個,客戶端一直收不到響應(yīng),直到服務(wù)端關(guān)閉了,客戶端就報錯了。 ????????????try?{ ????????????????//如果不設(shè)置等待時間,服務(wù)端已經(jīng)關(guān)閉了,客戶端還沒有來得及讀取這個響應(yīng),從而報錯 ????????????????System.out.println("先不要關(guān)閉"); ????????????????Thread.sleep(5000); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????} ????????????pw.close();//開始關(guān)閉相關(guān)資源,如果前面不加shutdownOutput/等待時間,則從此處開始報錯 ????????????outputStream.close(); ????????????br.close(); ????????????isr.close(); ????????????inputStream.close(); ????????????accept.close(); ????????????serverSocket.close(); ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????} }
客戶端:
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("用戶名:小羊,職位:測試工程師"); ????????????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(); ????????} ????} }
雖然這樣能解決問題,但是感覺還是很low,有沒有什么更加好的辦法,
可以保證客戶端讀到響應(yīng)后服務(wù)端才關(guān)閉?
或者就讓服務(wù)端一直開啟?---我試過把服務(wù)端所有資源關(guān)閉語句注釋掉,但客戶端每發(fā)送一次數(shù)據(jù),服務(wù)端還是會關(guān)閉
2018-10-19
我將你的代碼中這個去掉,客戶端是可以接收到服務(wù)端信息的.