2016-11-26 154 views
0

我正在使用SockJS客戶端庫連接到使用SockJS節點js庫的服務器。在斷開連接或刷新時關閉websocket連接

當網頁每次刷新時都會刷新與服務器的Web套接字連接。並且以前的連接不會斷開連接。因此,如果有5個刷新,則會有5個不同的Web套接字連接。

如何檢查Web套接字連接是否處於活動狀態並阻止新連接在頁面重新加載或網絡斷開連接時創建或斷開現有連接?

回答

0

您不能防止這種情況,但你可以從網絡套接字服務器心跳檢測陳舊的客戶和下降,由服務器端的連接。

或許你可以在this MDN tutorial看一看:

在握手後的任意點,客戶端或服務器可以 選擇一個ping發送給對方。當收到ping時,收件人必須儘快發回乒乓球。例如,您可以使用 來確保客戶端仍處於連接狀態。

0

每個新頁面都是它自己的新上下文,舊的上下文中的所有內容都會被丟棄瀏覽器端。因此,無法跨頁加載保留WebSocket連接。

在你的情況下,在瀏覽器端你實際上只有一個單一的WebSocket連接在任何時候:由新重新加載的頁面建立。

服務器端的問題在於,如果沒有流量,則無法區分斷開連接與不活動/非常慢的連接。

解決此問題的一個方法是使用心跳,即服務器和瀏覽器之間的常規ping/pong消息。 WebSocket在協議層面支持這一點,而服務器端WebSocket庫應該公開這種機制。這在任何情況下都很有用,因爲它可以工作,而不管斷開的方式如何(例如,網絡故障)。

對於重新加載,您應該在相關事件(beforeunload)上附加處理程序,然後執行乾淨的斷開連接。你也可以用心跳來捕捉它,但這樣你可以在下一次心跳失敗之前做出反應。