我正在测试一个客户端服务器应用程序,以了解Servlet何时实际接收/写入数据到客户端。
测试设置有一个客户端Java程序,它读取文件并将文件POST到Servlet。
只有在客户端完成将整个文件(4 MB)数据写入套接字后,服务器才会开始读取该数据。类似地,当Servlet使用PrintWriter发送响应时,只有当Servlet中的doPost(...)方法返回时,响应才会到达客户端。经过测试,Tomcat内存并没有增加......
什么时候建立Servlet连接/会话?当客户端将前几个字节的数据写入套接字时,为什么Servlet不会立即读取数据?
答案 0 :(得分:2)
这就是它的工作方式。在从客户端收到整个请求之前,容器不会调用servlet。以任何其他方式进行将意味着任何数量的不可预见的后果。对于初学者,您必须在所有servlet中进行手动完成检查,这只会添加不必要的样板代码。
如果您希望能够在收到HTTP请求后立即对其进行响应,则必须编写自己的套接字程序,绑定并侦听端口并自行处理输入。
输出是另一回事。输出流缓冲所有servlet输出,但您可以随时在ServletResponse上调用flushBuffer()以强制它发送所有当前缓冲的内容。关于此的警告,一旦您开始向客户端发送数据,响应将被视为“已提交”。这是因为HTTP协议要求某些信息以特定顺序出现。例如,必须先发送标头,这意味着一旦“提交”响应,服务器应用程序就不能再添加标头和cookie。在servlet完成执行后,容器将始终调用flushBuffer()(或ServletOutputStream上的flush())。