socket.io - comment diffuser des messages sur un namespace?

selon socket.io exemples:

pour la diffusion, il suffit d'ajouter un drapeau broadcast aux appels de méthodes emit et send . La diffusion signifie envoyer un message à tout le monde sauf à la socket qui le démarre.

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
});

j'ai essayé de le combiner avec la nouvelle prise.io namsepace feature, donc j'ai eu ceci:

var chat = ioserver.of('/chat');

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        chat.send(msg);
      });
  });

cela fonctionne très bien, tout le monde sur le chat channel (et aucun autre canal) reçoit le message. Mais l'expéditeur reçoit également. J'ai donc essayé de faire ce qui suit:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        chat.broadcast.send(msg);
      });
  });

et a obtenu une Exception: "Impossible d'appeler la méthode 'envoyer' undefined.' Ok, donc j'ai pensé, cette émission est la caractéristique d'une socket simple (il se sent un peu bizarre cependant - comment une socket simple peut brodacast à tous les autres...). J'ai donc essayé:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        socket.broadcast.send(msg);
      });
  });

mais maintenant, c'était pire, personne n'a reçu le message, pas même la expéditeur. Quoi qu'il en soit, c'était ce à quoi je m'attendais logiquement - une socket ne peut pas diffuser quelque chose à travers elle-même. Et aucune exception cette fois, donc la diffusion est définie pour la socket.

Si je fais:

chat.on('connection', function (socket) {
      console.log('chat connection');   
      socket.on('message', function (msg) {
        console.log(msg);  
        socket.send(msg);
      });
  });

alors seul l'expéditeur original reçoit le message, et c'est encore une fois assez logique - j'ai utilisé le 'send' de la socket liée au client.

la question est Donc: quelle est la bonne façon d'utiliser la fonctionnalité de diffusion?

peut-être le développeur de socket.io a fait une erreur et a ajouté la fonctionnalité de diffusion à l'objet erroné (comme je comprends, il devrait être la caractéristique de l'espace de noms, mais maintenant il est défini seulement pour la socket)?

45
demandé sur JustAMartin 2011-06-25 16:39:31

4 réponses

semble que j'ai pu résoudre cela pour moi-même après avoir ouvert une prime. Désolé à ce sujet.

de toute façon, voir si cela aide:

chat.on('connection', function (socket) {
  socket.on('message', function (msg) {
    socket.emit(msg); // Send message to sender
    socket.broadcast.emit(msg); // Send message to everyone BUT sender
  });
});

cependant, vous pouvez économiser un peu de bande passante et créer une expérience plus snappy pour les utilisateurs si vous ne le renvoyez pas à l'expéditeur. Il suffit d'ajouter leurs messages directement dans le journal de chat, et optionnellement utiliser l'utilisation de l'auto-emit seulement pour confirmer qu'il a été reçu sans problème.

68
répondu 2011-07-16 12:14:33

votre solution fonctionne si vous travaillez dans un environnement pair où les messages du client déclenchent une réponse à tous les autres, mais pas si vous voulez que le serveur envoie des messages à tous les clients.

vous pouvez le faire en utilisant io.sockets.emit :

var io = require('socket.io').listen(80);
io.sockets.emit('message', { message: "Hello everyone!" });

cependant la documentation n'est pas claire sur la façon de faire ceci à un espace de noms spécifique. io.sockets n'est qu'un raccourci vers io.of('') , en tant que tel vous pouvez diffuser à tout le monde sur un espace de nom en appelant io.of('/namespace').emit :

var io = require('socket.io').listen(80);
io.of('/admins').emit('message', { message: "Hello admins!" });
34
répondu Luca Spiller 2012-01-22 10:17:11
var customNS = ioserver.of('/chat'); 

customNS.on('connection', function (socket) {
   socket.on('message', function (msg) {

       // Send message to sender 
       socket.emit(msg);

       // Send message to everyone on customNS INCLUDING sender
       customNS.emit(msg);

       // Send message to everyone on customNS BUT sender
       socket.broadcast.emit(msg);

       // Send message to everyone on ROOM chanel of customNS INCLUDING sender
       customNS.in('ROOM').emit(msg); 

       // Send message to everyone on ROOM chanel of customNS BUT sender
       socket.broadcast.in('ROOM').emit(msg); 


   });
});

cochez également cette réponse envoyer la réponse à tous les clients sauf l'expéditeur (Socket.io)

26
répondu smbeiragh 2017-05-23 12:32:31

peut-être que cela aidera quelqu'un

socket.broadcast.to('room1').emit('updatechat', 'SERVER', username + ' has connected to this room'); 

voir

Nodejs et Socketio Multiroom Chat Tutoriel

14
répondu Shimon Doodkin 2015-11-13 06:32:59