了解 emit 方法的各种上下文

Posted

技术标签:

【中文标题】了解 emit 方法的各种上下文【英文标题】:Understanding the various contexts of the emit method 【发布时间】:2018-03-21 09:01:30 【问题描述】:

我正在尝试了解以下各项的上下文:

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

据我了解:

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

io 变量代表socket 变量的集合

到目前为止,我想出了以下内容。我还没有弄清楚第二个和第五个选项的用途。所以也许他们不存在。但是,我不确定第一个和第三个选项之间有什么区别:

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

是否曾经使用过第二个和第五个选项?第一个选项和第三个选项有什么区别?

【问题讨论】:

Send response to all clients except sender的可能重复 这不是 Retro Gamer 声称的副本的副本。我已经向 Retro Gamer 提到我的问题部分基于此页面。他似乎被我冒犯了,表示他的答案不是一个好的答案,然后继续发布他的链接作为我的问题的副本,这显然不是。 请查看this question 的答案(第一和第二)。如果你做一个简单的 Ctrl-find,你会找到io.emitio.sockets.emitsocket.emitsockets.emitsocket.broadcast.emit 的答案。唯一似乎没有描述的是io.socket.emit。很明显,您的答案(大部分)在上面/下面的链接中。请理解,我没有被冒犯,但我试图避免复杂的问题,因为 Stack Overflow 中已经有太多的问题了。 【参考方案1】:

我看到的记录在案的是:

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() 将发送到所有连接的客户端,而不管命名空间如何。

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

是否曾经使用过第二个和第三个选项?

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

第一个选项和第三个选项有什么区别?

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

【讨论】:

谢谢。另外,我的第一个问题应该是“第二和第五”选项,而不是“第二和第三选项”。 @kojow7 - 好吧,我不知道任何名为 sockets 的变量(在您的第 5 个选项中)所以我不认为 sockets.emit() 有效。你是从哪里得到这个概念的? 在搜索各种形式的发射时,我遇到了对“sockets.emit()”的不同引用。但是,似乎发布它们的人可能犯了一个错误。一个例子在这里:groups.google.com/forum/#!topic/socket_io/bjckmgTOQeE @kojow7 - 我认为他们只是指io.sockets.emit(),而不是sockets.emit()。没有名为sockets 的全局变量。有人只是将sockets 称为io.sockets 的快捷方式。 谢谢。是的,你可能是对的。我最初编制了一份我发现的不同实例的列表。还有一些地方谈论 io.socket.emit,例如 medium.com/@abc810221/… - 但也许那只是不正确的代码。【参考方案2】:

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

【讨论】:

您的回答没有帮助。事实上,这是我从中获得一些信息的地方。此外,并非我询问的所有内容都列在那里。例如:io.sockets.emit 未在此处列出。 @kojow7 那么看看这个问题:***.com/questions/10342681/…a 通过简单的谷歌搜索发现。你为什么不直接谷歌你有问题的每一个发射? 或者这个:***.com/questions/10058226/…

以上是关于了解 emit 方法的各种上下文的主要内容,如果未能解决你的问题,请参考以下文章

Vue3子组件向父组件返回数据

获取 Android 上下文的各种方法有啥区别?

解决Java异步场景下丢失线程上下文的方法

java中获取各种上下文路径的方法小结

了解 qthread 子类的运行方法和线程上下文

再看ExpressionTree,Emit,反射创建对象性能对比