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

Javascript Socket.IO:重新连接会导致服务器连接代码运行两次,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,每当我使用socket.disconnect()断开连接时然后使用socket.connect()重新连接,服务器运行我的握手代码两次。奇怪的是,即使服务器连接代码运行了两次,但在重新连接后,我的阵列中只有一个连接。这发生在意外断开连接、有意断开连接或服务器重新启动时。代码位: io.on('connection', OnConnect); function OnConnect(socket) { var connection = { socket: socket, realIp: i

每当我使用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');
    });
}
当客户端连接、断开连接,然后重新连接一次时,上述代码将生成以下日志:

连接的

客户端发送的信息

断开

连接的

客户端发送的信息

客户端发送的信息

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


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

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

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

    });
});
您必须使用:

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

});

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

});
否则,当服务器实际上只发送一次发射时,它看起来会发送多个发射,而错误接收多个发射的是客户端。使用第二种代码格式,客户端可以在不接收多个发射的情况下成功地进行初始连接、断开连接和重新连接


简单地说,不要在('x')上的
on('connection')
调用中添加任何额外的
socket.on('x')
调用。把它们都放在外面。

谢谢,这确实帮助我清理了头脑中的混乱。我认为这个问题发生在服务器上。服务器上的任何解决方案,以及服务器如何知道重新连接事件?