Node.js:socket.io join / leave room发送重复的消息

时间:2017-09-19 04:23:46

标签: node.js socket.io

我搜索了很长时间但找不到解决方案。

我构建了一个node.js服务器,客户端可以更改" rooms"获得不同的信息。

每次客户端套接字在房间之间离开/加入,我登录(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('-------------------------');
            });

        }
    }

1 个答案:

答案 0 :(得分:1)

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