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
相关产品推荐
相关产品推荐

