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

Selon les exemples de socket.io:

Pour diffuser, ajoutez simplement un indicateur de broadcast pour emit et send appels de méthode. Diffuser signifie envoyer un message à tout le monde à l’exception de la prise qui le lance.

 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 la nouvelle fonctionnalité socket.io namsepace, 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 bien, tout le monde sur le canal de discussion (et aucun autre canal) reçoit le message. Mais l’expéditeur l’obtient également. Donc j’ai 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’ send ‘d’undefined.’ Ok, donc je pensais que cette diffusion est la caractéristique d’une seule socket (ça fait un peu bizarre – comment une seule socket peut être diffusée sur 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 encore pire – personne n’a reçu le message, pas même l’expéditeur. Quoi qu’il en soit, c’était ce à quoi je m’attendais logiquement – une seule socket ne peut pas diffuser quelque chose par elle-même. Et pas d’exceptions cette fois, la diffusion est donc 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 d’origine reçoit le message, ce qui est encore très logique – j’ai utilisé le ‘send’ du socket associé au client.

La question est donc la suivante: quelle est la manière correcte d’utiliser la fonctionnalité de diffusion?

Peut-être que le développeur de socket.io a fait une erreur et a ajouté la fonctionnalité de diffusion au mauvais object (si je comprends bien, cela devrait être la fonctionnalité de l’espace de nommage mais maintenant il est défini uniquement pour le socket)?

Il me semble que j’ai pu résoudre ce problème moi-même après avoir ouvert une prime. Désolé pour ça.

Quoi qu’il en soit, voyez si cela vous 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 de la bande passante et créer une expérience plus vive pour les utilisateurs si vous ne la renvoyez pas à l’expéditeur. Ajoutez simplement leurs messages directement au journal de chat, et utilisez éventuellement use only auto-emit pour confirmer qu’il a été reçu sans problème.

Votre solution fonctionne si vous travaillez dans un environnement avec événements où les messages du client déclenchent une réponse à tous les autres, mais pas si vous souhaitez 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 manière de procéder à un espace de noms spécifique. io.sockets est juste un raccourci vers 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!" }); 
 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 une réponse à tous les clients sauf l’expéditeur (Socket.io)

Peut-être que cela aidera quelqu’un

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

voir

Tutoriel Nodejs et Socketio Multiroom Chat