切换网络/脱机时WebSocket客户端关闭失败

ldioqlga  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(259)

我想问一些问题,关于如何关闭一个WebSocket客户端时,离线/切换网络。
当我尝试关闭chrome中2 case的套接字时,在我调用WebSocket.close后,我很长一段时间(大约60秒)都收不到onclose事件,然后我终于收到了。
在我检查readystate后,我发现在未来的60年代,状态是2(CLOSEING),而不是变成3(CLOSED)。
所以我想知道当我在离线/切换网络的情况下调用WebSocket.close()的时候有没有遗漏的步骤。而当网络正常的时候它运行的很好。

tjrkku2a

tjrkku2a1#

您后端框架是什么?
如果你试图处理客户端的网络突然离线的情况下,有两种方法可以尝试从客户端关闭WebSocket如下.
请参考源代码here
1.使用js offline事件句柄
如果我们想检测用户是否离线,我们只需将WebSocket关闭函数添加到离线事件函数中。

前端
function closeWebSocket() {
        websocket.close();
    }

    $(window).on('beforeunload offline', event => {
        closeWebSocket();
    });
后端(网络套接字服务器)
@OnClose
    public void onClose(Session session) {
        CURRENT_CLIENTS.remove(session.getId());
    }

1.在客户端使用Ping间隔并减少服务器端的WebSocket超时
如果WebSocket服务器在特定时间内没有收到任何消息,就会导致超时,所以我们可以使用这种机制来减少超时时间,以便在客户端由于离线而没有发送任何ping消息时关闭会话。

前端
// send ping to server every 3 seconds
    const keepAlive = function (timeout = 20000) {
        if (websocket.readyState === websocket.OPEN) {
            websocket.send('ping');
        }

        setTimeout(keepAlive, timeout);
    };
后端(Web套接字配置)
@Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxSessionIdleTimeout(5000L);

        return container;
    }

相关问题