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

Java Socket双向通信问题:连接成功但无法收发数据求解

Java Socket双向通信无法收发数据的解决方法

问题现象

编写了client.java和server.java实现Socket通信,两端能成功建立连接,但无法收发数据,始终处于阻塞状态;终止客户端后,服务端抛出java.net.SocketException: Connection reset错误。

问题原因

  1. BufferedWriter缓冲未刷新:BufferedWriter是带缓冲的流,调用write()后数据会留在缓冲区,未立即发送到对方。
  2. readLine()等待换行符:BufferedReader.readLine()会一直阻塞,直到读取到换行符(\n)或流结束,原代码写入数据时未添加换行符,导致对方的readLine()无法返回。
  3. 资源未正确关闭:服务端未关闭Socket和ServerSocket,客户端关闭后触发连接重置异常。

修复方案

修改后的client.java

public static void main(String[] args) throws Exception {
    Socket s = new Socket("localhost", 42069);
    System.out.println("Connected to the server!");
    
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    
    // 写入数据并添加换行符,调用flush确保发送
    out.write("hi from client\n");
    out.flush();
    
    // 读取服务端响应
    System.out.println(in.readLine());
    
    // 关闭资源
    in.close();
    out.close();
    s.close();
}

修改后的server.java

public static void main(String[] args) throws Exception {               
    ServerSocket ss = new ServerSocket(42069);
    System.out.println("Waiting For Connection...");
    Socket s = ss.accept();
    System.out.println("Connected to the client!");
    
    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    
    // 读取客户端消息(readLine会等待换行符)
    System.out.println(in.readLine());
    
    // 写入响应并添加换行符,flush发送
    out.write("hi from server\n");
    out.flush();
    
    // 关闭资源
    in.close();
    out.close();
    s.close();
    ss.close();
}

关键修改说明

  • 添加换行符:所有通过write()发送的数据末尾添加\n,或使用out.newLine()方法,确保对方readLine()能正常读取并返回。
  • 调用flush():每次写入后调用flush(),强制将缓冲区的数据发送到网络流中。
  • 资源关闭:使用完毕后依次关闭输入流、输出流、Socket和ServerSocket,避免资源泄漏和异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:05:28