【问题标题】:Socket.IO: Reconnect Causes Server Connect Code to Run TwiceSocket.IO:重新连接导致服务器连接代码运行两次
【发布时间】:2015-04-15 04:01:17
【问题描述】:

每当我使用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');
    });
}

上面的代码,当一个客户端连接,断开,然后重新连接一次,会产生如下日志:

已连接

客户发送信息

断开连接

已连接

客户发送信息

客户发送信息

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

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

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案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() {
    
    });
    

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

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

    【讨论】:

    • 谢谢,这真的帮助我清理了头脑中的混乱。
    • 我认为这个问题发生在服务器上。服务器上的任何解决方案,以及服务器如何知道重新连接事件?
    猜你喜欢
    • 2012-03-28
    • 2015-09-12
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多