在tomcat servlet中检测客户端断开连接?

问题描述:

如何检测到tomcat servlet请求的客户端已断开连接?我读过我应该做一个response.getOutputStream()。print(),然后是一个response.getOutputStream()。flush()并捕获一个IOException,但有没有一种方法可以检测到这一点,而无需编写任何数据?在tomcat servlet中检测客户端断开连接?

编辑

该servlet发出,这并不一定最终的数据流,但不一定具有流经它的所有数据(它的实时事件流)。我需要实际检测客户端何时断开连接,因为我必须在那一点做一些清理工作(释放资源,等等)。如果我有HttpServletRequest可用,如果客户端断开,会尝试从中读取抛出IOException。

有没有办法在不写数据的情况下检测到这个 ?

不,因为TCP/IP没有办法在没有写入任何数据的情况下检测到它。

别担心。只需完成请求操作并编写响应即可。如果客户端消失了,那会导致一个IOException:连接重置,它将被抛入到servlet容器中。没有什么你需要做的。

+2

*“你不需要做任何事情。”* - 你无能为力。 – 2010-06-03 03:28:51

+0

我编辑了这个问题来澄清。除非我绝对必须,否则我不想向客户发送虚假数据。 – Seth 2010-06-03 04:20:34

+0

你不会。你会得到一个异常,而容器会处理它。 – EJP 2010-06-03 12:26:47

我需要实际检测何时客户端断开,因为我有一些清理工作,我必须在这一点(资源释放,etcetera)。

finally块用于。无论结果如何,它都会被执行。例如。

OutputStream output = null; 
try { 
    output = response.getOutputStream(); 
    // ... 
    output.flush(); 
    // ... 
} finally { 
    // Do your cleanup here. 
} 

如果我有HttpServletRequest的面世,便试图读取,如果客户端断开连接从抛出IOException?

取决于您如何从中读取数据,以及服务器内存中已有多少请求主体。如果是正常格式的编码请求,无论您何时预先拨打getParameter(),它通常都会被完全解析并存储在服务器内存中。调用getInputStream()根本没用。相反,最好在响应中进行。

+0

请求主体不在服务器内存中,直到您读取它为止(通过使用请求输入流或使用application/x-www-form-urlencoded在POST中调用getParameter())。请求体可以是任何大小的,服务器不能将它缓存在内存中。 – 2016-01-29 11:07:14

+0

@彼得:我已经消除了歧义。 – BalusC 2016-01-29 11:17:48

您是否尝试刷新响应的缓冲区: response.flushBuffer(); 似乎在客户端断开连接时抛出IOException。

+0

它不会抛出,除非它真的有东西发送给客户端。 – 2017-08-22 05:17:53