マイクロチャネル上およびアプレットのWebSocketハートビート再接続を実現

使用中

VaRの WS = 新しいのWebSocket(URL); 
ws.onclose = 関数(){
     // 何か
}。
ws.onerror = 関数(){
     // 何か
}。
        
ws.onopen = 関数(){
    // 何か
}。
ws.onmessage =関数(イベント){
    // 何か
} 
复制代码

マイクロチャネルアプレットのWebSocketプロセスは、悪い信号、または閉じた一時的なネットワークとして、ネットワークをオフに発生することがあり、このとき用WebSocket接続が切断されました、

ブラウザは、私たちが切断さ、それはできません再接続操作かどうかを知ることができない、WebSocketの方法OnCloseの実行されません。

バックエンドへの現在のWebSocketの送信データは、要求がタイムアウトした後、OnCloseのが実行する場合は、この時間は、良好な再接続操作にバインドすることができます。

そのためのWebSocket心臓再接続が行われます。

 

どのように達成するために

WebSocketをインスタンス化では、我々は、イベントの一部に結合するであろう。

コードをコピー
VaRのWS =新しいのWebSocket(URL); 
ws.onclose =関数(){ 
    //何か
}。
ws.onerror =関数(){ 
    //何か
}。
        
ws.onopen =関数(){ 
   //何か
}。
ws.onmessage =関数(イベント){ 
   //何か
}
コードをコピー

あなたはWebSocketの接続を維持したい場合は、我々は近いまたは再接続のエラー方法にバインドされます。

コードをコピー
ws.onclose =関数(){ 
    再接続()。
}。
ws.onerror =関数(){ 
    再接続()。
}。
    
コードをコピー

通常の状況下では、この時間は、接続が失われ、OnCloseのアプローチをトリガー、我々は再接続を行うことができるようになります。

 

だから、オフネットワークハートビート再接続の場合のために、どのようにそれを達成するために。

シンプルな実装:

コードをコピー
VAR heartCheck = { 
    タイムアウト:60000、//は60msの
    timeoutObjを:ヌル、
    リセット:関数(){ 
        てclearTimeout(this.timeoutObj)。
     this.start(); }、 開始:関数(){ this.timeoutObj = setTimeoutメソッド(関数(){ ws.send( "ハートビート"); }、this.timeout) } } ws.onopen =関数(){ heartCheck.start()。 }。
ws.onmessage =関数(イベント){ 
    heartCheck.reset()。
}
コードをコピー

コードとして、heartCheckリセットおよび開始方法は、主に、心拍のタイミングを制御するために使用されます。

どのような条件の下で実行ハートビート:

私たちは、タイミングの範囲内で、onMessageのGETメッセージのバックエンドに、我々はカウントダウンをリセットする場合は、カウントを開始し始めたとき、接続が開く時れるとき

60秒以上に最後のメッセージの後端からの距離を取得した後、ハートビートが断線するかどうかを確認するために行われ、検出時間は、自分の状況に応じて設定することができます。

開放遠位WS分析(オフネットが、断線の場合に限定されません)。

現在の状態のWebSocket(またはネットオフ)オフである場合、送信心拍検出方法の実行は、タイムアウトを送信した後、ブラウザは自動的方法OnCloseのトリガーWSは、再接続は、(限定法体重OnCloseの行われる時でもイベント)は、現在のネットワークの状態が破損している場合は、接続に成功するまで、通常のネットワークを実行するために2秒(自分の設定タイムコード)を再接続します。

したがって、我々は達成ハートビートWS上のフロントエンド主導の呼び出しを決定します。なぜ主な理由は、現在の状況のフロントエンド主導の呼び出しは、前面からであるバックエンドオフイニシアチブの背後にある事情を言って、裁判官にイベントをWS。

 

私は、テスト用WebSocketタイムアウトしたかった、といくつかの新たな問題を発見しました

ハートビートが送信などのWebSocketインスタンスがある場合、クロムにおいては、その後、15秒以内に、他方は受信端に伝達されず、それはOnCloseのが行います。だから、タイムアウトは15秒です。

2.私は、切断後のFirefox、Firefoxの7秒を開設し、直接実行がOnCloseの。ハートビートが自動的にFirefoxでOnCloseのことができないことを示します。

3.同じコードは、Chromeの方法の実装は、Firefoxが2回実行再接続します。もちろん、我々は(コード・ロジックは、イベントにとのWebSocketで))(再接続にバインドされたいくつかの場所にあり、

だから、安全で、我々は一度だけ実行されていることを確認するためにロックを追加するために再接続()メソッドを与えます

 

今、別のブラウザを問わず、再接続後にネットワークオフの場合、プラスハートビートでOnCloseの独自ののWebSocketを実行しませんブラウザの、OnCloseの通常のトリガーを確保することができた、異なるメカニズムを持っています。

 

バックエンドの接続解除を決定します。

    理由はいくつかの事情のバックエンドは、WSを切断した場合は、制御された状況の下で、その後で、それだけで切断した後、メッセージの切断通知を送信し、我々は再接続されます。

いくつかの異常な切断のためならば、我々はに対して敏感ではない、我々は一定時間後にハートビートを送信する場合ので、どちらのバックエンドハートビート応答メッセージが返され、フロントは他の情報を受信して​​いない、我々は結論付けることができますイニシアチブは、バックエンドのために呼び出します。

それ以外の場合は60秒以上後に切断されたバックエンドを決定するためのイニシアチブをとるだろう、ハートビートは、バックエンドに返却しなければならないバックエンドメッセージを受信した後にメッセージを送信することが特に重要です。次いで、コード下変態:

 

コードをコピー
heartCheck = {VARの
    タイムアウト:60000、//は60msの
    timeoutObjを:ヌル、
    serverTimeoutObj:ヌル、
    RESET:関数(){ 
        てclearTimeout(this.timeoutObj); 
        てclearTimeout(this.serverTimeoutObj); 
     this.start(); 
    }、
    スタート:関数(){ 
        VAR =この自己; 
        this.timeoutObj =のsetTimeout(関数(){ 
            ws.send( "ハートビート"); 
            self.serverTimeoutObj =のsetTimeout(関数(){ 
                ws.close(); //もしOnCloseの再接続を行います我々は、ライン上)(ws.closeを行う。直接実行再接続トリガが二回再接続するリードをOnCloseの場合
            self.timeout、})
        }、this.timeout)
    }、
}

ws.onopen =関数(){ 
   heartCheck.start()。
}。
ws.onmessage =関数(イベント){ 
    heartCheck.reset()。
}
ws.onclose =関数(){ 
    再接続()。
}。
ws.onerror =関数(){ 
    再接続()。
}。
 
コードをコピー

 

PS:

    現在、このよう私たちは再接続が接続または切断されていない場合はされて、2つのデバイスがある場合は、同時に着陸の他端と組立ラインをキックオフし、組立ライン型のキックオフにメッセージを送信してください、ここではこれを受けているだろうので、メッセージの種類は、もはや実行する論理的な判断再接続した後、それ以外の場合は組立ラインオフ相互スクイズの無限ループが存在します。

おすすめ

転載: www.cnblogs.com/lanshu/p/11837084.html