2013-10-25 181 views
0

HTML5 Web Sockets behave strangely如果用戶刷新頁面或導航 遠離它。在重新加載頁面期間,Web服務器和瀏覽器之間的套接字連接似乎保持打開狀態,並且在Firefox和Chrome瀏覽器中重新加載頁面時關閉。這意味着它只能在瀏覽器和服務器之間每隔一段時間才能建立一個連接,因爲套接字在瀏覽器關閉時被重新加載。 Firefox中的Firebug控制檯中的錯誤消息是「與ws://.../websocket的連接」在頁面加載時中斷「。顯然,當頁面重新加載時websocket連接仍然打開,這意味着頁面加載,而不是每個打開第二頁加載過程中連接被關閉。日誌文件中讀取例如像這樣(與Websocket-Rails寶石創建)關閉HTML5 Web套接字

==> 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所有打開的插座和連接事件,東西 like(in Coffeescript)..

window.onbeforeunload =() -> 
    close_all_sockets() 

回答

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; 
    // ........ 
} 

希望這有助於。