亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

java.net.SocketException: Connection reset,解決辦法

看評論很多都說了這個問題,但是我的情況完全不一樣(寫得和他們的代碼一樣還是會報錯)

https://img1.sycdn.imooc.com//5ba9dad600011a1a07360341.jpg

經過調試發現,需要修改兩個地方:

1.當服務器響應客戶端時,需要在響應信息輸完后加入 socket.shutdownOutput(),代表這個響應內容已經輸完了,這時才會發送給客戶端讀取這個響應

2.這樣調試下來運行不再報錯,但是直接運行依然報錯,這是因為客戶端還沒有來得及讀取,服務器相關關閉代碼就已經開始運行了,從而報錯,所以需要在關閉前加個等待時間。

我的代碼如下:

服務端:

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("=======服務器已啟動,開始監聽=========");
????????????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("我是服務器,從客戶端收到消息:"?+?str);
????????????}
????????????accept.shutdownInput();
????????????//響應給客戶端
????????????OutputStream?outputStream?=?accept.getOutputStream();
????????????PrintWriter?pw?=?new?PrintWriter(outputStream);
????????????pw.write("你很帥氣啊");
????????????pw.flush();
???????????accept.shutdownOutput();//如果不加這個,客戶端一直收不到響應,直到服務端關閉了,客戶端就報錯了。
????????????try?{
????????????????//如果不設置等待時間,服務端已經關閉了,客戶端還沒有來得及讀取這個響應,從而報錯
????????????????System.out.println("先不要關閉");
????????????????Thread.sleep(5000);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}
????????????pw.close();//開始關閉相關資源,如果前面不加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("服務器給出的響應是:"?+?str);
????????????}

????????????br.close();
????????????inputStream.close();
????????????ps.close();
????????????outputStream.close();
????????????socket.close();
????????}?catch?(UnknownHostException?e)?{
????????????e.printStackTrace();
????????}?catch?(IOException?e)?{
????????????e.printStackTrace();
????????}
????}
}


雖然這樣能解決問題,但是感覺還是很low,有沒有什么更加好的辦法,

可以保證客戶端讀到響應后服務端才關閉?

或者就讓服務端一直開啟?---我試過把服務端所有資源關閉語句注釋掉,但客戶端每發送一次數據,服務端還是會關閉

正在回答

1 回答

try?{
????????????????//如果不設置等待時間,服務端已經關閉了,客戶端還沒有來得及讀取這個響應,從而報錯
????????????????System.out.println("先不要關閉");
????????????????Thread.sleep(5000);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}

我將你的代碼中這個去掉,客戶端是可以接收到服務端信息的.

0 回復 有任何疑惑可以回復我~
#1

qq_慕沐1549864

如果傳輸的內容多一點的話還是會報連接重置的錯。
2019-05-22 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

java.net.SocketException: Connection reset,解決辦法

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號