Différence de salles Socket.io entre broadcast.to et sockets.in

102

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()et io.sockets.in()?

knex
la source
14
vote positif pour les données d'exemple
Dave

Réponses:

122

socket.broadcast.todiffuse vers toutes les prises de la pièce donnée, à l' exception de la prise sur laquelle il a été appelé tandis que la io.sockets.indiffusion vers toutes les prises de la pièce donnée.

Daniel Baulig
la source
1
en quoi un canal est-il différent d'une pièce?
vsync
6
dans aucun. Nom différent pour la même chose.
mike_hornbeck
socket.io utilise le terme room au lieu de channel. Cependant, les salles / canaux 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.
Daniel Baulig
40

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

io.sockets.in().emit()et socket.broadcast.to().emit()sont les deux principales méthodes d'émission que nous utilisons dans les salles de Socket.io ( https://github.com/LearnBoost/socket.io/wiki/Rooms ) Les salles permettent un partitionnement simple des clients connectés. Cela permet d'émettre des événements avec des sous-ensembles de la liste de clients connectés, et donne 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 rooms) et ont des fonctionnalités similaires comme les fonctions principales socket.io io.sockets.emit()et socket.broadcast.emit().

Quoi qu'il en soit, je vais essayer de donner les exemples de codes avec les commentaires pour expliquer. Voyez si cela aide;

Socket.io chambres

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}); 

    }
}

À votre santé

Débardeur Gokhan
la source
35

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

Exemple simple

La syntaxe est déroutante dans socketio. De plus, chaque socket est automatiquement connecté à sa propre salle avec l'identifiant 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 salle) dans la salle "ma chambre"

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

Envoyer à tout le monde sauf l'expéditeur (si l'expéditeur est dans la salle) dans la salle "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 socket spécifique uniquement (chat privé)

socket.broadcast.to(otherSocket.id).emit('hello', msg);
K - La toxicité du SO augmente.
la source
Comment trouver otherSocket.id . où le mettre?
Iman Marashi
@ImanMarashi Tout ce que vous avez à faire est d'obtenir l'autre objet socket, puis d'accéder à sa propriété id. otherSocket.on('connect',()=> { console.log(otherSocket.id); });
K - La toxicité du SO augmente.
Impressionnant ! io.to ('ma chambre'). emit ('bonjour', msg); its help me :)
iamkdblue
@ImanMarashi vous enregistrez l'autreSocket.id dans un tableau ou un objet à l'extérieur. Et accédez-y plus tard à partir de n'importe quel socket appelé.
K - La toxicité du SO augmente.
2
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');

};
soleil1211
la source
Pouvez-vous fournir une explication pour accompagner le code? En général, le simple fait de fournir du code est mal vu. Cependant, je peux voir que votre code est bien commenté :)
MBorg
1

Dans Socket.IO 1.0, .to () et .in () sont identiques. Et d'autres dans la salle recevront le message. Le client l'envoie ne recevra pas le message.

Vérifiez le code source (v1.0.6):

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

James J. Ye
la source
Puisque .to()et ,insont les mêmes, alors que se passerait-il lorsque je créerais une pièce avec exactement le même nom que l'identifiant d'une socket. Que ferait socket.broadcast.to(socketid)par exemple alors?
Gust van de Wal