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
相关产品推荐
相关产品推荐

