2012-03-09 11 views
1

私はサーバーからの最新情報に依存するWebアプリケーションを持っています。以前は、クライアントは前の完了後に1000ミリ秒のajaxリクエストを送信しました。それはうまくいったが、リソースを無駄にした。このアプリケーションは、クライアントがサポートしているときにWebSocketを使用するように変換されています(そうでないときはAjaxに劣化します)。ウェブソケットの接続を再確認する必要はありますか?

以前は、ブラウザが1秒ごとにアクティビティをリフレッシュしていたことを示すことによって、Ajaxはパルスを提供しました。今、それは死んでいるように見え、ただそこに座って働いています。私には次のようなものがあります:

function connect() { 
    $("#text1").text('Socket Status: '+socket.readyState+' (connecting)'); 
    socket.onopen = function(){ 
     $("#text1").text('Socket Status: '+socket.readyState+' (open)'); 
    } 
    socket.onmessage = function(msg){ checkDATA(msg.data); } 
    socket.onclose = function(){ 
     $("#text1").text('Socket Status: '+socket.readyState+' (close)'); 
     setTimeout(function() { connect(); },500); 
    } 
    socket.onerror = function(){ 
     $("#text1").text('Socket Status: '+socket.readyState+' (error) '+msg.data); 
    } 
} 

私には状態の兆候がありますが、脈を示すものはありません。私はちょうどパルスを偽るべきか、または接続が機能していることを保証するために/できなければならない何か別のものがありますか?

答えて

1

下にwebsocketは単なるTCPソケットです。したがって、まず、すべてのエラー状態とソケット通知を監視する必要があります。次に、ソケットがまだ生存していることを最終的に知りたい場合は、通常のデータを送信してサーバーレスポンスを探す必要があります。

バッテリ駆動のデバイス(携帯電話、タブレット、ラップトップ)では、ハートビートの間隔が長い場合を除き、通常のネットワークハートビートはバッテリの大量消費になることに注意してください。

もう1つの方法は、送信のための非常にスマートなエラー処理と、受信したデータの何らかの種類のインテリジェントな検出を実装することです。送信するために、いくつかのデータを送信し、ソケットが動作不能と思われるためにエラーが発生した場合、自動的に接続を切断して新しいデータを作成し、再度データを送信してみることができます。 1つは、エラーが発生したり、ソケットを再作成したり、エラーを取得したり、ソケットを何度も作り直したりすることを避けるために慎重にコードを作成する必要があります。通常、再試行は少回(2-3回)行い、連続して再試行する間隔を設定します。

受信するために、サーバーからの更新を頻繁に(たとえば少なくとも15分ごとに)更新する予定で、最後の更新以降に経過した時間がそれより長い場合は、既存のそれがまだ生きているかどうかを確認するための接続。

このタイプの技術を使用すると、物事が適切に機能しているときに、必要以上に送信/バッテリを使用しないでも、接続のタイミングを自動的に検出するためのトラブル検出/問題が発生して自動的に復元される可能性があります。

+0

私は何のエラーを監視していませんか?私はこの関数を 'try {} catch {}'にラップして、サーバがリブートしたときに発砲します。 'Catch'は5秒間待って再接続を試みます。エラーが発生するたびにサーバーとの接続数を倍増させていたため、再接続を「onerror」から削除しました。ブラウザが接続状態を変える理由/方法を理解していれば、接続のテストは避けられます。 – shaun5

関連する問題