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

时间:2010-11-23 06:58:54

标签: java sockets tomcat servlets asynchronous

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

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

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

1 个答案:

答案 0 :(得分:1)

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

} catch(IOException ex) {
    System.out.println(ex);
    queue.remove(ac);
}

这里也是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);
    }
});

编辑:在获得更多洞察力之后。

  1. Tomcat 7.0.4仍处于测试阶段。所以,你可以期待这样的行为
  2. 我努力了,但在文档中找不到方法setAsyncTimeout()herehere。所以,我认为由于一些未知的正当理由,他们完全放弃了最终版本
  3. 示例说明,“我为什么要使用框架而不是等待Servlet 3.0异步API ”。这推断出它在最终的东西之前写的
  4. 所以,在结合所有这些事实之后,我可以说,你正试图处理从某种意义上被打破的事物。这也可能是产生不同和奇怪结果的原因。