如何知道客户端是否已关闭连接

SS3*_*SS3 6 java sockets tomcat asynchronous servlets

我一直在玩Tomcat 7.0.4的新Servlet 3.0异步功能.我找到了这个聊天应用程序,它允许客户端挂起GET请求以获取消息更新.在接收消息时这很好用.

当客户端断开连接时,即用户关闭浏览器时,会出现问题.IOException即使客户端断开连接,服务器似乎也没有引发.消息线程(参见上面链接的源代码)很乐意写入所有存储AsyncContext的输出流.

这是Tomcat的错误吗?或者我在这里遗失了什么?如果这不是一个错误,那么我应该如何检测客户端是否已关闭连接?

Ade*_*ari 1

第 44 - 47 行的代码正在处理它,

} catch(IOException ex) {
    System.out.println(ex);
    queue.remove(ac);
}
Run Code Online (Sandbox Code Playgroud)

这里也是 75 - 83,使用超时机制,

req.addAsyncListener(new AsyncListener() {
    public void onComplete(AsyncEvent event) throws IOException {
        queue.remove(ac);
    }

    public void onTimeout(AsyncEvent event) throws IOException {
        queue.remove(ac);
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑:有了更多的了解之后。

  1. Tomcat 7.0.4 仍处于测试阶段。所以,你可以期待这样的行为
  2. setAsyncTimeout()我努力尝试,但在文档中找不到该方法,无论是here还是here。所以,我认为由于某些未知的正当原因,他们在最终版本中完全放弃了它
  3. 该示例指出“为什么我应该使用该框架而不是等待 Servlet 3.0 Async API ”。这表明它是在最后的事情之前写的

所以,在结合所有这些事实之后,我可以说,你正在尝试处理某种意义上被破坏的东西。这也可能是导致不同且奇怪的结果的原因。