readLine()无返回值致客户端死循环,无法打印指定内容的问题排查
老哥,这种情况我碰到过好多次,核心问题基本都绕不开数据流的几个坑,结合你说的现象——服务器收得到数据,但客户端卡在readLine()连"Something"都打不出来,给你梳理最可能的原因:
1. 服务器没发换行符(90%的概率是这个!)
readLine()的尿性就是:必须读到\n或者\r\n才会返回,不然就死等。如果你的服务器只把"response"发出去了,但结尾没加换行符,客户端的readLine()就会一直蹲在那儿等,根本走不到后面的打印逻辑。
举个反例,服务器如果只写:
outputStream.write("response".getBytes());
这绝对不行!得加上换行,比如:
// Unix/Linux风格换行 outputStream.write("response\n".getBytes()); // 兼容Windows的写法 outputStream.write("response\r\n".getBytes());
另外,写完一定要调用flush()!不然数据可能还躺在服务器的输出缓冲区里,客户端根本收不到,白等。
2. 客户端代码顺序搞反了
你说连"Something"都没输出,这大概率是readLine()的调用在打印语句前面?比如代码写成这样:
// 错误顺序:先读再打印,直接卡死在第一行 String response = bufferedReader.readLine(); System.out.println("Something"); System.out.println(response);
那readLine()先阻塞了,后面的打印永远没机会执行。赶紧检查下代码顺序,把System.out.println("Something")放到readLine()前面试试。
3. 数据流没正确关闭/半开连接
如果服务器发完数据后,没关输出流或者套接字,客户端的readLine()会一直等着更多数据过来。要是你是短请求响应的场景,服务器发完响应后得调用outputStream.close()或者socket.close();如果是长连接,那得有其他约定的结束标志(比如固定长度、特定终止符),不然客户端不知道什么时候读完。
另外,如果客户端的输入流被悄悄搞断了但没抛异常,也可能导致readLine()死等,但这种情况一般会有IO异常,你可以看看有没有未捕获的异常。
4. 编码不一致搞的鬼
如果服务器和客户端用的字符编码不一样,比如服务器用UTF-16发,客户端用UTF-8读,换行符可能被当成普通字符,readLine()认不出来。得确保两端编码一致,比如都用UTF-8:
// 客户端这边 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); // 服务器那边 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8));
快速排查小步骤
- 先抓个包:用Wireshark或者tcpdump看看服务器到底发了啥,有没有带换行符,一目了然。
- 查服务器代码:确认发响应时加了换行,还调用了
flush()。 - 看客户端代码顺序:别把
readLine()放在打印语句前面。
内容的提问来源于stack exchange,提问作者Duha Çelik

