【问题标题】:Servlet response buffer not flushing without newlinesServlet 响应缓冲区在没有换行符的情况下不刷新
【发布时间】:2015-01-02 08:41:43
【问题描述】:

我的示例 servlet 打印出一些数据,刷新缓冲区,休眠 5 秒,然后打印出更多数据并完成。

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
{

  response.setContentType("text/html");
  PrintWriter writer = response.getWriter();
  writer.println("Before sleep<br/>");
  writer.print("After newline<br/>");
  writer.flush();
  response.flushBuffer();
  try {
    Thread.sleep(5000);
  } catch (InterruptedException e) {
  }
  writer.print("After sleep<br/>");
}

我希望响应主体会导致刷新

Before sleep<br/>
After newline<br/>

立即打印,5 秒后打印最后一张。

Before sleep&lt;br/&gt;
After newline&lt;br/&gt;<strong>After sleep&lt;br/&gt;</strong>

但没有

当我使用 curl -v 查询这个 servlet 时,唯一的直接输出是标题和导致(包括)换行符的响应正文

Before sleep<br />

其余部分在 5 秒后打印。

Before sleep&lt;br/&gt;
<strong>After newline&lt;br/&gt;After sleep&lt;br/&gt;</strong>

为什么?

看起来 Web 容器正在对响应数据进行行缓冲。但这意味着 servlet 只能在换行符之前刷新响应数据,这似乎违反了规范。

有人知道为什么会这样吗?

(我将 WildFly 8.2 与 Java EE 7 / Servlets 3.1 一起使用。)

【问题讨论】:

  • 只是为了检查,你确定这不是来自curl 的行为吗?使用 Wireshark 查看原始流量可能是值得的,这样您就可以看到实际数据包的发送时间。它可能什么都不是,但它只是一个想法......
  • 谢谢@JonSkeet,你已经一针见血了!刚刚检查,客户端 正在 接收单个块中的第一段响应(直到我调用 flush() 的位置)。 curl 根本不显示换行符之后的部分,直到第二个部分在 5 秒后出现。必须是 curl 如何解码 HTTP 分块传输编码的工件。再次感谢:)

标签: java servlets buffer response


【解决方案1】:

PrintWriter 正在缓冲响应。您必须致电flush(),或发送换行符。

【讨论】:

  • OP 声称After newline&lt;br/&gt;没有提前打印。
  • 另外,我确实在response.flushBuffer() 之前致电writer.flush()
【解决方案2】:

在@JonSkeet 建议我查看实际流量后,我确定行缓冲来自curl。来自 servlet 的原始 HTTP 响应立即返回此内容

HTTP/1.1 200 OK
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked

26
Before sleep<br />
After newline<br />

5 秒后完成

11
After sleep<br />
0

所以也许curl 正在等待显示After newline&lt;br /&gt; 位,因为它正在从分块传输编码重构响应正文。

不管怎样,问题解决了。谢谢!

(编辑)

自我注意:使用这种curl 语法解码块

curl -i --raw

现在我得到的输出与上面描述的完全一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2017-07-14
    相关资源
    最近更新 更多