Java 在TomcatServlet中检测客户端断开连接?

Java 在TomcatServlet中检测客户端断开连接?,java,tomcat,servlets,Java,Tomcat,Servlets,如何检测TomcatServlet请求的客户端已断开连接?我已经读到我应该做一个response.getOutputStream().print(),然后做一个response.getOutputStream().flush()并捕获IOException,但是有没有一种方法可以在不写入任何数据的情况下检测到这一点 编辑: servlet发送的数据流不一定结束,但不一定有任何数据流过(它是一个实时事件流)。我需要实际检测客户端何时断开连接,因为此时我必须进行一些清理(要发布的资源,等等)。如果我

如何检测TomcatServlet请求的客户端已断开连接?我已经读到我应该做一个response.getOutputStream().print(),然后做一个response.getOutputStream().flush()并捕获IOException,但是有没有一种方法可以在不写入任何数据的情况下检测到这一点

编辑

servlet发送的数据流不一定结束,但不一定有任何数据流过(它是一个实时事件流)。我需要实际检测客户端何时断开连接,因为此时我必须进行一些清理(要发布的资源,等等)。如果我有可用的HttpServletRequest,如果客户端断开连接,尝试从中读取会引发IOException吗

有没有办法让我发现 不写任何数据

否,因为TCP/IP中没有一种方法可以在不写入任何数据的情况下检测到它

别担心。只需完成请求操作并编写响应。如果客户机消失,将导致IOException:connection reset,它将被抛出到servlet容器中。对此你无需做任何事

有没有办法让我发现 不写任何数据

否,因为TCP/IP中没有一种方法可以在不写入任何数据的情况下检测到它

别担心。只需完成请求操作并编写响应。如果客户机消失,将导致IOException:connection reset,它将被抛出到servlet容器中。对此你无需做任何事

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

在那里,
最后
块是用于。无论结果如何,它都将被执行。例如

OutputStream output = null;
try {
    output = response.getOutputStream();
    // ...
    output.flush();
    // ...
} finally {
    // Do your cleanup here.
}
如果我有可用的HttpServletRequest,如果客户端断开连接,尝试从中读取会引发IOException吗

这取决于您从中读取数据的方式以及服务器内存中已经有多少请求体。对于正常形式的编码请求,每当您事先调用
getParameter()
时,它通常会被完全解析并存储在服务器内存中。调用
getInputStream()。最好在回应上做

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

在那里,
最后
块是用于。无论结果如何,它都将被执行。例如

OutputStream output = null;
try {
    output = response.getOutputStream();
    // ...
    output.flush();
    // ...
} finally {
    // Do your cleanup here.
}
如果我有可用的HttpServletRequest,如果客户端断开连接,尝试从中读取会引发IOException吗


这取决于您从中读取数据的方式以及服务器内存中已经有多少请求体。对于正常形式的编码请求,每当您事先调用
getParameter()
时,它通常会被完全解析并存储在服务器内存中。调用
getInputStream()。最好对响应执行此操作。

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

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

“对此您无需做任何事。”-您对此也无能为力。我编辑了问题以澄清问题。我不想向客户发送虚假数据,除非我必须这样做。你不会的。您将得到一个异常,容器将处理它。
否,因为TCP/IP中没有一种方法可以在不写入任何数据的情况下检测到它。
-那
RST
数据包呢?在许多情况下,“仅完成请求”选项并不好。例如,在我支持的系统中,可能会有一些用户查询,但它们需要很长时间才能完成,而不需要写入任何数据。用户可以断开连接,但请求仍在处理中,直到结束,在某些情况下,这类请求占用了所有Tomcat连接。这是避免这种情况的一种方法吗?“你对此不必做任何事。”-你对此也无能为力。我编辑了这个问题来澄清。我不想向客户发送虚假数据,除非我必须这样做。你不会的。您将得到一个异常,容器将处理它。
否,因为TCP/IP中没有一种方法可以在不写入任何数据的情况下检测到它。
-那
RST
数据包呢?在许多情况下,“仅完成请求”选项并不好。例如,在我支持的系统中,可能会有一些用户查询,但它们需要很长时间才能完成,而不需要写入任何数据。用户可以断开连接,但请求仍在处理中,直到结束,在某些情况下,这类请求占用了所有Tomcat连接。这是避免这种情况的一种方法吗?请求正文不在服务器内存中,除非您读取它(通过使用请求输入流,或者在使用application/x-www-form-urlencoded发布的情况下调用getParameter())。请求正文可以是任意大小,服务器不能只将其缓存在内存中。@彼得:我已经消除了歧义。请求正文不在服务器内存中,除非您读取它(通过使用请求输入流,或者在使用application/x-www-form-urlencoded发布的情况下调用getParameter())。请求正文可以是任意大小,服务器不能只是将其缓存在内存中。@Peter:我已经消除了歧义。它不会抛出,除非它真的有东西要发送给客户端。它不会抛出,除非它真的有东西要发送给客户端。