私は長い間検索しましたが、解決策を見つけることができませんでした。Node.js:socket.io join/leave roomは重複したメッセージを送信します
私はnode.jsサーバーを構築し、クライアントは「部屋」を変更してさまざまな情報を得ることができます。
ルーム間のクライアントソケットの離脱/参加は毎回ログ(socket.adapter.roomsまたはsocket.rooms)で、クライアントは1つのルーム(およびそれ自体)にしか見えません。
問題は、サーバーが特定のルームメンバーに特定のメッセージを送信し、クライアントが重複メッセージを受信する場合です。 参加/離脱操作が実行されるたびに、メッセージがもう一度繰り返されます。
例: 最初のクライアントは「715R」ルームに参加し、クライアントからメッセージを受信します。メッセージは一度だけ送信されます。 クライアントは "715R"を残して "312R"に参加します。クライアントは "312R"のメッセージを2回繰り返し受信します... クライアントは "312R"を残して "715R"に参加し、クライアントは "715R" 3回繰り返してください...
しかし、socket.rooms/socket.adapter.roomsログは1つの部屋にのみ表示されています。
私のサーバー側のコード:
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('-------------------------');
});
}
}