Java WebSocket 会话超时,而不考虑 setMaxIdleTimeout 的值



我有以下代码(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 库都支持pingpong。在每一端(通常是服务器端(,您可以将ping帧发送到另一端,它们会自动发回一个pong帧。这有助于保持连接。此方法还可以帮助服务器端了解客户端是否真的在那里!!

正如你已经说过的,不要通过忽视它们来解决你的问题。建立一个活生生的、健康的 websocket 连接需要一些努力和时间来处理许多事情,如果忽略它们,你最终会遇到更大的麻烦。

我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新