最近在学习socket通信,从网上拿了一份代码运行,结果发现每次客户端发送完数据后,总会报错。
java.net.SocketException: Connection reset
先展示我运行的代码。
TCP客户端代码:
public class TCPClient {
public static void main(String[] args) {
Socket socket;
try {
// 创建一个Socket对象,并指定服务端的IP及端口号
socket = new Socket("192.168.1.6", 1989);
// 创建一个InputStream用户读取要发送的文件。
InputStream inputStream = new FileInputStream("e://a.txt");
// 获取Socket的OutputStream对象用于发送数据。
OutputStream outputStream = socket.getOutputStream();
// 创建一个byte类型的buffer字节数组,用于存放读取的本地文件
byte buffer[] = new byte[4 * 1024];
int temp = 0;
// 循环读取文件
while ((temp = inputStream.read(buffer)) != -1) {
// 把数据写入到OuputStream对象中
outputStream.write(buffer, 0, temp);
}
// 发送读取的数据到服务端
outputStream.flush();
//关闭流
//outputStream.close();
//inputStream.close();
//关闭socket
//socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP服务器端代码:
public class TCPServer {
public static void main(String[] args) {
// 声明一个ServerSocket对象
ServerSocket serverSocket = null;
try {
// 创建一个ServerSocket对象,并让这个Socket在1989端口监听
serverSocket = new ServerSocket(1989);
// 调用ServerSocket的accept()方法,接受客户端所发送的请求,
// 如果客户端没有发送数据,那么该线程就停滞不继续
Socket socket = serverSocket.accept();
// 从Socket当中得到InputStream对象
InputStream inputStream = socket.getInputStream();
byte buffer[] = new byte[1024 * 4];
int temp = 0;
System.out.println("服务器启动成功");
// 从InputStream当中读取客户端所发送的数据
while ((temp = inputStream.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, temp));
}
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
眼尖的兄弟应该已经发现问题出现在哪里,在客户端代码,缺少了关闭socket的代码。只需要把socket.close()补上即可。
后面我又尝试了一下服务器的socket不关闭,客户端的socket关闭。一样不报错。
关闭客户端的流不关闭socket也不会报错。