web-dev-qa-db-ja.com

socket.ioで再接続を構成するにはどうすればよいですか?

次のコードでsocket.io接続を作成します

var socket = new io.connect('http://localhost:8181', {
    'reconnect': true,
    'reconnection delay': 500,
    'max reconnection attempts': 50
});

しかし、私がサーバーを殺したとき CTRL+C 再起動すると、再接続は行われません。しかし、クライアント側で切断イベントが発生しました。その理由は何でしょうか?

27
Dmitro

これは古い質問ですが、socket.io(1.x)で再接続を構成する方法を探している私のような他の人にとって、ここに正しい構文があります:

var socket = new io.connect('http://localhost:8181', {
    'reconnection': true,
    'reconnectionDelay': 1000,
    'reconnectionDelayMax' : 5000,
    'reconnectionAttempts': 5
});
30
Salvador Dali

これは古い質問であることに気づきましたが、ソケットioの再接続に問題があり、この投稿が検索結果の上位にあることがわかりました。次のコードを使用して、発生しているイベントを正確にデバッグしてみてください。

# coffeescript. compile if you're writing javascript, obviously.

socket.on 'connect',-> console.log 'connected'
socket.on 'reconnect',-> console.log 'reconnect'
socket.on 'connecting',-> console.log 'connecting'
socket.on 'reconnecting',-> console.log 'reconnecting'
socket.on 'connect_failed',-> console.log 'connect failed'
socket.on 'reconnect_failed',-> console.log 'reconnect failed'
socket.on 'close',-> console.log 'close'
socket.on 'disconnect',-> console.log 'disconnect'

これにより、クライアントソケットの状態をさらに詳しく知ることができます。

また、ウェブインスペクターの[ネットワーク]タブを見て、XHRリクエストがフォールバックとして発生しているかどうかを確認してください。最後に、Webコンソールでio.socketsと入力して展開し、実際に再接続を試みているかどうかを確認します。

Reconnect_failedが起動せず、再接続タリーがリセットされないという問題が発生しました。以下はgithub上のこれらの問題の議論へのリンクです。

再接続遅延-指数バックオフが適切にリセットされない

reconnect_failedは実行されません

いくつかの潜在的な修正/回避策

10
captainclam

これは古い質問ですが、v1.4.5を使用するときに(別の理由で)同じ質問がありました。私のチャットルームアプリは美しく機能しましたが、Ctrl+Cターミナルでは、ブラウザはループし続け、シャットダウンするまで数秒ごとにERR_CONNECTION_REFUSEDを報告しました。

以前の回答を少し変更するだけで解決策が得られました。

V1.4.5の場合、クライアントのjsファイルにある「var socket」の元のコードは次のとおりです。

    var socket = io();

そしてここに解決策があります:

    var socket = io({
        'reconnection': true,
        'reconnectionDelay': 1000,
        'reconnectionDelayMax' : 5000,
        'reconnectionAttempts': 5
    });

もちろん、必要に応じて値を変更することもできますが、重要な点は、これにより、終わりのない再接続要求が強制終了されたことです。

7
elmeltone

再接続の遅延が小さすぎると500ミリ秒増加します。その上、50回の再試行は500 * 50 = 25000ミリ秒、つまり25秒です。それでも解決しない場合は、クライアント側のエラーイベントにタイムアウトを設定して、ソケットオブジェクトを再作成します(エラー後、接続の作成を再試行して遅延が発生します)。

0
MaX