2017-09-19 3 views
0

Ich suchte lange, konnte aber keine Lösung finden.Node.js: socket.io Join/Leave Zimmer senden doppelte Nachrichten

Ich baue einen node.js Server, der Client "Räume" ändern kann, um verschiedene Informationen zu erhalten.

Immer Client-Socket verlassen/verbinden zwischen Räumen, ich log (socket.adapter.rooms oder socket.rooms), zeigt Client in nur einem Raum (und sich selbst), sieht richtig aus.

Das Problem liegt vor, wenn der Server bestimmte Nachrichten an bestimmte Raummitglieder sendet, der Client eine doppelte Nachricht erhält. Jedes Mal, wenn eine Join/Leave-Operation ausgeführt wird, wird die Nachricht noch einmal wiederholt.

zum Beispiel: erste Client beitreten "715R" Zimmer, Client recive Nachricht vom Server, die Nachricht wird nur einmal gesendet, richtig. dann Client verlassen "715R" und Join "312R", jetzt Client erhalten "312R" die Nachricht zweimal wiederholen! ... dann Client verlassen "312R" und beitreten "715R", jetzt Client erhalten "715R" 's Nachricht wiederholen Sie dreimal! ...

aber socket.rooms/socket.adapter.rooms log werden nur in einem Raum angezeigt.

mein Server-Side-Code:

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('-------------------------'); 
      }); 

     } 
    } 

Antwort

0

ich das Problem lösen. Nicht das Problem "Zimmer". Da jeder Client-Raum eine Kopie von socket.io Listener (socket.on (....)) hat. so, wenn Client-Switch-Raum, die Client-Room-Seite wiederholt die Registrierung. Wenn der Server eine Nachricht an den Client sendet, hat dieselbe Client-Socket-ID viele Listener, die die Daten empfangen. Das Problem tritt auf. Lösung: Lassen Sie Listener hat nur eine Instanz und dann Daten an jede Raumseite Client wollen.

Verwandte Themen