我使用 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/