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

客户端与服务器无法互发消息问题排查(双向消息改造场景)

双向消息通信程序故障排查

问题背景

原本是单向客户端向服务器发送消息的程序,改造为客户端与服务器互发消息后,代码无编译错误,但双方始终无法实现互发消息。

代码问题分析

核心问题出在Server.java中:

  1. 错误读取输入源:服务器循环内连续两次调用fromClientReader.readLine(),意味着服务器收到客户端一条消息后,会继续等待客户端发送第二条消息,而非读取本地用户输入后回复客户端。
  2. 缺失客户端回复逻辑:服务器完全没有实现将本地用户输入回发给客户端的代码,客户端发送消息后一直等待服务器回复,服务器却在等待客户端下一条消息,双方陷入死锁。
  3. 空值判断逻辑混乱:空值判断放在两次读取操作之后,若客户端断开连接,第一次读取到null后,代码仍会执行第二次读取,逻辑错误。

Client.java 潜在小问题

客户端发送消息后直接阻塞等待服务器回复,但核心故障根源仍在服务器端。

修复后的代码

Server.java 修正版

try {
    // 创建服务器套接字
    ServerSocket serverSock = new ServerSocket(serverPort);
    System.out.println("等待客户端连接...");

    // 接受客户端连接请求
    Socket clientSock = serverSock.accept();
    System.out.println("已连接客户端:('" +
                ((InetSocketAddress) clientSock.getRemoteSocketAddress()).getAddress().getHostAddress()
                + "', '" +
                ((InetSocketAddress) clientSock.getRemoteSocketAddress()).getPort()
                + "')");

    // 关闭服务器套接字(不再接受其他客户端)
    serverSock.close();

    // 准备读取客户端消息
    BufferedReader fromClientReader = new BufferedReader(
            new InputStreamReader(clientSock.getInputStream()));
    // 新增:准备向客户端发送消息
    PrintWriter toClientWriter = new PrintWriter(clientSock.getOutputStream(), true);
    // 新增:读取服务器端本地用户输入
    BufferedReader fromServerUserReader = new BufferedReader(
            new InputStreamReader(System.in));

    // 持续服务客户端
    while (true) {
        // 读取客户端消息
        String message = fromClientReader.readLine();

        // 若客户端断开连接,终止循环
        if (message == null) {
            System.out.println("客户端已断开连接");
            clientSock.close();
            break;
        }

        // 显示客户端消息
        System.out.println("客户端:" + message);

        // 读取服务器端本地用户输入
        String line = fromServerUserReader.readLine();
        if (line == null) {
            System.out.println("关闭连接");
            clientSock.close();
            break;
        }

        // 将本地输入发送给客户端
        toClientWriter.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Client.java 确认点

确保客户端的toServerWriter已正确初始化(开启自动flush):

PrintWriter toServerWriter = new PrintWriter(sock.getOutputStream(), true);

修复说明

  • 服务器新增读取本地用户输入的fromServerUserReader和向客户端发送消息的toClientWriter,补全双向通信的核心逻辑。
  • 调整循环流程:先读取客户端消息,再读取本地输入并回复客户端,实现正常的双向交互。
  • 修正空值判断位置,避免无效读取操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:17:04