Java-HttpServlet:何时将响应发送到客户端?

Java-HttpServlet:何时将响应发送到客户端?,java,httpresponse,Java,Httpresponse,为了更好地理解它,我很少尝试一些HttpServlet的东西。我想构建一个场景,即请求正在传入,我需要相应地尽快发送响应,然后在servlet中做更多的工作。根据我目前的理解,只有在返回doGet或doPost方法时,才应该将响应发送给客户机。但在我的示例中,响应已经在servlet中的命令处理过程中发送回客户机。所以它已经在我没想到的时候被归还了 protected void processRequest(HttpServletRequest request, HttpServletRespo

为了更好地理解它,我很少尝试一些HttpServlet的东西。我想构建一个场景,即请求正在传入,我需要相应地尽快发送响应,然后在servlet中做更多的工作。根据我目前的理解,只有在返回doGet或doPost方法时,才应该将响应发送给客户机。但在我的示例中,响应已经在servlet中的命令处理过程中发送回客户机。所以它已经在我没想到的时候被归还了

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex);
        }

        response.setContentType("text/plain; charset=ISO-8859-1");
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        final StringWriter sw = new StringWriter();
        PrintWriter out = new PrintWriter(sw);
        //TODO most be implemented SynchronizedStatusCodeDimo
        out.println("StatusCode=0");
        out.println("StatusText=Accepted");
        out.println("paymentType=PaymentXY");
        out = response.getWriter();
        out.print(sw.toString());
        out.flush();
        out.close();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex);
        } }

这里发生了什么,通过Firebug,我看到我已经收到了510ms后生成的响应。我想我需要超过1500毫秒的睡眠时间。我的理解是基于这篇文章的:

HttpServletResponse将由servlet容器(Tomcat、Jetty等)控制

如果写入
响应
,servlet容器将在定义的缓冲区大小后自动刷新
响应
(例如,9000字节后的Tomcat)。通常您可以配置它(在Tomcat中使用参数
socketBuffer
)。 这就是它的工作方式,如果你不自己控制它的话

在您的情况下,您可以自己控制响应,在调用
response.flush()
之后,响应将被发送到客户端。 如果您已经写入了9000字节(在Tomcat中),那么响应将自动发送(在整个过程中)


(请原谅我英语不好)

这里有什么问题?那个冲水冲水?还是close()关闭了?为什么这会如此令人惊讶?在成功回调request1之后,我们是否可以从客户端响应request2。请求2可以基于请求1响应进行进一步的处理。是的,也许根本没有问题,我在第一个地方得到的只是错误的,并且在servlet完成的所有事情之后都期待响应(所以当DOGET/DOPMOST返回),不像处理过程中的这里。谢谢。但在我的示例中,out.close()强制发送响应。当我删除out.close()行并且只有out.flush()时,响应会在1500ms后发送,因此在发送响应之前会处理两个休眠。这是不正确的。在第一种情况下,答案在大约500毫秒后开始(在out.flush()之后),并且在500毫秒后结束,因为您关闭了流。在第二个示例中,服务器在500毫秒后启动响应(out.flush()之后),但响应在1500毫秒后结束,因为servlet容器在完成之后关闭了流。你应该在Firebug中看到这一点我明白,现在完全有道理了。谢谢