Java Socket双向通信问题:连接成功但无法收发数据求解
Java Socket双向通信无法收发数据的解决方法
问题现象
编写了client.java和server.java实现Socket通信,两端能成功建立连接,但无法收发数据,始终处于阻塞状态;终止客户端后,服务端抛出java.net.SocketException: Connection reset错误。
问题原因
- BufferedWriter缓冲未刷新:
BufferedWriter是带缓冲的流,调用write()后数据会留在缓冲区,未立即发送到对方。 - readLine()等待换行符:
BufferedReader.readLine()会一直阻塞,直到读取到换行符(\n)或流结束,原代码写入数据时未添加换行符,导致对方的readLine()无法返回。 - 资源未正确关闭:服务端未关闭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
相关产品推荐
相关产品推荐

