0

socket.io サーバーとクライアントが正しく動作しています。サーバーがダウンするたびに、クライアントは 5 秒ごとに再接続を試みます。サーバーが再び起動すると、問題なく接続されます。

しかし、問題は、サーバーを再度起動する前に長時間待機すると発生します。サーバーが起動すると、クラッシュして次のように表示されます。

info  - socket.io started
debug - client authorized
info  - handshake authorized DqN4t2YVP7NiqQi8zer9
debug - setting request GET /socket.io/1/websocket/DqN4t2YVP7NiqQi8zer9
debug - set heartbeat interval for client DqN4t2YVP7NiqQi8zer9
debug - client authorized for
debug - websocket writing 1::

buffer.js:287
  pool = new SlowBuffer(Buffer.poolSize);
         ^
RangeError: Maximum call stack size exceeded

クライアント再接続(未接続時5秒毎に実行):

function socket_connect() {
    if (!socket) {
        socket = io.connect('http://192.168.1.25:8088', { 'reconnect':false, 'connect timeout': 5000 });
    } else {
        socket.socket.connect();
    }
    socket.on("connect", function () {
        clearInterval(connect_interval);
        connect_interval = 0;
        socket.emit('player', { refresh_data:true });
    });
}

サーバー側では、ソケット インスタンスのみでクラッシュします。

var io = require('socket.io').listen(8088);

問題は次のとおりだと思います。

サーバーが起動すると、クライアントによって発行されたすべての接続を 5 秒ごとに受信し (15 時間の切断 * 60 m * 60 秒 / 5 秒の再接続)、サーバーはクラッシュします。

サーバーが試みている接続を閉じるにはどうすればよいですか?

PS:クライアントをリロードし、サーバーを起動すると、動作します

4

2 に答える 2

1

socket.io.js の主なアイデアは、既存の接続を再利用することです。一度だけ接続してから、socket.emit() を使用してメッセージを交換する必要があります。

クライアントとサーバーの間に 5 秒ごとに新しい接続を作成する理由がわかりません。サーバーが作成できる接続の数には制限がありますが、それで十分なはずです。ループに入れると、最終的にサーバーはソケットを使い果たします。

io.connect はクライアントで 1 回実行する必要があります。その後、5 秒ごとに socket.emit() を実行できます。{ 'reconnect':false, 'connect timeout': 5000 } を削除すれば問題ありません。

于 2013-02-07T09:31:27.960 に答える
0

私は問題を発見しました...

関数 socket_connect() が呼び出されるたびに、"socket.on("connect" ..." 関数が作成されます。したがって、サーバーが起動すると、新しい接続が作成されますが、イベント "socket.on(" connect」が複数回発生します...

解決策は次のとおりです。

function socket_connect() {
    if (!socket) {
        socket = io.connect('http://192.168.1.25:8088', { 'reconnect':false, 'connect timeout': 5000 });
    } else {
        socket.socket.connect();
    }
}

socket.on("connect", function () {
        clearInterval(connect_interval);
        connect_interval = 0;
        socket.emit('player', { refresh_data:true });
    });
于 2013-02-08T13:18:38.273 に答える