我在循环中遇到一个奇怪的问题,即读取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()。 这段代码有什么问题吗?
感谢。
答案 0 :(得分:0)
你可以尝试像这样改变while条件。
while ((b = in.read()) > -1 ) {
buff.append((char) b);
}
答案 1 :(得分:0)
你的循环试图读取直到EOF(这是输入流/阅读器为read()
方法返回-1的唯一原因)。
问题是您的HTTP连接(和您的套接字)可能会保持打开状态(暂时),同时保持输入流/阅读器处于打开状态。因此,in.read()
调用只会阻塞,等待输入,而不是达到循环的结束条件。
如果你控制连接的“另一面”,你可以关闭它,看看会发生什么。但我怀疑这对于一般的用例是否有用。相反,您需要根据HTTP协议解析消息(请参阅HTTP/1.1 RFC2616)。
如果您只需要解析标题,那么您可以使用BufferedReader
,只读完整行,直到找到空行。这将起作用,因为HTTP在每个标题名称/值对之后使用换行符(在这种情况下为换行符为CRLF
),并且使用恰好两个换行符结束标题部分。之后的一切都将成为信息的主体。
PS:这是一个简单/快乐的案例。请注意,单个连接/套接字可以重用于多个HTTP请求/响应。您也可以根据自己的要求处理此问题。