【问题标题】:Comet and NIO - Client disconnectComet 和 NIO - 客户端断开连接
【发布时间】:2011-08-10 04:25:42
【问题描述】:

我有这门课:

public class CometServlet extends HttpServlet implements CometProcessor{
private static final Integer TIMEOUT = 20 * 1000;

@Override
public void event(final CometEvent event) throws IOException, ServletException {

    HttpServletRequest request = event.getHttpServletRequest();
    HttpServletResponse response = event.getHttpServletResponse();
    if (event.getEventType() == CometEvent.EventType.BEGIN) {
        request.setAttribute("org.apache.tomcat.comet.timeout", TIMEOUT);
        System.out.println("Begin for session: " + request.getSession(true).getId());
    } else if (event.getEventType() == CometEvent.EventType.ERROR) {
        System.out.println("Error for sessions: " + request.getSession(true).getId());
        if(event.getEventSubType() == EventSubType.TIMEOUT) {
            System.out.println("timeout for session: " + request.getSession(true).getId());
        }
        else if(event.getEventSubType() == EventSubType.IOEXCEPTION) {
            System.out.println("ioexception for session: " + request.getSession(true).getId());
        }
        else if(event.getEventSubType() == EventSubType.CLIENT_DISCONNECT) {
            System.out.println("client disconnect for session: " + request.getSession(true).getId());
        }
        response.getWriter().close();
        event.close();
    } else if (event.getEventType() == CometEvent.EventType.END) {
        System.out.println("End for session: " + request.getSession(true).getId());
        if(event.getEventSubType() == EventSubType.WEBAPP_RELOAD) {
            System.out.println("webappreload for session: " + request.getSession(true).getId());
        }
        else if(event.getEventSubType() == EventSubType.SESSION_END) {
            System.out.println("sessionend for session: " + request.getSession(true).getId());
        }
        response.getWriter().close();
        event.close();
    } else if (event.getEventType() == CometEvent.EventType.READ) {
        InputStream is = request.getInputStream();
        byte[] buf = new byte[512];
        do {
            int n = is.read(buf); //can throw an IOException
            if (n > 0) {
                log("Read " + n + " bytes: " + new String(buf, 0, n) 
                + " for session: " + request.getSession(true).getId());
            } else if (n < 0) {
                System.out.println("error(event, request, response)");
                return;
            }
        } while (is.available() > 0);
    }
}
}

但我抓不到event.getEventSubType() == EventSubType.CLIENT_DISCONNECT。 你能帮帮我吗?

【问题讨论】:

  • 你是如何触发它的?
  • 我有一个移动 java 客户端,它提交一个简单的 get 请求并等待来自服务器的响应。但我必须管理网络断开连接,我无法捕捉到这个子类型事件。

标签: java servlets client comet nio


【解决方案1】:

似乎 CLIENT_DISCONNECT 仅用作 ERROR 的子类型,并且在从客户端关闭套接字时发生。

【讨论】:

  • 我试过了,但是类型错误只在超时而不是客户端断开时启动。
  • 是但超时也表示连接没有关闭。我认为您应该在“event.close();”之后测试 event.getEventSubType() 发生了什么打电话。
  • 我不明白。我只需要知道客户端何时关闭套接字连接,以便我可以关闭 tomcat 上的会话。但是这个“错误”从未被抓住......
  • event.getEventType() == CometEvent.EventType.ERROR,此语句仅在超时而不是在 CLIENT_DISCONNECT 事件类型中调用。
  • 是的,但也许 CLIENT_DISCONNECT 是在 close() 期间定义的。我的意思是: - 1:SubTypeEvent = Timeout - 2:event.close(); - 3 : SubTypeEvent TIMEOUT 被 CLIENT_DISCONNECT 取代
猜你喜欢
  • 2023-03-16
  • 2010-11-01
  • 1970-01-01
  • 2017-07-17
  • 2021-12-05
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多