无论setMaxIdleTimeout的值如何,Java WebSocket会话都会超时

时间:2018-05-01 09:52:50

标签: session websocket timeout

我有以下代码(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.
})();

1 个答案:

答案 0 :(得分:2)

有几件事可能会以封闭的会议结束。

一个原因可能是Web应用程序或容器配置。例如,如果您使用tomcat,请检查onError(Exception e)文件中的超时设置。或者另一个例子是当nGinx负责路由连接时。在独立的websocket服务器上也有一些配置,根据您的实现,您可能需要检查它们。

第二个原因可能是客户端配置。稍微搜索一下如何在javascript代码中设置超时。互联网上已有很多关于它的文章和答案,我不能自己提供给你。 - 您还可以使用Java客户端进行测试,看看问题是来自服务器代码还是客户端代码。 (当然,这也需要一些配置)

您的互联网连接(除非您在本地进行测试)可能是连接失败的下一个原因。虽然通常可以通过覆盖/添加heartbeat来识别这一点。

为了保持websocket连接的活跃,还有一件事必须实现:ping系统。大多数标准websocket库支持pong和{{1}}。在每一侧(通常是服务器端),您可以将ping帧发送到另一侧,它们会自动发送回乒乓框架。这有助于保持连接活跃。如果客户端实际上在那里,这种方法也可以帮助服务器端实现!!!

正如你已经说过的那样,不要忽视它们来解决你的问题。建立一个活跃健康的websocket连接需要花费一些精力和时间来处理许多事情,忽略它们会导致更大的麻烦。

我希望这会有所帮助。