Envoyer une réponse à tous les clients sauf l'expéditeur

226

Pour envoyer quelque chose à tous les clients, vous utilisez:

io.sockets.emit('response', data);

Pour recevoir des clients, vous utilisez:

socket.on('cursor', function(data) {
  ...
});

Comment puis-je combiner les deux pour que lors de la réception d'un message sur le serveur à partir d'un client, j'envoie ce message à tous les utilisateurs sauf celui qui envoie le message?

socket.on('cursor', function(data) {
  io.sockets.emit('response', data);
});

Dois-je le pirater en envoyant l'ID client avec le message puis en vérifiant du côté client ou existe-t-il un moyen plus simple?

switz
la source

Réponses:

840

Voici ma liste (mise à jour pour 1.0) :

// sending to sender-client only
socket.emit('message', "this is a test");

// sending to all clients, include sender
io.emit('message', "this is a test");

// sending to all clients except sender
socket.broadcast.emit('message', "this is a test");

// sending to all clients in 'game' room(channel) except sender
socket.broadcast.to('game').emit('message', 'nice game');

// sending to all clients in 'game' room(channel), include sender
io.in('game').emit('message', 'cool game');

// sending to sender client, only if they are in 'game' room(channel)
socket.to('game').emit('message', 'enjoy the game');

// sending to all clients in namespace 'myNamespace', include sender
io.of('myNamespace').emit('message', 'gg');

// sending to individual socketid
socket.broadcast.to(socketid).emit('message', 'for your eyes only');

// list socketid
for (var socketid in io.sockets.sockets) {}
 OR
Object.keys(io.sockets.sockets).forEach((socketid) => {});
LearnRPG
la source
14
Souhaitez-vous contribuer à la FAQ ? ou puis-je le faire pour vous? (Je fournirais un backlink ici)
Kos
1
je n'ai pas de iohere.onlysocket
chovy
2
En complément de // sending to all clients except senderquoi utiliser // sending a response to sender client only ?
Basj
4
Pourriez-vous s'il vous plaît ajouter que selon le socket # in , diffusesocket.to('others').emit('an event', { some: 'data' }); également dans une pièce.
gongzhitaao
119
C'est plus utile que tout sur les documents socket.io combinés
Jonathan.
43

De la réponse @LearnRPG mais avec 1.0:

 // send to current request socket client
 socket.emit('message', "this is a test");

 // sending to all clients, include sender
 io.sockets.emit('message', "this is a test"); //still works
 //or
 io.emit('message', 'this is a test');

 // sending to all clients except sender
 socket.broadcast.emit('message', "this is a test");

 // sending to all clients in 'game' room(channel) except sender
 socket.broadcast.to('game').emit('message', 'nice game');

 // sending to all clients in 'game' room(channel), include sender
 // docs says "simply use to or in when broadcasting or emitting"
 io.in('game').emit('message', 'cool game');

 // sending to individual socketid, socketid is like a room
 socket.broadcast.to(socketid).emit('message', 'for your eyes only');

Pour répondre au commentaire @Crashalot, socketidvient de:

var io = require('socket.io')(server);
io.on('connection', function(socket) { console.log(socket.id); })
soyuka
la source
3
Impressionnant! Comment obtenez-vous l' socketidenvoi vers une prise individuelle?
Crashalot
2
Modifié avec une réponse à votre question. Fondamentalement, c'est à socket.idpartir de votre objet socket.
soyuka
pour l'envoi à un individu, vous pouvez utiliser socket.emit en retour qui l'envoie ou vous pouvez regrouper les clients connectés et faire @Crashalot
ujwal dhakal
12

Voici une réponse plus complète sur ce qui est passé de 0.9.x à 1.x.

 // send to current request socket client
 socket.emit('message', "this is a test");// Hasn't changed

 // sending to all clients, include sender
 io.sockets.emit('message', "this is a test"); // Old way, still compatible
 io.emit('message', 'this is a test');// New way, works only in 1.x

 // sending to all clients except sender
 socket.broadcast.emit('message', "this is a test");// Hasn't changed

 // sending to all clients in 'game' room(channel) except sender
 socket.broadcast.to('game').emit('message', 'nice game');// Hasn't changed

 // sending to all clients in 'game' room(channel), include sender
 io.sockets.in('game').emit('message', 'cool game');// Old way, DOES NOT WORK ANYMORE
 io.in('game').emit('message', 'cool game');// New way
 io.to('game').emit('message', 'cool game');// New way, "in" or "to" are the exact same: "And then simply use to or in (they are the same) when broadcasting or emitting:" from http://socket.io/docs/rooms-and-namespaces/

 // sending to individual socketid, socketid is like a room
 io.sockets.socket(socketid).emit('message', 'for your eyes only');// Old way, DOES NOT WORK ANYMORE
 socket.broadcast.to(socketid).emit('message', 'for your eyes only');// New way

