2017-09-19 15 views
0

私は長い間検索しましたが、解決策を見つけることができませんでした。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('-------------------------'); 
      }); 

     } 
    } 

答えて

0

私はこの問題を解決します。 「部屋」関連の問題ではありません。 各クライアントルームにはsocket.io listener(socket.on(....))のコピーがあるためです。 クライアントスイッチルームでは、クライアントルームページが登録を繰り返します。 サーバーがクライアントにメッセージを送信するとき、同じクライアントソケットIDにはデータを受信するリスナーが多数存在します。問題が表示されます。 解決策:リスナーには1つのインスタンスしかなく、クライアントが必要とするすべてのルームページにデータを渡します。

関連する問題