gpt4 book ai didi

java - 如何正确检测 servlet 规范 3 中的客户端断开连接?

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:38 25 4
gpt4 key购买 nike

我已经尝试写入响应,因为没有正确的断开连接回调:

private boolean write(byte[] output, AsyncContext context) {
try {
OutputStream stream = context.getResponse().getOutputStream();
stream.write(output);
stream.flush();
return true;
} catch (IOException ex) {
//client disconnected
log.error(ex);
removeAsyncContext(context);
return false;
}

}

但这似乎并不奏效。当客户端断开连接时,写入和刷新缓冲区没有抛出异常

奇怪的是,当您第二次尝试写入输出流时(在断开连接之后),写入确实会抛出异常。看起来像你第一次写/刷新它时,一些内部状态被设置为错误,没有通知。

我在 Jetty 8 和 Tomcat 7 上都试过了,我看到了相同的行为。

有没有解决办法可以查出客户端是否收到消息?我错过了什么吗?

最佳答案

我知道您正在寻找一种检测断开连接的正确方法,但对于那些不介意杂乱无章的人:

注意:此方法定期向客户端发送空格字符,必须在解释结果之前对其进行修整。这是关键部分。

  1. 启动一个可以访问 servlet 响应的编写器/输出流的线程。该线程定期(我使用 1 秒间隔)向客户端发送空格字符。包装在一个 IOException try/catch block 中以设置您的中止标志。

  2. 如果连接关闭,大多数 servlet 将在无法将数据传送到客户端时抛出类似 EOFException(这是 IOException)的异常。您正在捕获此异常并设置中止标志。

  3. 当捕获到中止标志时,您有多种选择。您可以核对正在执行的线程,让您的所有处理定期检查中止标志,将异常推送到正在执行的线程,或者做任何数量的事情(此处未详细说明)。

  4. 如果该过程成功完成,您将获得以多个空格为前缀的结果。同样,请记住在您的客户身上修剪这些。

关于java - 如何正确检测 servlet 规范 3 中的客户端断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7124508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com