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

Java Socket无法接收服务器响应问题求助

Java Socket客户端无法收到响应的问题排查与解决

嘿,我来帮你搞定这个问题!从你描述的情况和代码来看,问题的核心在于客户端发送请求时没有传递换行符,导致服务端无法正确识别输入的结束,进而卡在读取步骤,根本没执行到反转和返回响应的逻辑。

问题根源分析

你用telnet测试时能正常工作,是因为telnet在你输入完内容按下回车后,会自动把换行符(\n)一起发送给服务端。而你的自定义客户端代码里,只通过pw.print(input)发送了输入的字符串,没有添加换行符。如果服务端是用BufferedReader.readLine()读取输入的(从telnet能正常工作推测应该是这样),这个方法会一直等待换行符才会返回读取到的内容,所以服务端会一直阻塞在读取输入的步骤,不会执行后续的反转和返回操作,客户端自然就收不到响应。

另外,服务端的发送逻辑是没问题的:你给反转后的字符串添加了\n,正好匹配客户端用bufferedReader.readLine()读取响应的逻辑,只要服务端能处理请求,客户端就能正确读到返回的内容。

修正后的代码示例

只需要修改客户端的发送部分,给输入内容加上换行符即可:

String input = JOptionPane.showInputDialog(null, "Input Message(q to Quit):");
if(input.equals("q")) {
    try {
        s.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return;
}
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
// 方式1:用println自动添加换行符
pw.println(input);
// 方式2:手动拼接换行符(和println效果一致)
// pw.print(input + "\n");
pw.flush();

BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(
                s.getInputStream()));
String line = null;
while((line = bufferedReader.readLine()) != null) {
    System.out.println(line);
}

额外小提示

  • 你客户端代码里的wait变量是多余的,可以直接去掉,不影响逻辑。
  • 后续开发中要注意Socket通信里的输入输出边界问题:如果用readLine(),一定要确保发送方传递换行符;如果用其他读取方式,要约定好消息的结束标志(比如固定长度、特殊分隔符等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:32:43