使用ObjectOutputStream发送字符串时遇java.net.SocketException: Connection reset异常
解决TCP使用ObjectOutputStream时的Connection reset异常
嘿,我来帮你搞定这个烦人的java.net.SocketException: Connection reset问题!这种错误本质上是连接在数据传输过程中被意外中断了,结合你给出的代码片段,我整理了几个最常见的原因和对应的解决办法:
常见原因与修复方案
1. 资源未正确关闭,导致连接泄漏
你的代码里没有显式处理流和Socket的关闭逻辑,一旦出现异常或者代码执行完后没有关闭资源,很容易导致连接被强制重置。
修复方法:使用Java的try-with-resources语法,它会自动帮你关闭实现了AutoCloseable接口的资源(比如Socket、ObjectInputStream/ObjectOutputStream),避免资源泄漏。
2. 服务端处理完请求后直接退出,无法处理后续连接
如果你的服务端代码只处理一次客户端连接就退出了,后续客户端连接时就会出现连接重置的问题。
修复方法:给服务端加个循环,让它可以持续接收客户端的连接请求。
3. 客户端发送数据后立刻关闭连接,服务端还未完成读取
如果客户端发送完数据后马上关闭Socket,而服务端还在读取数据的过程中,就会触发连接重置异常。
修复方法:如果不需要服务端响应,确保服务端完成读取后再关闭连接;如果需要响应,客户端要等待读取完服务端的响应后再关闭资源。
修正后的完整代码示例
客户端代码
import java.io.ObjectOutputStream; import java.net.Socket; public class Client { public static void main(String[] args) { // 使用try-with-resources自动关闭资源 try (Socket clientSocket = new Socket("127.0.0.1", 9000); ObjectOutputStream oo = new ObjectOutputStream(clientSocket.getOutputStream())) { String data = "你好,这是客户端发送的字符串!"; oo.writeObject(data); oo.flush(); // 如果需要接收服务端的响应,取消下面的注释 // ObjectInputStream oi = new ObjectInputStream(clientSocket.getInputStream()); // String serverResponse = (String) oi.readObject(); // System.out.println("服务端响应:" + serverResponse); } catch (Exception e) { e.printStackTrace(); } } }
服务端代码
import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try (ServerSocket server = new ServerSocket(9000)) { System.out.println("服务端已启动,等待客户端连接..."); // 循环接收多个客户端连接 while (true) { try (Socket client = server.accept(); ObjectInputStream oi = new ObjectInputStream(client.getInputStream())) { String receivedData = (String) oi.readObject(); System.out.println("收到客户端数据:" + receivedData); // 如果需要给客户端发送响应,取消下面的注释 // ObjectOutputStream oo = new ObjectOutputStream(client.getOutputStream()); // oo.writeObject("已收到你的消息!"); // oo.flush(); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } }
额外排查点
- 检查端口9000是否被其他程序占用,可以用
netstat -ano | findstr 9000(Windows)或lsof -i :9000(Linux/Mac)命令查看。 - 确保本地防火墙没有拦截127.0.0.1的TCP连接(本地连接一般不会有这个问题,但可以排查下)。
内容的提问来源于stack exchange,提问作者Phạm Văn Đắc
相关产品推荐
相关产品推荐

