26

xhr-pollingを介してsocket.ioを実行しているnode.jsサーバーに接続されたモバイルクライアントがあります。私には2つのタイプのクライアントがあります。

  • タイプA

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

  • タイプB

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

だから私の質問は、実際のクライアントからのハートビートタイムアウトを(可能であれば)どのように構成するかです。

4

3 に答える 3

56

私の知る限り、ここで重要な値は2つあります。サーバーは毎秒クライアントにハートビートを送信しますheartbeat interval。クライアントは直接応答します。応答がない場合、サーバーはクライアントが停止していると判断します。クライアントはheartbeat timeout、最後のハートビートから数秒間、サーバーからのハートビートを待機します(これは明らかにより高いはずですheartbeat interval)。サーバーから数秒以内にワードを受信しなかった場合heartbeat timeout、サーバーは停止していると見なされます(そして、設定した他のオプションに基づいて切断/再接続を開始します。

デフォルト値はと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値は共有オブジェクト(呼び出しから返されるものであるManager)の一部であるように見えます。var io = require("socket.io").listen(server)つまり、個々のソケットに対して簡単に変更することはできません。

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

于 2012-10-11T19:17:13.693 に答える
25

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にアクセスできます。

于 2015-06-30T19:08:04.830 に答える
11

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

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

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

于 2014-08-07T12:32:44.810 に答える