节点socket.io服务器启动时崩溃

时间:2013-02-07 09:18:01

标签: node.js client socket.io

我有一个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米* 60秒/ 5秒重新连接)并且崩溃。

如何关闭服务器尝试的连接?

PS:如果我重新加载客户端,并在服务器启动后,它可以正常工作

2 个答案:

答案 0 :(得分:1)

socket.io.js的主要思想是重用现有连接。 您应该只连接一次,然后使用socket.emit()

交换消息

我不确定为什么要每隔5秒在客户端和服务器之间创建一个新连接。服务器可以创建的连接数有限制,但这应该足够了。如果你把它放在循环中,那么最终服务器将耗尽套接字。

io.connect必须在客户端执行一次,然后你可以每隔5秒就执行一次socket.emit()。删除{'reconnect':false,'connect timeout':5000},你会没事的。

答案 1 :(得分: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 });
    });