Socket.io:如何使用 Socket.io-redis 适配器计算房间内的客户端数量

2024-03-22

我开始使用构建聊天服务器Socket.io http://socket.io/具有多个节点。它用Socket.io-redis https://github.com/automattic/socket.io-redis将所有服务器连接在一起并且rooms http://socket.io/docs/rooms-and-namespaces/用于消息传递。

当客户端与服务器连接时,我将客户端加入某个房间。

io.on('connection', function(socket){
  socket.join("CLIENT_1");
});

所以我想获得连接到房间的客户端数量"CLIENT_1",

io.sockets.adapter.rooms["CLIENT_1"];

但我只从当前进程获得连接。如何从通过 redis 适配器连接的所有服务器进程获取连接?

我已经经历过这个问题:

如何在具有多个节点和socket.io-redis的socket.io中检查套接字是否处于活动状态(已连接) https://stackoverflow.com/questions/29390562

但这对我没有帮助。

感谢您的提前。


截至撰写本文时:

The redis 适配器扩展了基础适配器 https://github.com/Automattic/socket.io-redis/blob/c07b3bdaef579fbe963170b9ad490b656d31494c/index.js#L84,但它仅覆盖/添加以下属性:

  • onmessage
  • broadcast
  • add
  • del
  • delAll

用你的这段代码:

io.sockets.adapter.rooms["CLIENT_1"];

你正在查询the rooms财产 https://github.com/Automattic/socket.io-adapter/blob/de5cba46ce3e21bac3bccae011d81a7b5caad1ba/index.js#L24. 这并没有被 redis 适配器覆盖,因此您实际上是在查询基本适配器,它只知道当前进程中的房间/客户端。

为什么redis适配器没有覆盖rooms财产?因为为了匹配上面的确切调用签名,它必须查询 redis 实例来构造一个包含所有房间和连接的对象每次访问该属性时。不好。 (除非您能够在查询对象值时弄清楚如何计算对象值。)

如果你想获取连接数"CLIENT_1"集群中所有进程的空间,您必须将该功能添加到适配器本身 https://github.com/Automattic/socket.io-redis/blob/c07b3bdaef579fbe963170b9ad490b656d31494c/index.js用这样的方法:

/**
   * Count the number of connections in a room.
   *
   * @param {String} room id
   * @param {Function} callback (optional)
   * @api public
   */

  Redis.prototype.numClients = function(room, fn){ ... }

您将在其中查询 redis 数据库实例。

IMO,这应该是所有其他适配器要实现的基本适配器接口的一部分。这是一个常见问题。 https://stackoverflow.com/questions/9352549/getting-how-many-people-are-in-a-chat-room-in-socket-io

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket.io:如何使用 Socket.io-redis 适配器计算房间内的客户端数量 的相关文章

