Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止servlet缓冲响应内容_Java_Servlets_Httpclient_Outputstream_Buffering - Fatal编程技术网

Java 如何防止servlet缓冲响应内容

Java 如何防止servlet缓冲响应内容,java,servlets,httpclient,outputstream,buffering,Java,Servlets,Httpclient,Outputstream,Buffering,我有一个servlet,它将字节写入其输出流。内容的大小可能很大。我想阻止servlet进行任何缓冲。 防止响应缓冲的最佳方法是什么?我不想自己调用ServletOutputStream上的flush()或close(),因为我假设servlet容器应该为我这样做。 在这种情况下,如果servlet调用flush()和close(),字节驻留在哪里httpclient还没有读取字节。每个servlet容器都提供了HttpServletRequest和HttpServletResponse实现的幕

我有一个servlet,它将字节写入其输出流。内容的大小可能很大。我想阻止servlet进行任何缓冲。 防止响应缓冲的最佳方法是什么?我不想自己调用ServletOutputStream上的flush()或close(),因为我假设servlet容器应该为我这样做。
在这种情况下,如果servlet调用flush()和close(),字节驻留在哪里httpclient还没有读取字节。

每个servlet容器都提供了HttpServletRequest和HttpServletResponse实现的幕后实现,这意味着您不知道一个容器中的backing impl是否缓冲了写入,而另一个容器中没有

这就是说,缓冲将被限制为一个小的多KB大小(如果已经完成),这样您就可以简单地一遍又一遍地将()写入输出流,而不必担心内存问题。impl将通过线路将这些字节流传输到网络连接,再传输到客户端,在客户端,网络硬件、操作系统和客户端代码的任务是缓冲和读取所有内容

TCP将自动处理ACK并重新发送丢失的数据


简言之,您不需要担心客户“赶超”;只要写下您的数据,客户端上的所有内容都将与TCP相结合,以便在那里获取数据。

谢谢。。我仍然想知道在调用flush之后字节会到哪里去。。它们是否在客户端进行缓冲?它们被推送到操作系统的网络堆栈中,因此,现在操作系统的TCP/IP网络代码负责确保客户端接收所有数据(发送缓冲区)。在网络硬件本身上也有缓冲,然后在所有这些级别的客户端上都有缓冲。这是智能网络协议设计允许我们在编写网络代码时忽略的一个复杂程度。。因此,我想答案是ServletOutputstream上的close()和flush(),这是确保服务器上不发生缓冲所需的全部,大多数Servlet容器为您关闭并刷新,这样您甚至不需要自己完成。谢谢!您需要首先执行flush()(强制任何缓冲区中的任何字节(如果有的话)进入网络流),然后关闭()以终止连接。如果先关闭()并有字节挂起,它们将在缓冲区中单独消失,并且永远不会发送到客户端。但是,是的,你是对的,你不需要担心缓冲,服务器会做正确的事情。