Socket.IO:重新连接导致服务器连接代码运行两次

时间:2015-02-14 00:27:08

标签: javascript node.js sockets socket.io

每当我使用socket.disconnect();断开连接然后使用socket.connect();重新连接时,服务器会运行两次握手代码。奇怪的是,即使服务器连接代码运行两次,重新连接后我的阵列中只有一个连接。这种情况发生在意外断开,故意或甚至服务器重新启动时。代码:

io.on('connection', OnConnect);
function OnConnect(socket) {

    var connection = { socket: socket, realIp: ip, token: GenerateConnToken() };
    connections.push(connection);
    console.log('Connected');

    // Client will respond to this by emitting "client-send-info".
    // This is emitted once on initial connect, but twice on reconnect.
    socket.emit('acknowledge', connection.token);

    socket.on('client-send-info', function() {

        console.log('Client Sent Info');
    });

    socket.on('disconnect', function() {
        console.log('Disconnected');
    });
}

上面的代码,当客户端连接,断开连接,然后重新连接一次时,将生成以下日志:

  

连接

     

客户端已发送信息

     

断开

     

连接

     

客户端已发送信息

     

客户端已发送信息

为什么重新连接时,连接代码会运行两次,但只创建一个连接对象?

编辑:经过进一步检查,当客户端重新连接时,似乎正在执行两次不同的连接代码。上述代码已更新,以反映相关信息。

1 个答案:

答案 0 :(得分:1)

奇怪的是,解决方案完全是客户端。而不是以下代码:

var socket = io.connect();
socket.on('connect' function() {
    socket.on('acknowledge', function() {

    });
});

你必须使用:

var socket = io.connect();
socket.on('connect' function() {

});

socket.on('acknowledge', function() {

});

否则,当服务器实际上只发送一个发送时,服务器似乎会发送多个发送,并且它是错误接收多个的客户端。使用第二种代码格式,客户端最初成功连接,断开连接并重新连接,而不会接收多个发射。

简单地说,不要在socket.on('x')电话中添加任何其他on('connection')来电。把它们都留在它外面。