Je voulais modifier le post de @soyuka mais ma modification a été rejetée par un examen par les pairs.

Vadorequest
la source
6

broadcast.emit envoie le msg à tous les autres clients (à l'exception de l'expéditeur)

socket.on('cursor', function(data) {
  socket.broadcast.emit('msg', data);
});
Khaled Jouda
la source
6

Emis cheatsheet

io.on('connect', onConnect);

function onConnect(socket){

  // sending to the client
  socket.emit('hello', 'can you hear me?', 1, 2, 'abc');

  // sending to all clients except sender
  socket.broadcast.emit('broadcast', 'hello friends!');

  // sending to all clients in 'game' room except sender
  socket.to('game').emit('nice game', "let's play a game");

  // sending to all clients in 'game1' and/or in 'game2' room, except sender
  socket.to('game1').to('game2').emit('nice game', "let's play a game (too)");

  // sending to all clients in 'game' room, including sender
  io.in('game').emit('big-announcement', 'the game will start soon');

  // sending to all clients in namespace 'myNamespace', including sender
  io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon');

  // sending to individual socketid (private message)
  socket.to(<socketid>).emit('hey', 'I just met you');

  // sending with acknowledgement
  socket.emit('question', 'do you think so?', function (answer) {});

  // sending without compression
  socket.compress(false).emit('uncompressed', "that's rough");

  // sending a message that might be dropped if the client is not ready to receive messages
  socket.volatile.emit('maybe', 'do you really need it?');

  // sending to all clients on this node (when using multiple nodes)
  io.local.emit('hi', 'my lovely babies');

};
Prasanna Brabourame
la source
4

Pour les espaces de noms dans les pièces, la liste des clients dans une pièce en boucle (similaire à la réponse de Nav) est l'une des deux seules approches que j'ai trouvées qui fonctionneront. L'autre consiste à utiliser exclure. PAR EXEMPLE

socket.on('message',function(data) {
    io.of( 'namespace' ).in( data.roomID ).except( socket.id ).emit('message',data);
}
couronné
la source
7
sauf a été supprimé de 1.x: /
coulix
1

Autres cas

io.of('/chat').on('connection', function (socket) {
    //sending to all clients in 'room' and you
    io.of('/chat').in('room').emit('message', "data");
};
Kim Thien Dung
la source
1

Mise à jour de la liste pour plus de documentation.

socket.emit('message', "this is a test"); //sending to sender-client only
socket.broadcast.emit('message', "this is a test"); //sending to all clients except sender
socket.broadcast.to('game').emit('message', 'nice game'); //sending to all clients in 'game' room(channel) except sender
socket.to('game').emit('message', 'enjoy the game'); //sending to sender client, only if they are in 'game' room(channel)
socket.broadcast.to(socketid).emit('message', 'for your eyes only'); //sending to individual socketid
io.emit('message', "this is a test"); //sending to all clients, include sender
io.in('game').emit('message', 'cool game'); //sending to all clients in 'game' room(channel), include sender
io.of('myNamespace').emit('message', 'gg'); //sending to all clients in namespace 'myNamespace', include sender
socket.emit(); //send to all connected clients
socket.broadcast.emit(); //send to all connected clients except the one that sent the message
socket.on(); //event listener, can be called on client to execute on server
io.sockets.socket(); //for emiting to specific clients
io.sockets.emit(); //send to all connected clients (same as socket.emit)
io.sockets.on() ; //initial connection from a client.

J'espère que cela t'aides.

Kent Aguilar
la source
'io.sockets.emit' est identique à 'io.emit', pas 'socket.emit'
Doctor.Who.
'socket.to (' jeu '). emit' est égal à 'socket.broadcast.to (' jeu '). emit' donc le commentaire ci-dessus est faux
Docteur.Qui.
0

utiliser ce codage

io.sockets.on('connection', function (socket) {

    socket.on('mousemove', function (data) {

        socket.broadcast.emit('moving', data);
    });

ce socket.broadcast.emit () émettra tout dans la fonction sauf sur le serveur qui émet

Abi
la source
1
comment obtenez-vous à l' iointérieur si le rappel est défini dans le fichier anthère
chovy
J'ai mon application dans plusieurs fichiers, et je les concatène avec PrePros ou Koala au lieu de les exiger, cela me permet de partager toutes leurs variables
Steel Brain
1
Ou avoir iocomme global
Vadorequest
0

J'utilise des espaces de noms et des pièces - j'ai trouvé

socket.broadcast.to('room1').emit('event', 'hi');

travailler où

namespace.broadcast.to('room1').emit('event', 'hi');

n'a pas

(si quelqu'un d'autre fait face à ce problème)

Reabow
la source