2016-01-26 3 views
8

私はWebSocket接続をクライアントに接続していますが、そこには40秒程度あります。理想的にはそれはいつまでも開いているはずです。Websocketを処理する正しい方法

クライアントは継続的にサーバーにデータを送信し、その逆もあります。

は、今のところ私はこのシーケンスを使用しています:

var socket; 
function senddata(data) 
{ 

    if (!socket) 
    { 
     socket = new WebSocket(url); 
     socket.onopen = function (evt) { 

      socket.send(data); 

      socket.onmessage = function (evt) { 
       var obj = JSON.parse(evt.data); 

       port.postMessage(obj); 
      } 

      socket.oneerror = function (evt) { 
       socket.close(); 
       socket = null; 
      } 
      socket.onclose = function(evt){ 
       socket = null; 
      } 


     } 
    } 
    else 
    { 
     socket.send(data); 
    } 

} 

は明らかに現在のロジックに従って、エラーの場合には、現在のリクエストデータがまったく送信されない場合があります。

これは、websocketがまだ接続状態になっているというエラーを示すことがあります。この接続は、ネットワークの問題により頻繁に切断されます。要するに、それは完全にうまく動作しません。

私はより良いデザインを読んだ:How to wait for a WebSocket's readyState to changeしかし、私が扱う必要があるすべてのケースをカバーしていません。

また、私はこれについてgoogledしましたが、これに対して正しい手順を得ることができませんでした。

接続切断などの問題をうまく処理するWebsocketを介して定期的なデータを送信する正しい方法は何ですか?

答えて

2

あなたがカバーしていないようなイベントは、オンクローズです。接続が終了するたびに呼び出されるので、実際にうまくいくはずです。すべての接続の中断がエラーになるわけではないので、これはonerrorよりも信頼性が高いです。

+0

感謝を助けるだろうと思います。 – user5858

1

私は個人的にSocket.IOを使用して、クライアントとサーバーの間でリアルタイムの双方向イベントベースの通信を可能にします。

イベント駆動型です。それはあなたの接続の問題のお手伝いをすることができますので、このような

on connection :: socket.on('conection',callback);

on disconnect :: socket.on('disconnect',callback);

などのイベントは、socket.ioで構築されています。あなたが興味を持っているなら、かなり非常に使いやすく、自分のサイトをチェックしてください。

私はクライアント上の2つの層のスキーム使用
1

:抽象ラッパー+のWebSocketクライアント:

のWebSocketクライアントの責任は、サーバと対話接続を回収し、インターフェイスを提供している(イベント・エミッタいくつかのメソッド)を抽象ラッパーに変換します。接続に失敗し、一時的である場合

抽象ラッパーは、のWebSocketクライアントと相互作用する高レベルの層は、そのイベントと集約データに加入しています。 アブストラクトラッパーは、Promise、EventEmitterなどの任意のインターフェイスをアプリケーションレイヤに提供できます。

アプリケーション層では、抽象ラッパーを使用しているだけなので、接続やデータの消失については心配しないでください。間違いなく、接続やデータ送信の確認に関する情報をここに持っておくと便利です。

ことが必要であるならば、私は例

0

これは明らかに、サーバーの問題ではないクライアントで問題となっているため、いくつかのコードを提供することができます。

私はこのサーバーの外観がわかりません。しかし、これは過去に私がWebSocketベースのプロジェクトに取り組んでいたとき、私にとって大きな問題でした。接続は絶えず壊れていました。

私はJavaでwebsocketサーバーを作成しましたが、これで問題は解決しました。

websocketsは、サーブレットを使用していて、サーブレットコンテナの設定が重要な場合など、いくつかのPHPなどを使用している場合、ApacheとPHPの設定が重要です。たとえば、PHPでwebsocketサーバーを作成し、 phpのデフォルトのタイムアウトは30秒で、30秒後に中断します。キープアライブが設定されていない場合、接続は文句を言わない、生き続けるなど

あなたに迅速な解決が

  1. (のような2または3一定時間後にサーバーにpingを送信し続けるで何ができますか何も送信しない以外の接続が壊れているかどうかを知ることができないことを知っていれば幸いです。
  2. checkサーバーのキープアライブヘッダー
  3. サーバーにアクセスできる場合は、タイムアウトなどです。

私はそれは私がそれを追加しました

+0

私はクライアントのことだけを話しています – user5858

関連する問題