В чем разница между io.sockets.emit и трансляцией?

98

В чем разница между io.sockets.emit и socket.broadcast.emit? Это только широковещательная передача для всех, НО сокет, который ее отправляет?

Похоже, их можно использовать как взаимозаменяемые:

io.sockets.on('connection', function (socket) {
  //these should do the same thing  
  io.sockets.emit('this', { receivers: 'everyone'});

  socket.broadcast.emit('this', { receivers: 'everyone but socket'}); //emits to everyone but socket
  socket.emit('this', { receivers: 'socket'}); //emits to socket
});
Swiecki
источник

Ответы:

176

io.sockets.emit отправим всем клиентам

socket.broadcast.emit отправит сообщение всем другим клиентам, кроме вновь созданного соединения

Этот пост вики для Socket.IO поможет всем, кто читает этот вопрос:

Джаянта Лал Сирисена
источник
23
ну, чтобы выяснить это, потребовалось 3 часа поиска неисправностей.
Петрогад
Я могу убедиться, что это действительно так, но я не вижу никакой документации для socket.broadcast или socket.broadcast.emit ни в документации Github, ни на веб-сайте Socket.io . Я что-то упускаю? (и вики уже нет)
scipilot
1
Что еще «лучше» в этом, так это то, что в примере приложения «чат» используется почти исключительное использование, в socket.broadcast.emitто время как этот API нигде не документирован.
Avi Cherry
@Sobiaholic Я до сих пор не столкнулся с очевидной причиной, по которой не выдаются изменения в текущем соединении. Это когда клиент, инициировавший событие, уже сделал оптимистичное обновление заранее?
Ник Пинеда
2
Это не «кроме вновь созданных соединений», это должно быть «ко всем другим клиентам, кроме себя». У вас может быть недавно созданное соединение (клиент, присоединяющийся к комнате чата), и вы отправляете сообщение, используя, socket.broadcast.emitи они получат его, но не вы.
NiCk Newman
47

socket.broadcast.emit()ведет себя аналогично io.sockets.emit, но вместо того, чтобы излучать все подключенные сокеты, он будет излучать все подключенные сокеты, кроме того, на котором он вызывается. Таким образом, в этом случае сокет, на который указывает ссылка, socketне получит событие.

Картик Рао
источник
6
еще одно обновление - согласно ответу Jayantha и моему собственному анализу, он также НЕ испускает новые созданные соединения, то есть новые клиентские соединения, которые были созданы после создания «сокета». Это важное и ключевое отличие !!
Анмол Сараф,
6
«Недавно созданное соединение», на которое ссылается Джаянта, - это сокет, событие соединения которого обрабатывается и который будет передавать широковещательную передачу. Суть трансляции в том, что она идет к каждому клиенту, кроме «широковещательного» сокета - порядок, в котором были установлены клиентские соединения, не имеет значения.
Точка с запятой
8

Сценарий: 1: - При использовании io.sockets.emit Подробная диаграмма: -io.sockets.emit

Здесь каждый сокет получает сообщение, включая инициатора .

  // BY IO>SOCKETS>EMIT
   io.sockets.emit('MyChannelBroadcast',
               {
                 owner:"Anshu Ashish",
                 clientCount:clients,
                 message:"Welcome All"
               }
    );

Сценарий: 2: - С помощью socket.broadcast.emit Подробная диаграмма: -socket.broadcast.emit

Здесь все сокеты получают сообщение, кроме одного, то есть инициатора .

    // BY SOCKET>BROADCAST>EMIT
   socket.broadcast.emit('BroadCastExceptMe',{data:"HAVE A NICE DAY"});

Вывод: - Теперь полностью зависит от требований нашего бизнеса, какое из них будет предпочтительнее.

Аншу Ашиш
источник