随机推荐

  • 如何使用 Git 作为内容分发网络

    Git Internal 一书提到在 p50 上使用 git 作为点对点内容分发网络 但没有提供太多细节 特别是如何拥有多个跟踪不同文件的分支 例子 工作目录 a00 exe a01 exe b00 exe c00 exe c01 exe
  • 倾斜一个角并向对角添加边框半径

    如何使用 CSS 重现这个形状 如何移动右上角 span Shift top right corner span 类似这样的东西 但仍然很难掌握 我会考虑使用图像 span border 2px dashed blue border rad
  • 我收到 TypeError: 'int' object is unsubscriptable

    我从我的代码中收到一条错误消息 上面写着TypeError int object is unsubscriptable 经过一番研究 我明白了它的意思 但我不明白为什么会出现问题 我将问题范围缩小到这段代码 def calcNextPos
  • SVG Circle 元素在比例变换时跳跃

    下面是使用 D3 绘制一个圆并在鼠标悬停时对其进行缩放的代码 它做了它应该做的事情 但也将 cricle 带到其他地方 这意味着圆圈缩放并跳转 翻译 到其他位置 我无法理解其原因 this node this chartLayer appe
  • 直接从浏览器上传字符串到s3,无需本地文件

    我正在使用 javascript node js 和 aws sdk 有很多关于使用签名 URL 直接将现有文件上传到 S3 的示例 但现在我尝试上传字符串并在 S3 中创建文件 而不需要任何本地保存的文件 请问有什么建议吗 请按照此处的示
  • 关于 ASP.Net 中的弹出窗口

    我有一个gridview其中包含一个details button作为最后一栏 My aspx
  • Wildfly 17 服务器提供的 Maven 依赖项

    我刚刚开始使用 Wildfly 服务器版本 17 并且我一直在研究我应该在 pom 文件中提供的依赖项 我在文档中没有找到任何显示所提供的依赖项及其正确版本的内容 作为一个例子 这是我想要的
  • C# 泛型委托类型推断

    为什么 C 编译器无法在指定示例中将 T 推断为 int void Main int a 0 Parse 1 x gt a x Compiler error Cannot convert expression type int to ret
  • C/C++ 中两个 INT_MAX 数字的乘积不正确

    就我而言 两个 INT MAX 数字的乘积是296447233 这是不正确的 long long int product 0 product 2137483647 2137483647 printf product lli n produc
  • 将换行符附加到 NSString

    我有这个 if soapResults nil soapResults soapResults stringByAppendingString n 但我收到警告 构建时来自不同 Objective C 类型的分配 当我在设备上运行它时 我得
  • C++ 反序列化通过 UDP 从 C# 应用程序发送的对象

    我有一个申请c 它连接到另一个应用程序 编写为c 通过UDP 我更喜欢高性能的解决方案 因为我希望测量事件客户端 某些处理服务器端和客户端处理完成的响应之间的时间 本质上是 往返延迟 我有一个 C 对象 例如 public class Pa
  • C# - 显示最大值、最小值和平均值

    我是 C 新手 我一直在致力于这个计划并进行研究 但一无所获 目标是让用户输入数字 多少由用户决定 当他们输入0时 它将停止程序并显示输入的最小数字 输入的最大数字以及输入的所有数字的平均值 我没有收到任何错误 而且我收到了 如果有人可以请
  • Java中删除字符串中的特定字符

    例如 给定一个字符串Battle of the Vowels Hawaii vs Gronzy当我们指定要删除的字符为aeiou 该函数应将字符串转换为Bttl f th V wls Hw vs Grzny 在书上找到这个问题编程面试曝光
  • surfaceDestroyed()何时发生

    我不知道什么时候surfaceDestroyed 发生 我试图让我的线程停止运行surfaceDestroyed 方法 SurfaceView 但似乎我的表面从未真正被破坏 有人可以告诉我什么时候发生这种情况吗 或者说如何触发 每当您单击
  • Angular模板绑定,多次调用回调函数

    我尝试实现一个包含结构化数据的网格组件columns definition和它的data array 有一个callback每列定义中的函数 用于自定义显示该列的值 每一个里面callback 它调用了 console log 来显示回调函
  • NSArray:为什么发送 SIGABRT 而不是“索引越界”类型的错误?

    好的 所以我有这个非常奇怪的SIGABRT我正在开发的一个复杂的 Objective C iOS 程序上出现了错误 经过一天的跟踪 我找到了罪魁祸首 假设我们有以下代码 NSArray a NSArray arrayWithObjects
  • 检测 Node Express 中的社交机器人

    我正在尝试检测以下两个选项之一 特定的机器人列表 FacebookExternalHit LinkedInBot TwitterBot Baiduspider 任何不支持 Crawable Ajax 规范的机器人 我见过类似的问题 如何识别
  • 在 Cloud Function 上部署函数时出现错误,错误代码为 13 并显示消息“INTERNAL”

    我正在为我的应用程序部署 Firestore 触发器 onCreate 但每次我想部署时 它总是出错 控制台始终显示代码 13 和消息 内部 这是控制台上出现的内容 type type googleapis com google cloud
  • 在 R 中将实际日期转换为整数值

    使用 R 我希望能够将格式为 2014 12 31 的日期转换为整数 20141231 以便创建序列号 我的目标只是能够完成这个用户问题的反向 将整数字符串日期转换为实际日期 https stackoverflow com question
  • Socket.io:如何使用 Socket.io-redis 适配器计算房间内的客户端数量

    我开始使用构建聊天服务器Socket io http socket io 具有多个节点 它用Socket io redis https github com automattic socket io redis将所有服务器连接在一起并且ro