В чем разница между 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
});

Ответы:


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.