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

5
无论是意外断开连接、故意断开连接还是服务器重启,只要我使用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个回答

2

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

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

    });
});

你需要使用:

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

});

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

});

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

简单来说,在on('connection')调用内部不要放置任何额外的socket.on('x')调用,将它们全部放在外面即可。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接