发出事件时,数据是否仅覆盖侦听器或所有客户端?

时间:2017-02-25 19:47:29

标签: node.js sockets websocket socket.io

我已经添加了两个插图来解释这个问题。

那么,有真正的插图吗?如果是的话哪一个是真的?

插图1

enter image description here

插图2

enter image description here

2 个答案:

答案 0 :(得分:2)

来自服务器的

io.emit(msg, data)发送到连接到该服务器的所有客户端。客户端是否正在监听msg并不重要。数据将发送到客户端,如果客户端具有该msg的侦听器,则将调用该msg的事件侦听器。

如果客户端没有该消息的侦听器,则消息将到达,但没有侦听器。那时,它就像任何没有听众的事件一样。事件被触发,但如果没有侦听器,则回调队列为空,因此没有事件处理程序可以调用。

我不太了解两个图表之间的预期差异,但第一个图表正确显示了发送给所有三个客户端的data。第二个图表没有显示,所以它不正确。

请记住,不仅仅是发送的数据。 msg名称也随数据一起发送。这就是接收客户端如何知道触发它的事件处理程序。

你可以想到这样的客户。

  1. 这是传入的消息。
  2. 我是否有听取此消息的人?
  3. 如果是,请致电听众。
  4. 如果没有,请忽略该消息。
  5. 在服务器端,您可以选择如何发送确定邮件来源的邮件:

    io.emit()发送给所有已连接的客户端。

    socket.emit()仅发送到该特定客户端套接字。

    socket.broadcast.emit()发送给除socket所代表的客户以外的所有已连接客户端。

    socket.to(room).emit()发送给该会议室的客户。

    io.of('chat').emit()发送给该命名空间上连接的客户端。

答案 1 :(得分:1)

第一种方式更准确。 socket.io的工作原理是所有客户都在倾听相关事件,如果有人碰巧通过,那么他们将采用那个数据形式。

这是socket.io的简化示例:

设置:

客户A: socket.on('attendance', data)
客户B: socket.on('leaving', data)
客户C: socket.on('attendance', data)

示例场景:

服务器: io.emit('attendance', data)
客户A: if 'attendance' == 'attendance' //true; do something with data
客户B: if 'attendance' == 'leaving' //false; do nothing
客户C: if 'attendance' == 'attendance' //true; do something with data

希望这有帮助!