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

时间:2010-06-02 22:55:25

标签: java tomcat servlets

如何检测tomcat servlet请求的客户端是否已断开连接?我已经读过我应该做一个response.getOutputStream()。print(),然后是一个response.getOutputStream()。flush()并捕获一个IOException,但是有没有办法可以在不写任何数据的情况下检测到它? / p>

修改

servlet发出的数据流不一定会结束,但不一定有任何数据流通过它(它是一个实时事件流)。我需要实际检测客户端何时断开连接,因为我需要进行一些清理工作(要释放的资源,等等)。如果我有可用的HttpServletRequest,如果客户端断开连接,是否会尝试读取抛出IOException?

3 个答案:

答案 0 :(得分:8)

  

有没有办法可以检测到这一点   没有写任何数据?

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

不要担心。只需完成请求操作并编写响应即可。如果客户端已经消失,那将导致IOException:connection reset,它将被抛入servlet容器中。你无需做任何事情。

答案 1 :(得分:5)

  

我需要实际检测客户端何时断开连接,因为我需要进行一些清理工作(要发布的资源等)。

那里有finally块。无论结果如何,都将执行。 E.g。

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

如果我有可用的HttpServletRequest,如果客户端断开连接,是否会尝试从中读取抛出IOException?

取决于您如何阅读它以及服务器内存中已有多少请求正文。在正常格式编码请求的情况下,无论何时预先调用getParameter(),它通常都会被完全解析并存储在服务器内存中。调用getInputStream()根本没用。最好在响应上做到这一点。

答案 2 :(得分:2)

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