我搜索了很长时间但找不到解决方案。
我构建了一个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('-------------------------');
});
}
}
答案 0 :(得分:1)
我解决了这个问题。 不是"房间"相关问题。 因为每个客户端都有一个socket.io监听器(socket.on(....))的副本。 所以当客户端切换房间时,客户机房页面重复注册。 当服务器向客户端发送消息时,同一客户端套接字ID有许多侦听器接收数据。出现问题。 解决方案:让侦听器只有一个实例,然后将数据传递给客户端想要的每个房间页面。