2016-03-18 31 views
2

我正在測試從客戶端與不同瀏覽器重新連接我的應用程序並觀察不同行爲。測試與不同瀏覽器重新連接

步驟:

  1. 我的應用程序連接到我的服務器
  2. 拔掉網絡線

    • 火狐瀏覽器:連接丟失事件立即觸發
    • 鉻:沒什麼
    • IE11:似乎沒有立即識別丟失的連接

我的應用程序試圖儘快就重新連接,因爲它會從瀏覽器的連接丟失事件。

我知道這可能歸結於不同的瀏覽器行爲。我可以從客戶端做些什麼來克服瀏覽器在這裏的怪癖?

回答

0

拔掉網絡線

這可能不會做你認爲它。

不同操作系統之間的確切行爲可能不同,但基本上&有意在基礎介質中斷並不等於當前正在使用它的TCP連接中斷。

在Windows 7之前,當它的cat5導線被拉動時,整個NIC都會關閉,從而關閉所有通過它的TCP連接。這可能會誤導人們認爲他們正在觀察連接關閉。然而,遠程TCP對僅觀察TCP沉默..並持有ESTABLISHED

仍然連接要完全關閉TCP連接Windows用戶可以使用TCPView識別並關閉相關的插座。 Linux用戶可以使用fuser來達到同樣的效果。如果沒有這些想法,請在客戶端與服務器之間使用簡單的TCP代理,並終止該進程以關閉瀏覽器的TCP連接。

這些點一邊,有可靠實現連接關閉,你仍然需要採用週期性應用級ping命令測試服務器的可用性,現場HTTP會話不一定有任何活動的TCP連接。期待HTML5 - WebSocket的行爲更像它的底層TCP連接,通知你關閉。

+0

:o我不知道拔下以太網線不會立即斷開連接。你是對的。我應該有一個客戶端ping來監視與我的服務器的連接。 – bili

1

你可以聽一個插座,當聽到錯誤時你可以做你想做的事。 JQuery.webSocket可以幫助你的情況。

1

使用jQuery,您可以每隔幾秒向服務器發送一次AJAX請求以檢查連接狀態。

window.myInterval = setInterval(
    function() { 
     $.ajax(
      type: "GET", 
      url: "http://your.server.io/test_url.php", 
      statusCode: { 
       503: function() { 
        alert("Service Unavailable"); 
        // your code 
       } 
      } 
     ); 
    } 
, 5000); 

它很容易調整捕獲連接丟失和備份事件。

window.connectionUp = true; 
window.myInterval = setInterval(
    function() { 
     $.ajax(
      type: "GET", 
      url: "http://your.server.io/test_url.php", 
      statusCode: { 
       503: function() { 
        alert("Service Unavailable"); 
        window.connectionUp = false; 
        // your code 
       } 
       200: function() { 
        alert("Service Available"); 
        if (window.connectionUp = false) { 
         // reconnect 
        } 
        window.connectionUp = true; 
        // your code 
       } 
      } 
     ); 
    } 
, 5000); 
+0

感謝您的想法!看來這是對我而言的方式。 – bili