理解emit方法的各种上下文

时间:2017-10-10 04:15:12

标签: node.js socket.io

我试图了解以下各项的背景:

  • io.emit
  • io.socket.emit
  • io.sockets.emit
  • socket.emit
  • sockets.emit
  • socket.broadcast.emit

据我所知:

socket变量表示当前正在与之通信的单个连接。

io变量代表socket变量的集合

到目前为止,我已经提出了以下建议。我还没弄明白第二和第五选择是什么。也许他们可能不存在。但是,我不确定第1和第3选项之间的区别是什么:

  • io.emit - 向所有客户发送消息
  • io.socket.emit
  • io.sockets.emit - 向所有客户发送消息
  • socket.emit - 向单个客户端发送消息
  • sockets.emit
  • socket.broadcast.emit - 发送给除发件人之外的所有客户

是否使用过第2和第5个选项?第1和第3选项有什么区别?

2 个答案:

答案 0 :(得分:2)

我看到的记录是:

io.emit()                  - send to all connected clients
io.sockets.emit()          - send to all clients in the "/" namespace
io.to(roomName).emit()     - send to all clients in a particular room
io.in(roomName).emit()     - .in() is the same as .to()
io.of(nsp).emit()          - send to all clients in a particular namespace
io.of(nsp).to(room).emit() - send to clients in a namespace that are in a room

namespace.emit()           - send to all clients in a particular namespace

socket.emit()              - send to single client
socket.broadcast.emit()    - send to all connected clients except socket

io.sockets是默认的/命名空间,因此它是io.of('/')的特例。因此,io.sockets.emit()只是在io.of('/').emit()中发送到命名空间。

如果您的客户端没有连接到任何自定义命名空间,那么您的所有客户端连接都将位于/命名空间中,因此io.emit()io.sockets.emit()将最终执行相同的操作。但是,如果您有任何客户端连接到自定义命名空间,则io.sockets.emit()将仅发送到/命名空间中的套接字,而io.emit()将发送到所有连接的客户端,而不管命名空间。< / p>

我不知道sockets变量或io.socket属性。如果它们确实存在,则它们似乎没有记录,我不建议使用它们。

  

是否使用过第2和第3个选项?

我不知道对io.socket.emit()的支持。 io.sockets.emit()广播到连接到默认命名空间的所有客户端,当使用其他命名空间时,它会有用。

  

第1和第3选项有什么区别?

正如我上面所解释的,当有任何客户端连接到自定义命名空间时,io.emit()io.sockets.emit()之间存在差异。

答案 1 :(得分:-2)

阅读Documentation以及this question的答案。它拥有您需要的一切。