为什么不立即调用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());
答案 0 :(得分:0)
互联网如何运作?在将请求从浏览器发送到服务器之前,请求被分解为称为数据包的小块数据。 引自http://computer.howstuffworks.com/question525.htm:
每个数据包都带有有助于它到达它的信息 destination - 发件人的IP地址,预期接收者的IP 地址,告诉网络这封电子邮件有多少包 消息已被分解为此特定数据包的数量。 数据包携带Internet使用的协议中的数据: 传输控制协议/ Internet协议(TCP / IP)。每个包 包含邮件正文的一部分。典型的数据包包含 可能是1,000或1,500字节。
然后,每个数据包都以最佳可用的方式发送到目的地 route - 可能被其中所有其他数据包占用的路由 消息或消息中没有其他数据包。这使得 网络更有效率。首先,网络可以平衡负载 各种设备,以毫秒为单位。 第二,如果一件设备出现问题 在传输消息时,可以路由数据包 围绕问题,确保传递整个信息。
因此,为了使服务器能够理解客户端要求的内容,必须接收所有数据包然后进行组装。所以,你要问的几乎是不可能的。