【问题标题】:What's the difference between io.sockets.emit and broadcast?io.sockets.emit 和广播有什么区别?
【发布时间】:2012-05-07 17:34:41
【问题描述】:

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

【问题讨论】:

标签: node.js socket.io


【解决方案1】:

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

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

This Socket.IO Wiki post will help everyone reading this question:

最近的备忘单也可以在这里查看:

https://socket.io/docs/v4/emit-cheatsheet

【讨论】:

  • 花了 3 个小时排除故障才弄明白。
  • 我可以验证这确实是行为,但我在 Github 文档和 the Socket.io website 上都看不到任何有关 socket.broadcast 或 socket.broadcast.emit 的文档。我错过了什么吗? (维基已经消失)
  • “更好”的是,示例“聊天”应用程序几乎完全使用 socket.broadcast.emit,而该 API 从未在任何地方记录。
  • @Sobiaholic 我仍然没有遇到不将更改发送到当前连接的明显原因。是因为触发事件的客户端已经提前乐观更新了吗?
  • 它不是“除了新创建的连接”,它应该是“除了它自己之外的所有其他客户端”。您可以有一个新创建的连接(一个客户加入聊天室),然后您使用socket.broadcast.emit 发送消息,他们会收到它,但不是您。
【解决方案2】:

socket.broadcast.emit() 的行为类似于 io.sockets.emit,但取而代之的是 发射到所有连接的套接字,它将发射到所有连接的 socket 除了被调用的那个。所以在这种情况下,套接字 socket 引用的将不会收到该事件。

【讨论】:

  • 另一个更新 - 根据 Jayantha 的回答和我自己的分析,它也不会发送到新创建的连接,即在创建“套接字”之后创建的新客户端连接。这是一个重要且关键的区别!
  • Jayantha 所指的“新创建的连接”是正在处理其连接事件并发出广播的套接字。广播的重点是它会发送到除“广播”套接字之外的每个客户端——客户端连接的建立顺序没有区别。
【解决方案3】:

场景:1:- 通过使用 io.sockets.emit Detailed Diagram:-io.sockets.emit

这里每个 Socket 都获取包含 Initiator 的消息。

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

场景:2:- 通过使用 socket.broadcast.emit Detailed Diagram:-socket.broadcast.emit

这里每个套接字都收到消息,除了一个,即 Initiator

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

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

【讨论】:

    【解决方案4】:

    为了简单起见,请考虑以下示例: 有 2 个客户端 client Aclient B 和一个 server 我们正在使用以响应客户端发出的某些事件。

    socket.brodcast.emit()
    

    客户端 A 发送事件 在这种情况下,服务器不会将事件发送回 客户端 A,但会将事件发送到所有其他连接的套接字。所以在这种情况下,只有 client B 会得到事件响应

    io.emit()
    

    客户端 A 发送事​​件,服务器将回复事件发送到所有连接的套接字,包括 客户端 A客户端 B

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      相关资源
      最近更新 更多