java.net.SocketException: Connection reset,解决办法
看评论很多都说了这个问题,但是我的情况完全不一样(写得和他们的代码一样还是会报错)

经过调试发现,需要修改两个地方:
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,有没有什么更加好的办法,
可以保证客户端读到响应后服务端才关闭?
或者就让服务端一直开启?---我试过把服务端所有资源关闭语句注释掉,但客户端每发送一次数据,服务端还是会关闭