web-dev-qa-db-ja.com

socket.ioのクライアントからのハートビートタイムアウトの制御

Node.jsサーバーに接続され、xhr-pollingを介してsocket.ioを実行するモバイルクライアントがあります。次の2種類のクライアントがあります。

  • タイプA

    ネットワークの問題(またはクライアントのクラッシュ)により接続が切断された場合、デフォルトのハートビートタイムアウトが長すぎます

  • タイプB

    このクライアントの接続が切断された場合、回復するためにより多くの時間を与える必要があります-サーバーが接続/セッションを切断するよりもクライアントが回復することがより重要です

私の質問は、実際のクライアントからのハートビートタイムアウトの設定方法(可能な場合)です。

23
Martin

私が知る限り、ここで重要な2つの値があります。サーバーは_heartbeat interval_秒ごとにクライアントにハートビートを送信します。クライアントは直接応答します。応答がない場合、サーバーはクライアントが死んでいると判断します。クライアントは、最後のハートビート(_heartbeat timeout_より明らかに高いはずです)から_heartbeat interval_秒の間、サーバーからのハートビートを待ちます。 _heartbeat timeout_秒以内にサーバーからWordを受信しなかった場合、サーバーが停止していると想定します(設定した他のオプションに基づいて切断/再接続を開始します)。

デフォルト値は_heartbeat interval = 25s_および_heartbeat timeout = 60s_です。両方の項目がサーバーに設定され、接続時に_heartbeat timeout_がクライアントに送信されます。

単一のクライアントの_heartbeat timeout_の変更は簡単です:

_var socket = io.connect(url);
socket.heartbeatTimeout = 20000; // reconnect if not received heartbeat for 20 seconds
_

ただし、サーバー上では、_heartbeat interval_値は共有オブジェクト(var io = require("socket.io").listen(server)呼び出しから返されるものであるManager)の一部であるようです。個々のソケットに対して変更されます。

いくつかのsocket.ioのハッキングでそれを実現できるはずですが、その過程で他のものを壊すかもしれません...

54
Claude

Socket.io 1.xでは、APIは変更されましたが、概念は同じままです。

HeartbeatIntervalとheartbeatTimeoutの代わりに、プロパティはpingIntervalとpingTimeoutです。例えば、

var server = app.listen(80);
io = socketio(server,{'pingInterval': 45000});

http://socket.io/docs/server-api/#server(opts:object) のドキュメントを参照してください。これにより https://github.com/ Automattic/engine.io#methods-1

22
Joseph238

Claudeの答えを完成させるために、次のコードを使用してサーバーレバーでこれらの値を設定できます。

io.set('heartbeat interval', 5);
io.set('heartbeat timeout', 11);

次に、2種類のnode.jsサーバーを作成できます。1種類のクライアント(AおよびB)ごとに1つで、2つのオプションセット(ハートビートタイムアウトと間隔)を持ちます。

12
radu122