我开始使用构建聊天服务器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(使用前将#替换为@)