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

Java Socket编程遇java.net.SocketException: Connection reset求助

解决Java Socket Connection reset异常问题

你遇到的Connection reset异常通常是TCP连接一端已关闭,另一端仍尝试读取数据导致的。结合你的代码,问题根源在于资源未正确关闭以及缺少对连接关闭的正确处理。

问题分析

客户端发送数据后(或程序退出时)会关闭Socket,但服务端读取完数据后未显式关闭相关资源,JVM自动回收资源时可能触发连接重置异常;另外,当客户端关闭连接时,服务端的BufferedReader.readLine()尝试读取后续数据时会收到RST包,从而抛出异常。

修复方案

使用Java的try-with-resources语法自动关闭所有IO资源和Socket,它会确保资源在代码块结束时被正确释放,避免连接残留问题。同时增加对readLine()返回值的判断(客户端关闭输出流时,readLine()会返回null)。

修复后的Client代码

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        // try-with-resources自动关闭Socket和PrintWriter
        try (Socket s = new Socket("localhost", 4999);
             PrintWriter pr = new PrintWriter(s.getOutputStream())) {
            pr.println("hello");
            pr.flush();
        }
    }
}

修复后的Server代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        // try-with-resources自动关闭所有资源
        try (ServerSocket ss = new ServerSocket(4999);
             Socket s = ss.accept();
             InputStreamReader in = new InputStreamReader(s.getInputStream());
             BufferedReader bf = new BufferedReader(in)) {
            System.out.println("client connected");
            String str = bf.readLine();
            // 判断读取内容是否为空,避免空指针
            if (str != null) {
                System.out.println("client : " + str);
            }
        }
    }
}

额外注意事项

  • 必须先启动服务端,再启动客户端,否则客户端会抛出连接拒绝异常。
  • 手动关闭资源时,要按从上层到底层的顺序关闭(比如先关PrintWriter,再关Socket),try-with-resources会自动处理这个顺序,更推荐使用。

内容的提问来源于stack exchange,提问作者Dari_OS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:45:38