【发布时间】:2016-11-26 21:36:24
【问题描述】:
我正在使用 SockJS 客户端库连接到使用 SockJS 节点 js 库的服务器。
当网页每次刷新时,它都会与服务器建立新的 Web 套接字连接。并且之前的连接不会断开。因此,如果有 5 次刷新,就会有 5 个不同的 Web 套接字连接。
如何检查 Web 套接字连接是否处于活动状态并防止新连接在页面重新加载或网络断开时创建或断开现有连接?
【问题讨论】:
标签: javascript websocket
我正在使用 SockJS 客户端库连接到使用 SockJS 节点 js 库的服务器。
当网页每次刷新时,它都会与服务器建立新的 Web 套接字连接。并且之前的连接不会断开。因此,如果有 5 次刷新,就会有 5 个不同的 Web 套接字连接。
如何检查 Web 套接字连接是否处于活动状态并防止新连接在页面重新加载或网络断开时创建或断开现有连接?
【问题讨论】:
标签: javascript websocket
每个新页面都是它自己的新上下文,旧上下文中的所有内容都会在浏览器端被丢弃。所以没有办法在页面加载时保持 WebSocket 连接。
在您的情况下,在浏览器端,您实际上在任何时候都只有一个 WebSocket 连接:由新重新加载的页面建立。
服务器端的问题是,如果没有流量,则无法区分断开连接与非活动/非常慢的连接。
解决此问题的一种方法是使用心跳,即服务器和浏览器之间的定期 ping/pong 消息。 WebSocket 在协议级别支持这一点,服务器端 WebSocket 库应该公开这种机制。这在任何情况下都很有用,因为无论断开连接如何发生(例如网络故障),它都能正常工作。
对于重新加载,您应该将处理程序附加到相关事件 (beforeunload),然后彻底断开连接。您也可以通过心跳捕捉到这一点,但这样您就可以在下一次心跳失败之前做出反应。
【讨论】:
您无法阻止这种情况,但您可以从 Web Socket 服务器 执行 heartbeats 来检测过时的客户端并从服务器端断开连接。
或许你可以看看this MDN tutorial:
在握手之后的任何时候,客户端或服务器都可以 选择向对方发送 ping。当收到 ping 时, 收件人必须尽快寄回乒乓球。您可以使用 例如,这是为了确保客户端仍处于连接状态。
【讨论】: