Pha*_*att 12 node.js socket.io socket.io-redis
我开始使用带有多个节点的Socket.io构建聊天服务器.它使用Socket.io-redis将所有服务器连接在一起,并使用房间进行消息传递.
当客户端与服务器连接时,我将客户端连接到某个房间.
io.on('connection', function(socket){
socket.join("CLIENT_1");
});
Run Code Online (Sandbox Code Playgroud)
所以我希望连接到房间的客户数量"CLIENT_1"
,
io.sockets.adapter.rooms["CLIENT_1"];
Run Code Online (Sandbox Code Playgroud)
但我只接受当前流程的联系.如何从通过redis适配器连接的所有服务器进程获得连接?
我经历过这个问题:
如何在socket.io中检查套接字是否存在(连接)有多个节点和socket.io-redis
但它没有帮助我.
谢谢你提前.
截至撰写本文时:
所述redis的适配器延伸的基适配器,但它只覆盖/添加了以下性能:
onmessage
broadcast
add
del
delAll
使用您的此代码:
io.sockets.adapter.rooms["CLIENT_1"];
Run Code Online (Sandbox Code Playgroud)
你在查询这家rooms
酒店. 这没有被redis适配器覆盖,所以你实际上是在查询基本适配器,它只知道当前进程中的房间/客户端.
为什么redis适配器没有覆盖rooms
属性?因为为了匹配上面的确切调用签名,每次访问属性时,都必须查询redis实例以构造包含所有房间和连接的对象.不好.(除非您可以弄清楚如何在查询其值时计算对象值.)
如果要获取"CLIENT_1"
群集中所有进程的房间连接数,则必须使用以下方法将该功能添加到适配器本身:
/**
* Count the number of connections in a room.
*
* @param {String} room id
* @param {Function} callback (optional)
* @api public
*/
Redis.prototype.numClients = function(room, fn){ ... }
Run Code Online (Sandbox Code Playgroud)
其中您将查询redis数据库实例.
IMO,这应该是所有其他适配器实现的基本适配器接口的一部分. 这是一个常见问题.
归档时间: |
|
查看次数: |
5957 次 |
最近记录: |