Socket.io Zimmer Unterschied zwischen Broadcast.to und Sockets.in

102

Die Readme-Datei von Socket.io enthält das folgende Beispiel:

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

Was ist der Unterschied zwischen socket.broadcast.to()und io.sockets.in()?

knex
quelle
14
Upvote für die Beispieldaten
Dave

Antworten:

122

socket.broadcast.toSendungen an alle Steckdosen im angegebenen Raum, mit Ausnahme der Steckdose, an der sie aufgerufen wurden, während io.sockets.inSendungen an alle Steckdosen im angegebenen Raum gesendet werden.

Daniel Baulig
quelle
1
Inwiefern unterscheidet sich ein Kanal von einem Raum?
vsync
6
in keiner. Unterschiedlicher Name für dasselbe.
Mike_hornbeck
socket.io verwendet den Begriff Raum anstelle von Kanal. Räume / Kanäle sind jedoch nicht mit Namespaces in socket.io zu verwechseln. Ich habe meine Antwort aktualisiert, um den richtigen Begriff zu verwenden.
Daniel Baulig
40

Node.js war etwas, das mich schon lange wirklich interessiert hat, und ich habe es in einem meiner Projekte verwendet, um ein Multiplayer-Spiel zu erstellen.

io.sockets.in().emit()und socket.broadcast.to().emit()sind die beiden wichtigsten Emit-Methoden, die wir in den Räumen von Socket.io verwenden ( https://github.com/LearnBoost/socket.io/wiki/Rooms ). Räume ermöglichen eine einfache Partitionierung der verbundenen Clients. Dies ermöglicht die Ausgabe von Ereignissen an Teilmengen der Liste der verbundenen Clients und bietet eine einfache Methode zu deren Verwaltung.

Sie ermöglichen es uns, die Teilmengen der Liste der verbundenen Clients (die wir Räume nennen) zu verwalten und verfügen über ähnliche Funktionen wie die Hauptfunktionen von socket.io io.sockets.emit()und socket.broadcast.emit().

Auf jeden Fall werde ich versuchen, die Beispielcodes mit den zu erklärenden Kommentaren anzugeben. Sehen Sie, ob es hilft;

Socket.io Zimmer

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

    }
}

Prost

Gokhan Panzer
quelle
35

Update 2019 : socket.io ist ein spezielles Modul, das Websockets verwendet und dann auf die Abfrage von http-Anforderungen zurückgreift. Nur für Websockets: Verwenden Sie für den Client native Websockets und für node.js ws oder diese Bibliothek.

Einfaches Beispiel

Die Syntax ist in socketio verwirrend. Außerdem wird jeder Socket automatisch mit der ID mit seinem eigenen Raum verbunden socket.id(so funktioniert der private Chat in Socketio, sie verwenden Räume).

An den Absender und sonst niemanden senden

socket.emit('hello', msg);

Senden Sie an alle, einschließlich des Absenders (wenn der Absender im Raum ist) im Raum "Mein Zimmer"

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

Senden Sie an alle außer dem Absender (wenn der Absender im Raum ist) im Raum "Mein Zimmer"

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

Senden Sie an alle in jedem Raum , einschließlich des Absenders

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

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

Nur an einen bestimmten Socket senden (privater Chat)

socket.broadcast.to(otherSocket.id).emit('hello', msg);
K - Die Toxizität in SO nimmt zu.
quelle
So finden Sie otherSocket.id . wo soll es eingestellt werden?
Iman Marashi
@ImanMarashi Alles, was Sie tun müssen, ist das andere Socket-Objekt abzurufen und dann auf seine ID-Eigenschaft zuzugreifen. otherSocket.on('connect',()=> { console.log(otherSocket.id); });
K - Die Toxizität in SO nimmt zu.
Genial ! io.to ('mein Zimmer'). emit ('Hallo', msg); Es hilft mir :)
iamkdblue
@ImanMarashi Sie speichern die otherSocket.id in einem Array oder Objekt außerhalb. Und greifen Sie später von jedem Socket aus zu, der angerufen wird.
K - Die Toxizität in SO nimmt zu.
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');

};
sun1211
quelle
Können Sie eine Erklärung zum Code abgeben? Im Allgemeinen ist es verpönt, nur Code bereitzustellen. Ich kann jedoch sehen, dass Ihr Code gut kommentiert ist :)
MBorg
1

In Socket.IO 1.0 sind .to () und .in () identisch. Und andere im Raum erhalten die Nachricht. Der Client sendet die Nachricht nicht.

Überprüfen Sie den Quellcode (v1.0.6):

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

James J. Ye
quelle
Da .to()und ,insind die gleichen, was würde dann passieren, wenn ich einen Raum mit genau dem gleichen Namen wie die ID einer Steckdose erstelle. Was würde socket.broadcast.to(socketid)zum Beispiel dann tun?
Gust van de Wal