0

为什么不立即调用 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();

小服务程序代码:

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

1 回答 1

0

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

每个数据包都携带有帮助它到达目的地的信息——发件人的 IP 地址、预期接收者的 IP 地址、告诉网络该电子邮件消息已被分成多少个数据包以及该特定数据包的数量的信息. 数据包以 Internet 使用的协议传输数据:传输控制协议/Internet 协议 (TCP/IP)。每个数据包都包含消息正文的一部分。一个典型的数据包可能包含 1,000 或 1,500 个字节。

然后通过最佳可用路由将每个数据包发送到其目的地——该路由可能被消息中的所有其他数据包采用,也可能不被消息中的任何其他数据包采用。这使得网络更加高效。首先,网络可以以毫秒为单位平衡各种设备的负载。其次,如果在传输消息时网络中的某个设备出现问题,则可以围绕问题路由数据包,从而确保整个消息的传递。

因此,为了让服务器能够理解客户端的要求,必须接收所有数据包然后进行组合。所以,你所问的实际上是不可能的。

于 2013-09-30T08:14:18.393 回答