我有以下代码(WebSocket服务器端端点(:
@OnOpen
public void open(Session session) {
session.setMaxIdleTimeout(-1L);
...
}
在客户端,我只有:
var websocket = new WebSocket("wss://dummy.org");
websocket.onmessage = onMessage;
然而,session
在 1 或 2 分钟不活动后关闭。我在这里错过了什么吗?我应该在客户端调整一些东西吗?
编辑
我也在客户端尝试过:
websocket.onclose = reconnect;
function reconnect() {
websocket = new WebSocket("wss://dummy.org");
websocket.onclose = function() {
reconnect();
};
}
。而且(当然(它并不能解决问题。
编辑 2
我还尝试从客户端发送一条 ping 消息,端点用 pong 消息响应该消息:
(function(){
function sendPing() {
websocket.send("{"action":"ping"}");
setTimeout(sendPing, 10 * 1000); // 10 seconds.
}
setTimeout(sendPing, 10 * 1000); // 10 seconds.
})();
有几件事可能会结束一个封闭的会话。
一个原因可能是 Web 应用程序或容器配置。例如,如果使用 tomcat,请检查文件中server.xml
超时设置。或者另一个例子是当nGinx负责路由连接时。独立 websocket 服务器上也有一些配置,根据您的实现,您可能需要检查它们。
第二个原因可能是客户端配置。稍微搜索一下如何在javascript代码中设置超时。互联网上已经有很多关于它的文章和答案,我自己不能给你一个。-- 您也可以使用 Java 客户端进行测试,看看问题来自服务器代码还是客户端代码。(当然,这也需要一些配置(
您的互联网连接(除非您在本地进行测试(可能是连接失败的下一个原因。尽管通常您可以通过覆盖/添加onError(Exception e)
来识别这一点。
为了保持 websocket 连接的活动,您还必须实现一件事:heartbeat
系统。大多数标准 websocket 库都支持ping
和pong
。在每一端(通常是服务器端(,您可以将ping帧发送到另一端,它们会自动发回一个pong帧。这有助于保持连接。此方法还可以帮助服务器端了解客户端是否真的在那里!!
正如你已经说过的,不要通过忽视它们来解决你的问题。建立一个活生生的、健康的 websocket 连接需要一些努力和时间来处理许多事情,如果忽略它们,你最终会遇到更大的麻烦。
我希望这有所帮助。