Java 循环和BufferedReader的问题
我在一个循环中遇到了一个奇怪的问题,它正在读取一个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 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()。可能会有例外