java - 当我使用http comet时,如何让tomcat发送tcp keepalive数据包

标签 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 keep-alive包,但是怎么配置tomcat?

谢谢!!!

最佳答案

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

关于java - 当我使用http comet时,如何让tomcat发送tcp keepalive数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20492080/

相关文章:

java - Fernflower 和 IntelliJ IDEA 的 java 反编译器

java - 为 StringTokenizer 中的空内容赋值

c - 在Linux上使用套接字发出https请求

C 套接字 : handle variable length packets

c - C 中的 AF_PACKET 套接字不使用 SOCK_RAW 发送空 UDP 数据包

java - 是否可以(或理智地)为 tomcat 应用程序部署使用备用依赖项样式?

java - 将 Java Set 转换为PreparedStatement setString 方法的参数

java - 使用Gson读取Json String结果报错 "not a JSON Array"

java - Tomcat 身份验证和特定 Web 应用程序身份验证

tomcat - 如果其中的 Web 应用程序必须支持与 LDAPS 的连接,是否应将 tomcat 更改为 SSL 模式?