【问题标题】:Issue with loop and BufferedReader循环和 BufferedReader 的问题
【发布时间】:2014-01-12 17:10:52
【问题描述】:

我在读取 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()。 这段代码有什么问题吗?

谢谢。

【问题讨论】:

  • 你在读什么? (什么是“在”?)
  • 这段代码正在接收来自浏览器的 HTTP 消息(使用套接字),我只想打印 GET 或 POST 消息的内容以查看内容(标题......你知道)

标签: java while-loop bufferedreader stringbuilder


【解决方案1】:

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

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

【讨论】:

  • 当数据不可用时,你能不能检查一下in.ready()的返回值。
  • 嗨,这是我打印变量 b 和 in.ready() 的内容:10 true 13 true 10 false
  • Binish,我已经使用以下代码解决了问题: if (!in.ready()) break;非常感谢!!!! :)
  • 好!但是,请阅读 ready() 的 API 文档。可能有例外
【解决方案2】:

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

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

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

如果您只需要解析标题,那么您可以使用您的BufferedReader,并且只读取整行,直到找到一个空行。这将起作用,因为 HTTP 在每个标头名称/值对之后使用换行符(在这种情况下换行符为 CRLF),并以恰好两个换行符结束标头部分。之后的所有内容都将成为消息正文。

PS:这是简单/快乐的情况。请注意,单个连接/套接字可以重新用于多个 HTTP 请求/响应。根据您的要求,您可能也已处理此问题。

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多