2

次のような基本的なSocket.ioサーバーのセットアップがあります。

var server = express.createServer().listen(port);
    this.io = socketIO.listen(server);

this.io.sockets.on('connection', function(socket){
        initSocket(socket);
    });

また、次のように XHR ポーリングを使用するように socket.io を構成しています。

io.set("transports", ["xhr-polling"]);
io.set("close timeout", 3);
io.set("heartbeat interval", 2); 

問題は、クライアントがハートビートを送信するたびに (2 秒ごとに)、「接続」イベントが発生することです。ソケットが最初に接続するたびに 1 回起動する、使用できる別のイベントはありますか?

「承認」イベントを使用しますが、実際のソケットではなく、ハンドシェイク オブジェクトのみを渡します。

4

2 に答える 2

3

問題が見つかりました。次のように、xhrの「ポーリング期間」をherokuの推奨する10秒に設定しました。

io.set("polling duration", 10);

つまり、クライアントは 10 秒ごとに (前の要求が返されるとすぐに) 新しい xhr 要求を作成します。同時に、「閉じるタイムアウト」を 3 秒に設定しました。

io.set("close timeout", 3);

つまり、最後のリクエストから 3 秒以内にサーバーがクライアントからの連絡を受けなかった場合、サーバーは接続を閉じるため、継続的に「切断/接続」イベントが発生します。

解決策は、クローズ タイムアウトをポーリング時間よりも長く設定することでした。「ハートビート間隔」は xhr 接続には関係ないようです。

于 2012-06-21T14:40:28.607 に答える
1

closetimeout とハートビート間隔の設定値が低すぎませんか。これらのデフォルト値は 60 秒と 25 秒です。一般的なネットワーク遅延は 5 秒程度です。したがって、設定した値では、クライアントは指定された時間内に応答しないため、接続が閉じられます。クライアントが再度接続すると、接続イベントが発生します。

于 2012-06-21T03:51:05.003 に答える