You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:50:48