gpt4 book ai didi

node.js - Socket.io:如何使用 Socket.io-redis 适配器计算房间中的客户端

转载 作者:IT老高 更新时间:2023-10-28 23:10:58 25 4
gpt4 key购买 nike

我开始使用 Socket.io 构建聊天服务器有多个 Node 。它使用 Socket.io-redis将所有服务器连接在一起和rooms用于消息传递。

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

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

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

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

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

我已经解决了这个问题:

How to check socket is alive (connected) in socket.io with multiple nodes and socket.io-redis

但这对我没有帮助。

感谢您的提前。

最佳答案

撰写本文时:

redis adapter extends the base adapter ,但它只覆盖/添加以下属性:

  • onmessage
  • 广播
  • 添加
  • 删除
  • delAll

使用你的代码:

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

您正在查询 the rooms property . 这并没有被 redis 适配器覆盖,因此您实际上是在查询基本适配器,它只知道当前进程中的房间/客户端。

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

如果您想获得集群中所有进程到 "CLIENT_1" 房间的连接数,您必须将该功能添加到 the adapter itself用这样的方法:

/**
* 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,这应该是所有其他适配器实现的基本适配器接口(interface)的一部分。 It's a common problem.

关于node.js - Socket.io:如何使用 Socket.io-redis 适配器计算房间中的客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30625556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com