Tomcat不会刷新响应缓冲区

sof*_*sof 7 java tomcat servlets tomcat7

我测试HttpResponse#flushBufferPrintWriter#flushTomcat 7下方,但它似乎是回应,而忽略了他们比尽快冲洗过线的内容符合市场预期.

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

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

        PrintWriter pw = response.getWriter();
        pw.println("say hi now");
        pw.flush();
        response.flushBuffer();
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
        }
        pw.println("say bye in 5 seconds");

    }

}
Run Code Online (Sandbox Code Playgroud)

在延迟之后,浏览器一起显示"hi"和"bye".这是不正当行为还是打算?

@编辑

根据@Tomasz Nurkiewicz我的建议,我再次测试,curl然后问题就消失了.似乎标准的浏览器和tcp/ip monitorsmall pieces of contents来自同一个http响应将它们组合在一起.

@EDIT 2

它也观察到,HttpResponse#flushBuffer并且PrintWriter#flush驱动Tomcat 7发送客户端分块数据.

小智 6

我刚才有同样的问题.要阻止浏览器等待页面完成加载,然后才能进行任何渲染,您需要从以下开始:

response.setContentType("text/html;charset=UTF-8");
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 3

APIflushBuffer()非常精确:

强制将缓冲区中的任何内容写入客户端。调用此方法会自动提交响应,这意味着将写入状态代码和标头。

因此,要么 Tomcat 没有按照规范实现(更积极地缓冲,如果太小则保持刷新),要么客户端(浏览器)在实际渲染之前等待更多输入。

你可以尝试用nc代替吗?