Socket通信异常:服务端消息发送成功但客户端无法接收问题求助
问题根因
- 核心阻塞原因:客户端使用
BufferedReader.readLine()读取数据,该方法必须接收到换行符/回车符,或者输入流关闭才会返回结果,你服务端发送的消息末尾没有添加换行符,导致客户端线程一直阻塞在readLine()调用处,永远不会执行到打印TEST 2的逻辑。 - 额外逻辑错误:客户端将
BufferedReader的初始化代码放在了while死循环内部,每次循环都会创建新的读取器实例,会丢弃上一次读取器缓冲区内的未读数据,即便后续添加了换行符也可能出现数据丢失问题。
修复方案
服务端修改
发送消息时在末尾补充换行符,代码调整如下:
String s = ""; for(String a : Main.users.keySet()) { s = s + a + " "; } System.out.println("Sending message: " + "SERVER USERS " + s); // 末尾添加\n适配readLine()的读取规则 output.writeBytes("SERVER USERS " + s + "\n"); output.flush(); System.out.println("User message sent");
客户端修改
将BufferedReader的初始化移到循环外部,全局仅初始化一次:
System.out.println("TEST 1"); // 读取器初始化移到循环外,仅创建一次 reader = new BufferedReader(new InputStreamReader(input)); while(true){ try { line = reader.readLine(); System.out.println("TEST 2"); // 后续处理逻辑 } catch (Exception e) { // 异常处理逻辑 } }
内容的提问来源于stack exchange,提问作者Igorson
相关产品推荐
相关产品推荐

