【问题标题】:Servlet.doPost() only called after the complete request has been received by the serverServlet.doPost() 仅在服务器收到完整请求后调用
【发布时间】:2013-10-05 23:39:55
【问题描述】:

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

【问题讨论】:

    标签: http servlets asynchronous stream jetty


    【解决方案1】:

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

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

    每个数据包然后由最好的可用的发送到它的目的地 路由——可能被所有其他数据包采用的路由 消息或消息中的任何其他数据包都没有。这使得 网络更高效。首先,网络可以平衡负载 以毫秒为单位的各种设备。 二、如果一台设备出现问题 网络传输消息时,可以路由数据包 围绕问题,确保整个消息的传递。

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

    【讨论】:

    • 不,这是可能的。查看浏览器如何处理来自 http GET 请求的大型 jpeg 响应。当前几个数据包到达时,图像会部分显示,然后随着更多数据包到达,图像视图会不断更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2015-05-23
    • 1970-01-01
    • 2012-11-01
    • 2015-07-23
    • 2022-11-06
    相关资源
    最近更新 更多