0

如果用户刷新页面或离开页面,HTML5 Web Sockets 的行为会很奇怪。在页面重新加载期间,网络服务器和浏览器之间的套接字连接似乎保持打开状态,并且如果页面在浏览器中重新加载,则在 Firefox 和 Chrome 中关闭。这意味着它只在浏览器和服务器之间建立连接每秒钟工作一次,因为套接字在 reload 时被浏览器关闭。Firefox 的 Firebug 控制台中的错误消息是“与 ws://.../websocket 的连接在页面加载时被中断”。显然,当页面重新加载时 websocket 连接仍然打开,这意味着连接在页面加载期间关闭,而不是每隔一个页面加载打开一次。Websocket-Rails宝石)

==> first page load
[ConnectionManager] Connection opened: #<Connection::fef69428febee72f4830>
[Channel] #<Connection::fef69428febee72f4830> subscribed to channel xyz

==> second page load
[Channel] #<Connection::dfc4b33090b95826e08e> unsubscribed from channel xyz
[ConnectionManager] Connection closed: #<Connection::dfc4b33090b95826e08e>

有没有办法在onbeforeunloadJavascript事件中关闭所有打开的套接字和连接,比如(在Coffeescript中)..

  window.onbeforeunload = () ->
    close_all_sockets()
4

1 回答 1

1

这有点棘手,但您可以通过创建一个新的 WebSocket,并通过其协议参数发送应该断开连接的用户的标识来实现。

例如 :

window.onbeforeunload = function () {
    new WebSocket(myWebSocket.url, myUserName + "*" + myPassword);
}

服务器在收到使用此非标准协议的新连接请求时,必须关闭相应的连接。

这是我在服务器(C#)的握手代码中所做的:

switch (handshakeKey)
{
    // ..........
    case "Sec-WebSocket-Protocol":
        string[] infos = handshakeValue.Split('*');
        if (infos.Length == 2)
        {
            Guest aguest = server.FindGuest(infos[0]);
            if (aguest != null && aguest.password == infos[1]) server.RemoveGuest(aguest);
            // The removeGuest function closes its socket            }
        TCPClient.Close(); // close the temporary connection
        break;
    // ........
}

希望这可以帮助。

于 2013-12-03T16:22:21.793 回答