Servlet.doPost()仅在服务器收到完整请求后调用

时间:2013-09-30 07:26:34

标签: http servlets asynchronous stream jetty

为什么不立即调用doPost()? 客户端打开HttpUrlConnection并开始发布数据,定期刷新输出缓冲区。它使用10秒完成帖子。 我需要我的servlet接收帖子,并在收到第一个字节后立即从InputStream开始读取。但是,只有在帖子完成后才会调用doPost()。 怎么解决这个问题? 这是否意味着Web容器正在缓冲请求?我怎么能阻止它呢?

客户代码:

    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setDoOutput(true);
    con.setRequestMethod("POST");
    OutputStream output = con.getOutputStream();
    for(int i = 0; i < 10; i++) {
        byte[] buffer = new byte[10000];
        output.write(buffer, 0, buffer.length);
        output.flush();
        System.out.println("partial POST done." + DateTime.now());
        Thread.sleep(1000);
    }
    output.close();

Servlet代码:

protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws IOException {
    System.out.println("doPost() " + DateTime.now());

1 个答案:

答案 0 :(得分:0)

互联网如何运作?在将请求从浏览器发送到服务器之前,请求被分解为称为数据包的小块数据。 引自http://computer.howstuffworks.com/question525.htm

  

每个数据包都带有有助于它到达它的信息   destination - 发件人的IP地址,预期接收者的IP   地址,告诉网络这封电子邮件有多少包   消息已被分解为此特定数据包的数量。   数据包携带Internet使用的协议中的数据:   传输控制协议/ Internet协议(TCP / IP)。每个包   包含邮件正文的一部分。典型的数据包包含   可能是1,000或1,500字节。

     

然后,每个数据包都以最佳可用的方式发送到目的地   route - 可能被其中所有其他数据包占用的路由   消息或消息中没有其他数据包。这使得   网络更有效率。首先,网络可以平衡负载   各种设备,以毫秒为单位。   第二,如果一件设备出现问题   在传输消息时,可以路由数据包   围绕问题,确保传递整个信息。

因此,为了使服务器能够理解客户端要求的内容,必须接收所有数据包然后进行组装。所以,你要问的几乎是不可能的。