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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 03:54:03