如何检测tomcat servlet请求的客户端是否已断开连接?我已经读过我应该做一个response.getOutputStream()。print(),然后是一个response.getOutputStream()。flush()并捕获一个IOException,但是有没有办法可以在不写任何数据的情况下检测到它? / p>
修改:
servlet发出的数据流不一定会结束,但不一定有任何数据流通过它(它是一个实时事件流)。我需要实际检测客户端何时断开连接,因为我需要进行一些清理工作(要释放的资源,等等)。如果我有可用的HttpServletRequest,如果客户端断开连接,是否会尝试读取抛出IOException?
答案 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。