Java 循环和BufferedReader的问题

Java 循环和BufferedReader的问题,java,while-loop,bufferedreader,stringbuilder,Java,While Loop,Bufferedreader,Stringbuilder,我在一个循环中遇到了一个奇怪的问题,它正在读取一个BufferedReader,而且永远不会结束 代码如下: BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); int b; StringBuilder buff = new StringBuilder(); while ((b = in.read()) != -

我在一个循环中遇到了一个奇怪的问题,它正在读取一个BufferedReader,而且永远不会结束

代码如下:

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

int b;
            StringBuilder buff = new StringBuilder();
            while ((b = in.read()) != -1 ) {
                buff.append((char) b);
            }
            System.out.println(buff.toString());
但从未到达打印buff.toString()的最后一行。 这个密码有什么问题吗


谢谢。

你能试着像这样改变while条件吗

while ((b = in.read()) > -1 ) {
            buff.append((char) b);
        }

您的循环正在尝试读取直到EOF(这是输入流/读取器为
read()
方法返回-1的唯一原因)

问题是您的HTTP连接(和套接字)可能会保持打开状态(一段时间),同时输入流/读取器也会保持打开状态。因此,
in.read()
调用将阻塞,等待输入,而不是达到循环的结束条件

如果你控制了连接的“另一端”,你可以关闭它,看看会发生什么。但我怀疑这在一般情况下是否适用于用例。相反,您需要根据HTTP协议解析消息(请参阅)

如果只需要解析标题,则可以使用
BufferedReader
,并只读取完整的行,直到找到空行为止。这将起作用,因为HTTP在每个标头名称/值对之后使用换行符(在本例中换行符为
CRLF
),并且在标头部分的末尾正好有两个换行符。之后的所有内容都将成为消息体


附:这是一个简单/愉快的例子。请注意,单个连接/套接字可用于多个HTTP请求/响应。根据您的要求,您可能也需要处理此问题。

您在阅读什么?(什么是'in'?)此代码正在从浏览器接收HTTP消息(使用套接字),我只想打印GET或POST消息的内容以查看内容(标题…您知道)当数据不可用时,您能否检查in.ready()的返回值。您好,这是我打印变量b和in.ready的内容得到的结果():10 true 13 true 10 falseBinish,我已经用以下代码解决了这个问题:if(!in.ready())break;非常感谢!!!!:)很好!但是,请阅读API文档中的ready()。可能会有例外