HTML5 如果用户刷新页面或导航,Web 套接字的行为会很奇怪远离它。在重新加载页面期间,Web 服务器和浏览器之间的套接字连接似乎保持打开状态,如果页面在浏览器中重新加载,则在 Firefox 和 Chrome 中关闭。这意味着它每隔一段时间才能在浏览器和服务器之间建立连接,因为套接字在重新加载时被浏览器关闭。Firefox 控制台中的错误消息是"页面加载时与 ws://.../websocket 的连接中断"。因此,显然在重新加载页面时,websocket 连接仍然打开,这意味着连接在页面加载期间关闭,而不是每隔页面加载打开一次。例如,像这样读取的日志文件(使用 Websocket-Rails gem 创建)
==> 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>
有没有办法关闭 onbeforeunload
Javascript 事件中的所有打开的套接字和连接,有些东西喜欢(在咖啡脚本中)。
window.onbeforeunload = () ->
close_all_sockets()
这有点棘手,但您可以通过创建新的 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;
// ........
}
希望这有帮助。