我正在调查nodejs/socket.io用于实时聊天,我需要一些关于实现聊天室的建议.

哪一个更好,使用名称空间还是使用房间功能来完全隔离聊天室中的聊天室?

房间和名称空间之间真正的技术区别是什么?

是否存在资源使用差异?

推荐答案

这是名称空间和文件室的in common(socket.io v0.9.8-请注意,v1.0涉及完全重写,因此情况可能发生了变化):

  • Both namespaces (io.of('/nsp')) and rooms (socket.join('room')) are created on the server side
  • 多个名称空间和多个房间share the same (WebSocket) connection
  • 服务器将连接到/加入nsp/房间,也就是说,它不仅仅是客户端过滤

differences人:

  • namespaces are connected to by the client使用io.connect(urlAndNsp)(只有在服务器上已经存在客户机时,才会将其添加到该名称空间)
  • rooms can be joined only on the server side(尽管在服务器端创建API以使客户端能够加入很简单)
  • namespaces can be 100
  • authorization is not available with rooms,但可以将自定义授权添加到上述易于在服务器上创建的API中,以防用户执意使用房间
  • rooms are part of a namespace(默认为"全局"命名空间)
  • namespaces are always rooted in the global scope

为了避免将概念与名称(房间或名称空间)混淆,我将使用compartment表示概念,另外两个名称表示概念的implementations.所以如果你

  • 如果需要per-compartment authorization个,名称空间可能是最简单的 Select
  • 如果想要hierarchically layered compartments(最多两层),请使用名称空间/房间组合
  • 如果你的客户端应用程序由不同的部分组成(它们本身并不关心隔间,但需要彼此分离),那么使用名称空间.

后者的一个例子是一个大型客户端应用程序,其中不同的模块可能单独开发(例如第三方),每个模块都使用套接字.io独立,正在同一个应用程序中使用,并希望共享单个网络连接.

在我看来,如果你的项目中只需要简单的分隔区来分隔和分组消息,那么两种方法都可以.

不确定这是否回答了你的问题,但得出这个答案的研究至少帮助我看得更清楚.

Node.js相关问答推荐

如何使用jq将依赖项添加到package.json中

Gmail API获取附件PDF未正确呈现.我遗漏了什么?

获取驱动器文件夹的直接子文件夹时出现问题

后端如何保护数据不被用户提取其他用户的数据?

TS 后端开发:prismagenerate找不到已安装的@tsed/prisma包

我如何保护nodejs中的路由

如何删除mongodb中嵌套数组中所有出现的数组元素

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

BrowserRouter工作时为什么HashRouter不工作?

Mongodb聚合传递一个匹配的数组和一个不匹配的数组

tsc:当我上传 React+next js 和 node 项目时,在 heroku 找不到

Ansible 将以什么用户身份运行我的命令?

如何在 MongoDB collection.find() 上获取回调

在 ExpressJS 中将变量传递给 JavaScript

Mongodb v4.0 Transaction, MongoError: Transaction numbers are allowed on a replica set member or mongos

在 Node.js 中的两个不同进程之间进行通信

所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?

如何可靠地散列 JavaScript 对象?

TypeError:winston.Logger 不是带有winston 和morgan 的构造函数

Node.js:如何附加到正在运行的进程并使用控制台调试服务器?