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

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

但它没有帮助我.

谢谢你提前.

kdb*_*man 7

截至撰写本文时:

所述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,这应该是所有其他适配器实现的基本适配器接口的一部分. 这是一个常见问题.