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éthodesemit
etsend
. 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)?
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.
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!" });
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)
peut-être que cela aidera quelqu'un
socket.broadcast.to('room1').emit('updatechat', 'SERVER', username + ' has connected to this room');
voir