2013-03-01 46 views
4

服務器如何知道如何在以下情況和其他情況下關閉HTML5中的Web套接字連接。HTML 5 - 瀏覽器上的Web套接字關閉

  1. 瀏覽器突然關閉
  2. 刷新瀏覽器(新的套接字連接建立或者它仍然會使用現有的連接)
  3. 系統突然斷電
+0

結賬保持活力。 http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html – nycynik 2013-03-07 14:58:29

回答

0

你的問題的最容易的部分是瀏覽器刷新部分。 IE,FF和Chrome將關閉打開的連接並打開一個新連接。我想,其他任何瀏覽器都會這樣做。

點1和3我只能猜測:如果客戶端仍然可以乾淨地關閉tcp連接,服務器將立即識別出連接已關閉。如果您正在使用tomcat,則將調用MessageInbound實例的onClose方法。

如果客戶端無法乾淨地關閉tcp連接,服務器將等待某種超時。服務器在嘗試向套接字寫入內容時肯定會超時。你可以實現一個心跳機制來做到這一點。 Websockets似乎可以選擇自動心跳,但並不是所有的瀏覽器和服務器都支持它。

1

如果客戶端退出而不能通知服務器,TCP實現的基本特徵定義了行爲。

只要你的應用程序(和主機系統本身)不試圖通過這個斷開的連接發送任何數據,主機就不會意識到有什麼問題。因此,從服務器的角度來看,連接可能會長時間處於「打開」狀態並分配資源。

但是,在試圖將數據發送到遠端時,遠端將不會確認檢索並且TCP重傳發揮作用。它涉及一定數量的重複和使用超時。確切的參數取決於實現(正在使用的操作系統)。當重傳最終失敗時,TCP連接關閉,資源在服務器端釋放。所以,你可以

  • 依賴這樣的事實,在某些時候你的應用程序可能需要寫入缺少遠端,並且同時也引發了死連接的檢測
  • 檢測缺少遠程結束自己通過在應用程序級別使用類似ping的東西
  • 通過TCP保持技術在操作系統級別上使用類似ping的東西。
0

如果用戶使用打開的Web套接字關閉瀏覽器選項卡,服務器將不知道該服務器已被立即關閉。但是,正如Jan-Philip所說,如果您嘗試編寫操作將會失敗,並使用給出的錯誤知道連接的當前狀態。

例如,當使用ws lib for nodejs時,如果您嘗試將數據發送到已關閉的websocket,則會引發異常,並顯示類似[Error:not opened]的錯誤。他們你知道連接不再存在,你可以做任何需要的清理。