java - 如何知道客户端是否关闭了连接

标签 java sockets tomcat servlets asynchronous

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

当客户端断开连接时会出现问题,即用户关闭浏览器。似乎服务器没有引发 IOException,即使客户端已断开连接。消息线程(请参阅上面链接中的源代码)正在愉快地写入所有存储的 AsyncContext 的输出流。

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

最佳答案

第 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()here , 也不 here .所以,我认为由于一些未知的正当理由,他们在最终版本中完全放弃了它
  3. 示例指出,“为什么我应该使用框架而不是等待 Servlet 3.0 Async API”。这表明它是在最后一件事之前写的

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

关于java - 如何知道客户端是否关闭了连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4253514/

相关文章:

java - Morphia 查询日期范围

java - 如果 3 个按钮相同,如何使用 selenium 代码选择第二个按钮

java - 测量某个数据结构的内存使用情况

tomcat - 具有不同上下文路径的 Nginx 反向代理

java - Openshift - 在浏览器上使用端口 8080 访问 tomcat IP 地址

java - 如何从依赖于其他 jar 文件的 ant 运行 jar

java - MockWebServer 的 takeRequest() 方法需要很长时间才能响应或挂起

c - 为什么服务器在客户端应用程序处于 STOPPED 状态后等待客户端?

Java套接字读取输入流而不阻塞

java - 使用 BufferedReader.readLine() 读取 inputStream 太慢