2016-11-28 86 views
0

我正在編寫一段JavaScript代碼來與自定義的C#web套接字服務器進行通信,並按照我的建議練習重試連接。WebSocket查詢有沒有限制?

當JS準備就緒時,服務器可能沒有準備好,所以我需要做的是繼續嘗試連接到websocket,直到最終成功。

建議的做法告訴我,我需要捕獲onclose事件或onerror事件,並且其中任何一個嘗試重新連接,最好採用某種退避策略。

根據此建議,我想出了下面的代碼:

<html> 
    <head> 
     <title>WS</title> 
    </head> 
    <body> 
     <h1>WS</h1> 

     <button onclick="init()">Connect</button> 
     <button onclick="deInit()">Disconnect</button> 
     <button onclick="send()">Message</button> 

     <script> 

      var mySocket; 

      function init(){ 

       mySocket = new WebSocket("ws://localhost:9000/foolish"); 

       mySocket.onopen = function(){ 
        console.log("OPEN"); 
       }; 

       mySocket.onclose = function(status){ 
        console.log("CLOSE"); 
        console.log(status); 
        if(status.code === 1006){ 
         mySocket = new WebSocket("ws://localhost:9000/foolish"); 
        } 
       }; 

       mySocket.onerror = function(err){ 
        console.log("ERROR"); 
        console.log(err); 
       }; 

       mySocket.onmessage = function(msg){ 
        console.log("MESSAGE"); 
        console.log(msg); 
       }; 

      } 

      function deInit(){ 

       mySocket.close(); 

      } 

      function send(){ 

       mySocket.Send("foo"); 

      } 

     </script> 

    </body> 
</html> 

Iv'e試圖進行錯誤處理程序重新連接,並連接到一個「的setTimeout」號召,太並且輸出總是相同的。

我的事件處理程序觸發一次,重新嘗試連接,但第二次失敗時,沒有任何事件處理程序被觸發,而我只留下一個失敗的嘗試,如下圖所示:

enter image description here

一切我讀過告訴我,每次我重試,屢時間去連接,我的錯誤處理程序和/或關閉處理程序應繼續開火讓我選擇來處理錯誤,但它它不會嘗試兩次並放棄。

這發生在IE11,IE10,Chrome 50+和FireFox最新版本。

鑑於它在瀏覽器中的一致性,那麼我只是猜測它是通過設計還是我做錯了什麼,但是我真的沒有看到問題是什麼。

如果任何人有任何想法,我會非常感激,如果你能指出我在正確的方向。

回答

3

當您關閉時創建新實例時,不重新應用事件處理程序

+0

當然。我怎麼會錯過那個:-)。總是有些簡單不是它。 – shawty