【问题标题】:Node.js: socket.io join/leave room send duplicate messagesNode.js:socket.io 加入/离开房间发送重复消息
【发布时间】:2017-09-19 04:23:45
【问题描述】:

找了半天也没找到解决办法。

我构建了一个 node.js 服务器,客户端可以更改“房间”以获取不同的信息。

每次客户端socket离开/加入房间时,我都会记录(socket.adapter.rooms或socket.rooms),它只显示客户端在一个房间(和它自己),看起来是正确的。

问题是当服务器向特定房间成员发送特定消息时,客户端收到重复消息.. 每次执行加入/离开操作时,消息都会重复一次。

例如: 第一个客户端加入“715R”房间,客户端从服务器接收消息,消息只发送一次,正确。 然后客户离开“715R”并加入“312R”,现在客户收到“312R”的消息重复两次!... 然后客户端离开“312R”并加入“715R”,现在客户端收到“715R”的消息重复三遍!...

但 socket.rooms/socket.adapter.rooms 日志只显示在一个房间中。

我的服务器端代码:

socket.on('join', function (msg) {
        console.log(socket.rooms);
        console.log('client:'+socket.id+" ask join:"+msg);

    if (typeof socket['room'] !== 'undefined') {
        console.log(socket.id + " try leave " +socket['room']);

        socket.leave(socket['room'], function() {
            console.log('client:'+socket.id+" leave ok:"+socket['room']);
            console.log(socket.adapter.rooms);
            delete socket['room'];
            console.log(socket.id + " inRoom: " + socket['room']);
            console.log(socket.id + " try join:" + msg);
            if (checkroom(rooms, msg)) {
                socket.join(msg, function() { 
                    console.log(socket.id + " join sucess:" + msg);
                    socket['room'] = msg;
                    console.log(socket.adapter.rooms);
                    console.log('-------------------------');
                });
            }
        });

    }else {
        console.log(socket.id + " inRoom: " + socket['room']);
        console.log(socket.id + " try join:" + msg);
        if (checkroom(rooms, msg)) {
            socket.join(msg, function() { 
                console.log(socket.id + " join sucess:" + msg);
                socket['room'] = msg;
                console.log(socket.adapter.rooms);
                console.log('-------------------------');
            });

        }
    }

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    我解决了这个问题。 不是“房间”相关的问题。 因为每个客户端房间都有一个 socket.io listener (socket.on(....)) 的副本。 所以当客户切换房间时,客户房间页面重复注册。 当服务器向客户端发送消息时,相同的客户端socket ID有多个监听器接收数据。问题出现了。 解决方案:让监听器只有一个实例,然后将数据传递给客户端想要的每个房间页面。

    【讨论】:

    • 您能提供更多细节吗?或者任何一段代码?我有完全相同的问题,我已经被困了好几天了
    • @AzoulayJason,你解决了这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2023-03-27
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多