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

Nif*_*255 6 javascript sockets node.js 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');
    });
}
Run Code Online (Sandbox Code Playgroud)

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

连接的

客户发送信息

已断开连接

连接的

客户发送信息

客户发送信息

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

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

Nif*_*255 3

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

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

    });
});
Run Code Online (Sandbox Code Playgroud)

你必须使用:

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

});

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

});
Run Code Online (Sandbox Code Playgroud)

否则,服务器看似发送了多个发射,而实际上只发送了一个发射,而客户端错误地接收了多个发射。使用第二种代码格式,客户端可以成功地进行初始连接、断开连接和重新连接,而不会收到多次发出。

简而言之,不要在调用socket.on('x')中添加任何其他调用on('connection')。把它们全部留在外面。