119 votes

Salles Socket.io : différence entre broadcast.to et sockets.in

Le fichier readme de Socket.io contient l'exemple suivant :

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

    io.sockets.on('connection', function (socket) {
      socket.join('justin bieber fans');
      socket.broadcast.to('justin bieber fans').emit('new fan');
      io.sockets.in('rammstein fans').emit('new non-fan');
    });

Quelle est la différence entre socket.broadcast.to() y io.sockets.in() ?

19 votes

Upvote pour l'exemple de données

0 votes

133voto

Daniel Baulig Points 4849

socket.broadcast.to diffuse à toutes les prises de courant dans la pièce donnée, sauf à la socket sur laquelle il a été appelé pendant que io.sockets.in diffuse à toutes les prises de courant dans la pièce donnée.

1 votes

En quoi un canal est-il différent d'une pièce ?

7 votes

En aucun cas. Un nom différent pour la même chose.

0 votes

Socket.io utilise le terme room au lieu de channel. Les rooms/channels ne doivent pas être confondus avec les espaces de noms dans socket.io. J'ai mis à jour ma réponse pour utiliser le terme correct.

42voto

Karl Morrison Points 774

Mise à jour 2019 Le module socket.io est un module spécial qui utilise les websockets et revient ensuite à l'interrogation des requêtes http. Pour les websockets uniquement : pour le client, utilisez les websockets natives et pour node.js, utilisez ws ou cette bibliothèque.

Un exemple simple

La syntaxe est confuse dans socketio. De plus, chaque socket est automatiquement connecté à sa propre salle avec l'id socket.id (c'est ainsi que le chat privé fonctionne dans socketio, ils utilisent des salles).

Envoyer à l'expéditeur et à personne d'autre

socket.emit('hello', msg);

Envoyer à tout le monde y compris l'expéditeur (si l'expéditeur est dans la pièce) en la chambre "ma chambre"

io.to('my room').emit('hello', msg);

Envoyer à tout le monde sauf l'expéditeur (si l'expéditeur est dans la pièce) en la chambre "ma chambre"

socket.broadcast.to('my room').emit('hello', msg);

Envoyer à tout le monde dans chaque pièce , y compris l'expéditeur

io.emit('hello', msg); // short version

io.sockets.emit('hello', msg);

Envoyer à une prise spécifique uniquement (chat privé)

socket.broadcast.to(otherSocket.id).emit('hello', msg);

42voto

Gokhan Tank Points 2365

Node.js était quelque chose qui m'intéressait vraiment depuis longtemps et je l'ai utilisé dans un de mes projets pour créer un jeu multijoueur.

io.sockets.in().emit() y socket.broadcast.to().emit() sont les deux principales méthodes d'émission que nous utilisons dans les chambres de Socket.io ( https://github.com/LearnBoost/socket.io/wiki/Rooms ) Les chambres permettent un partitionnement simple des clients connectés. Cela permet d'émettre des événements pour des sous-ensembles de la liste des clients connectés et offre une méthode simple pour les gérer.

Ils nous permettent de gérer les sous-ensembles de la liste des clients connectés (que nous appelons des salles) et ont les mêmes fonctionnalités que les fonctions principales de socket.io. io.sockets.emit() y socket.broadcast.emit() .

Quoi qu'il en soit, je vais essayer de donner les codes d'exemple avec les commentaires pour expliquer. Voyons si cela peut aider ;

Socket.io Rooms

i) io.sockets.in().emit() ;

/* Send message to the room1. It broadcasts the data to all 
   the socket clients which are connected to the room1 */

io.sockets.in('room1').emit('function', {foo:bar});

ii) socket.broadcast.to().emit() ;

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

        /* Broadcast to room1 except the sender. In other word, 
            It broadcast all the socket clients which are connected 
            to the room1 except the sender */
        socket.broadcast.to('room1').emit('function', {foo:bar});

    }
}

Socket.io

i) io.sockets.emit() ;

/* Send message to all. It broadcasts the data to all 
   the socket clients which are connected to the server; */

io.sockets.emit('function', {foo:bar});

ii) socket.broadcast.emit() ;

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

        // Broadcast to all the socket clients except the sender
        socket.broadcast.emit('function', {foo:bar}); 

    }
}

Cheers

11voto

sun1211 Points 81
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 a specific room in a specific namespace, including sender
  io.of('myNamespace').to('room').emit('event', 'message');

  // sending to individual socketid (private message)
  io.to(`${socketId}`).emit('hey', 'I just met you');

  // WARNING: `socket.to(socket.id).emit()` will NOT work, as it will send to everyone in the room
  // named `socket.id` but the sender. Please use the classic `socket.emit()` instead.

  // 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?');

  // specifying whether the data to send has binary data
  socket.binary(false).emit('what', 'I have no binaries!');

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

  // sending to all connected clients
  io.emit('an event sent to all connected clients');

};

1voto

James Ye Points 169

Dans Socket.IO 1.0, .to() et .in() sont les mêmes. Et les autres personnes présentes dans la pièce recevront le message. Le client qui l'envoie ne recevra pas le message.

Consultez le code source (v1.0.6) :

https://github.com/Automattic/socket.io/blob/a40068b5f328fe50a2cd1e54c681be792d89a595/lib/socket.js#L173

0 votes

Desde .to() y ,in sont les mêmes, alors que se passerait-il si je créais une pièce avec le même nom que l'identifiant d'une socket. Que se passerait-il si socket.broadcast.to(socketid) par exemple font alors ?

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