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

Answers:


174

io.sockets.emit 将发送给所有客户

socket.broadcast.emit 会将消息发送给除新建连接以外的所有其他客户端

此Socket.IO Wiki帖子将帮助所有人阅读以下问题:


22
花费了3个小时的麻烦才能解决。
Petrogad 2014年

我可以验证这确实是行为,但是在Github文档或Socket.io网站上都看不到关于socket.broadcast或socket.broadcast.emit的任何文档。我想念什么吗?(并且Wiki消失了)
scipilot 2015年

1
甚至“更好”的是,示例“聊天”应用程序几乎独占使用socket.broadcast.emit该API ,而从未在任何地方记录该API。
阿维·切里

@Sobiaholic我仍然没有遇到不将更改发布到当前连接的明显原因。当触发事件的客户已经事先进行了乐观更新时,该使用它吗?
Nick Pineda

2
它不是“除了新创建的连接”,而应该是“除自身以外的所有其他客户端”。您可以建立一个新的连接(客户端加入聊天室),然后使用发送消息socket.broadcast.emit,他们会收到消息,但您不会。
NiCk Newman

47

socket.broadcast.emit()行为与相似io.sockets.emit,但它不会向所有连接的套接字发出信号,而是会向所有已连接的套接字发出信号,除了被调用的那个套接字。因此,在这种情况下,由引用的套接字socket将不会接收该事件。


6
再更新一次-根据Jayantha的回答和我自己的分析,它也不会释放给新创建的连接,即在创建“套接字”之后创建的新客户端连接。这是重要且关键的区别!
Anmol Saraf

6
Jayantha所指的“新创建的连接”是正在处理连接事件并且将发布广播的套接字。广播的重点是,除了“广播”套接字外,它都传递给每个客户端-客户端连接建立的顺序没有区别。
分号2014年

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

结论:-现在将完全取决于我们的业务需求,哪一个更可取。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.