如何检测tomcat servlet请求的客户端已断开连接? 我读过我应该先做一个response.getOutputStream()。print(),然后做一个response.getOutputStream()。flush()并捕获一个IOException,但是有一种方法可以在不编写任何数据的情况下检测到它吗?
编辑:
Servlet发出的数据流不一定会结束,但不一定有任何数据流过它(它是实时事件流)。 我实际上需要检测客户端何时断开连接,因为那时候我需要做一些清理工作(释放资源等)。 如果我有HttpServletRequest可用,如果客户端断开连接,是否尝试从中读取抛出IOException?
is there a way I can detect this
without writing any data?
不可以,因为TCP / IP中没有一种方法可以在不写入任何数据的情况下对其进行检测。
不用担心 只需完成请求操作并编写响应即可。 如果客户端消失,则将导致IOException:连接重置,这将被抛出到servlet容器中。 您无需为此做任何事情。
"您无需为此做任何事情。" -您对此无能为力。
我编辑了问题以进行澄清。除非我绝对必须,否则我不想将虚假数据发送给客户端。
你不会的。相反,您将获得异常,容器将处理该异常。
No because there isnt a way in TCPIP to detect it without writing any data.-RST数据包怎么样?
@PavelHoral您可以激发要发送的RST数据包的唯一方法是写入数据。
@EJP:我认为这个问题尚不清楚。以我的理解disconnect发生例如客户端应用程序终止时。在这种情况下,操作系统会将RST数据包发送到服务器,这可能会触发通知。但是,如果客户端计算机断开连接(我称其为网络中断),则当然不会有RST数据包。您回答的内容仅涵盖第二种。
在许多情况下,"仅完成请求"的选项并不理想。例如,在我支持的系统中,可能会进行一些用户查询,但是它们需要很长时间才能完成而无需写入任何数据。用户可能只是断开了连接,但是直到最后,请求仍在处理中,在某些情况下,这类请求占用了所有Tomcat连接。有办法避免这种情况吗?
I need to actually detect when the client disconnects because I have some cleanup I have to do at that point (resources to release, etcetera).
此处是finally块。 无论结果如何,都将执行它。 例如。
OutputStream output = null;
try {
output = response.getOutputStream();
// ...
output.flush();
// ...
} finally {
// Do your cleanup here.
}
If I have the HttpServletRequest available, will trying to read from that throw an IOException if the client disconnects?
取决于您如何从中读取内容以及服务器内存中已经有多少个请求主体。 如果是标准格式编码的请求,则每当您事先调用getParameter()时,通常都会对其进行完全解析并将其存储在服务器内存中。 调用getInputStream()根本没有用。 最好在响应中执行此操作。
请求主体在服务器内存中不存在,直到您读取它为止(通过使用请求输入流,或者在POST带有application / x-www-form-urlencoded的情况下调用getParameter())。请求主体可以是任何大小,服务器不能仅将其缓存在内存中。
@Peter:我消除了歧义。
您是否尝试刷新响应的缓冲区:
response.flushBuffer();
客户端断开连接时,似乎引发IOException。
除非确实有东西要发送给客户端,否则它不会抛出。