我想问一些问题,关于如何关闭一个WebSocket客户端时,离线/切换网络。当我尝试关闭chrome中2 case的套接字时,在我调用WebSocket.close后,我很长一段时间(大约60秒)都收不到onclose事件,然后我终于收到了。在我检查readystate后,我发现在未来的60年代,状态是2(CLOSEING),而不是变成3(CLOSED)。所以我想知道当我在离线/切换网络的情况下调用WebSocket.close()的时候有没有遗漏的步骤。而当网络正常的时候它运行的很好。
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); };
@Bean public ServletServerContainerFactoryBean createWebSocketContainer() { ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); container.setMaxSessionIdleTimeout(5000L); return container; }
1条答案
按热度按时间tjrkku2a1#
您后端框架是什么?
如果你试图处理客户端的网络突然离线的情况下,有两种方法可以尝试从客户端关闭WebSocket如下.
请参考源代码here。
1.使用js offline事件句柄
如果我们想检测用户是否离线,我们只需将WebSocket关闭函数添加到离线事件函数中。
前端
后端(网络套接字服务器)
1.在客户端使用Ping间隔并减少服务器端的WebSocket超时
如果WebSocket服务器在特定时间内没有收到任何消息,就会导致超时,所以我们可以使用这种机制来减少超时时间,以便在客户端由于离线而没有发送任何ping消息时关闭会话。
前端
后端(Web套接字配置)