【问题标题】:When I using http comet ,how can I let tomcat send tcp keepalive packet当我使用 http comet 时,如何让 tomcat 发送 tcp keepalive 数据包
【发布时间】:2013-12-16 18:02:15
【问题描述】:

我使用 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 keep-alive包,但是tomcat怎么配置呢?

谢谢!!!

【问题讨论】:

    标签: java sockets tomcat tcp


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我是中国人,所以我的英语很差。这个问题我已经解决了,但是当我使用tomcat 7运行comet web应用程序时,我在浏览器中收到405,我应该更改什么配置文件?
    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 2020-11-21
    • 2012-10-30
    • 2021-02-25
    • 1970-01-01
    • 2010-10-20
    • 2015-04-16
    • 2020-06-23
    相关资源
    最近更新 更多