【问题标题】:what is actually the default behavior of socket.io?socket.io 的默认行为实际上是什么?
【发布时间】:2023-03-06 07:01:01
【问题描述】:

我在客户端和服务器端都使用socket.io。这是一个很棒的库,但我必须说文档中没有描述默认行为,这使得使用该库变得如此混乱。至少我没有找到默认行为的任何参考。

基本上,我观看了教程,其中使用 socket.io 构建了一个基本的聊天应用程序。在教程中,服务器会自动向所有连接的客户端发送消息。这是服务器端的默认行为吗?

对此我不确定。我正在开发一个应用程序,用户可以(取消)订阅特定主题并从服务器接收值。假设我有两个主题(topic1 和 topic2)。 我打开了两个客户端(client1 和 client2)并从 client1 订阅了 topic1。我注意到我在 client1 中收到了 topic1 的 value1,但 client2 什么也没收到。

const io = require('socket.io')(3000); // create server
  io.on('connection', socket => {
      console.log("client is connected over sockets");
    socket.on('subscribe', () => {socket.emit('send-msg', "send to client");})
  });

在上面的这种情况下,服务器将发送给所有客户端还是只发送给一个客户端。 您能否向我澄清一下,并告诉我 socket.io 的默认行为是什么?


PS:关于 socket.io,我注意到的另一件事是,有很多方法可以做同样的事情,而且没有很好的文档记录。例如,我正在使用 socketIOClient 函数实例化一个客户端:const socket = socketIOClient("my_host"); 但我已经看到许多使用openSocket 函数甚至直接使用io 函数的教程(出于某种原因,作者在 html 中添加了这个<script defer src="http://localhost:3000/socket.io/socket.io.js"></script>)

所有这些功能都做同样的事情,对吧?

【问题讨论】:

    标签: javascript node.js reactjs sockets socket.io


    【解决方案1】:

    您正在查看namespace.emitsocket.emit 之间的区别。套接字是一个特定的连接,在其上发出事件仅将其发送到该连接。另一方面,命名空间是一组由多个套接字组成的组,在其上发出事件会将其发送到组中的每个套接字。整个io 服务器默认是一个命名空间,所以io.emit(...) 向所有连接的客户端发送消息。 You can group your sockets into arbitrary namespaces and rooms 可以轻松地向选定的群组发送消息。

    【讨论】:

      猜你喜欢
      • 2018-10-19
      • 1970-01-01
      • 2021-05-12
      • 2011-08-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多