Різниця номерів Socket.io між Broad.to і sockets.in


102

Ремед Socket.io містить такий приклад:

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

Яка різниця між socket.broadcast.to()і io.sockets.in()?


14
піднести для прикладу дані
Дей

Відповіді:


122

socket.broadcast.toпередає всі розетки в даній кімнаті, за винятком розетки, на яку вона була викликана, під час io.sockets.inтрансляції до всіх розеток даної кімнати.


1
чим канал відрізняється від кімнати?
vsync

6
в жодному. Різна назва однієї і тієї ж речі.
mike_hornbeck

socket.io використовує термін room замість каналу. кімнати / канали не слід плутати з просторами імен в socket.io, хоча. Я оновив свою відповідь, щоб використовувати правильний термін.
Даніель Бауліг

40

Node.js був чимось, що мене дуже цікавило, і я використав це в одному зі своїх проектів, щоб зробити багатокористувацьку гру.

io.sockets.in().emit()і socket.broadcast.to().emit()є основними двома методами випромінювання, якими ми користуємося в кімнатах Socket.io ( https://github.com/LearnBoost/socket.io/wiki/Rooms ). Номери дозволяють провести простою секціонування підключених клієнтів. Це дозволяє передавати події разом із підмножинами списку підключених клієнтів та дає простий метод управління ними.

Вони дозволяють нам керувати підмножинами списку підключених клієнтів (які ми називаємо номерами) і мають подібні функції, як основні функції socket.io io.sockets.emit()та socket.broadcast.emit().

У будь-якому випадку я спробую навести приклади кодів із коментарями, щоб пояснити. Подивіться, чи допомагає це;

Socket.io Кімнати

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

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

    }
}

Ура


35

Оновлення 2019 : socket.io - це спеціальний модуль, який використовує веб-розетки, а потім резервне опитування на запит http. Для просто веб-сокетів: для клієнта використовуйте рідні веб-сокети, а для node.js використовуйте ws або цю бібліотеку.

Простий приклад

Синтаксис заплутаний у socketio. Крім того, кожна розетка автоматично підключається до власної кімнати з ідентифікатором socket.id(саме так працює приватний чат в сокетті, вони використовують кімнати).

Надіслати відправника та більше нікому

socket.emit('hello', msg);

Надіслати всім, включаючи відправника (якщо відправник знаходиться в кімнаті) у кімнаті "моя кімната"

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

Надіслати всім, крім відправника (якщо відправник знаходиться в кімнаті) у кімнаті "моя кімната"

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

Надсилайте всіх у кожну кімнату , включаючи відправника

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

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

Надіслати лише до конкретної розетки (приватний чат)

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

Як знайти otherSocket.id . куди його встановити?
Іман Мараші

@ImanMarashi Все, що вам потрібно зробити, це отримати інший об’єкт сокета і потім отримати доступ до його власності id. otherSocket.on('connect',()=> { console.log(otherSocket.id); });
K - Токсичність в SO зростає.

Дивовижно! io.to ('моя кімната'). emit ('привіт', мсг); його допомога мені :)
iamkdblue

@ImanMarashi ви зберігаєте otherSocket.id в масиві або об'єкті зовні. І отримати доступ до нього пізніше з будь-якого гнізда, коли вас викликають.
K - Токсичність в SO зростає.

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

};

Чи можете ви надати пояснення до супроводу коду? Як правило, лише надання коду нахмуриться. Однак я можу побачити, що ваш код добре прокоментований :)
MBorg

1

У Socket.IO 1.0, .to () та .in () однакові. А інші в кімнаті отримають повідомлення. Клієнт, який надсилає його, не отримає повідомлення.

Перевірте вихідний код (v1.0.6):

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


Оскільки .to()і ,inтакі самі, то що буде, коли я створю кімнату з таким же ім'ям, як ідентифікатор якогось сокета. Що б, socket.broadcast.to(socketid)наприклад, зробив тоді?
Густ ван де Валь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.