48 votes

socket.io - comment diffuser des messages sur un espace de noms?

Selon le support.io exemples:

Pour la diffusion, il suffit d'ajouter un broadcast le drapeau en emit et send des appels de méthode. La diffusion de l'envoi d'un message à tout le monde, sauf pour le socket qui démarre.

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

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

J'ai essayé de combiner cela avec le nouveau socket.io namsepace fonctionnalité, j'ai obtenu 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 bien, tout le monde sur le canal de discussion (et pas d'autres canaux) reçoit le message. Mais l'expéditeur aussi qu'il obtient. 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 il a eu une Exception: "Impossible d'appeler la méthode 'envoyer' undefined.' Ok, alors j'ai pensé, que la diffusion est la fonction d'un seul support (il se sent un peu bizarre, même si - faire une seule prise peut diffusent à 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, même pas l'expéditeur. De toute façon, c'était ce que je devrait logiquement - un socket à ne pas diffuser de quelque chose par lui-même. Et aucune des exceptions en ce moment, donc la diffusion est définie pour la prise.

Si je fais:

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

alors seulement l'expéditeur d'origine reçoit le message, et qui est encore assez logique - j'ai utilisé le "envoyer" du client liés à la prise.

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

Peut-être que le développeur de la prise.io fait une erreur et a ajouté la fonctionnalité de diffusion pour le mauvais objet (ce que je comprends, ça doit être la caractéristique de l'espace de noms mais maintenant, il n'est définie que pour le support)?

36voto

Luca Spiller Points 955

Vous solution fonctionne si vous travaillez dans un evented environnement où les messages à partir du client de déclencher une réponse à tous les autres, mais pas si vous souhaitez que le serveur de messages envoyés à tous les clients.

Vous pouvez faire cela en utilisant io.sockets.emit:

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

Toutefois, la documentation n'est pas claire pour savoir comment faire cela à un espace de noms spécifique. io.sockets est juste un raccourci pour io.of(''), en tant que tel, vous pouvez diffuser à tout le monde sur un espace de noms en appelant io.of('/namespace').emit:

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

29voto

smbeiragh Points 31
 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 chat namespace INCLUDING sender
       customNS.emit(msg);

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

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

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


   });
});
 

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

14voto

Shimon Doodkin Points 574

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

0voto

Lalith Points 3372

Essayez http://nowjs.com/ ou voyez comment ils le font?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X