当我使用http comet时,我怎样才能让tomcat发送tcp keepalive包

时间:2013-12-10 10:34:34

标签: java sockets tomcat tcp

我使用http comet使用此代码进行网络聊天:

public void event(CometEvent event) throws IOException, ServletException {

            HttpServletRequest request = event.getHttpServletRequest();
            HttpServletResponse response = event.getHttpServletResponse();

            String regKey = request.getParameter("rk");
            if (regKey == null) {
                return;
            }

            if (event.getEventType() == CometEvent.EventType.BEGIN) {
                event.setTimeout(Integer.MAX_VALUE);
                System.out.println("Client [" + regKey + "] login...");
                synchronized (connections) {
                    connections.put(regKey, response);
                }
            } else if (event.getEventType() == CometEvent.EventType.ERROR) {
                System.out.println("Client [" + regKey + "] error...");
                synchronized (connections) {
                    connections.remove(regKey);
                }
                event.close();
            } else if (event.getEventType() == CometEvent.EventType.END) {
                System.out.println("Client [" + regKey + "] logout...");
                synchronized (connections) {
                    connections.remove(regKey);
                }
                event.close();
            } else if (event.getEventType() == CometEvent.EventType.READ) {
                System.out.println("Client [" + regKey + "] read...");
                synchronized (connections) {
                    connections.remove(regKey);
                }
                event.close();
            }
        }

如果浏览器或客户端接近正常,我可以收到CometEvent.EventType.END事件, 但如果客户停电我没有收到任何消息。我知道TCP正在等待网络恢复,但我想处理此事件,以便更新在线列表和其他重要事项(这意味着我必须处理此事件!!!)。

我知道TCP keep-alive可以解决这个问题,但是tomcat默认不向客户端发送keep-alive数据包,我该如何解决呢。
我相信tomcat可以发送TCP保活包,但是如何配置tomcat?

感谢!!!

1 个答案:

答案 0 :(得分:1)

我不确定它是否会实现您正在寻找的行为,但您可以通过在server.xml中为NIO HTTP连接器设置socket.soKeepAlive="true"来启用TCP保持活动状态。如果您使用的是APR /本机HTTP连接器,则没有配置选项可以启用TCK keep-alive。 BIO HTTP连接器不支持Comet,因此如果要使用Comet启用TCP keep-alive,则必须使用NIO HTTP连接器。