You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SocketIO 4.1.1版本如何获取指定房间内的客户端列表

解决Socket.IO 4.1.1版本获取指定房间客户端列表的问题

问题原因

Socket.IO从4.0版本开始,socket.adapter.rooms的返回类型从普通JS对象改为了ES6 Map结构,所以不能用对象的方括号[]语法取值,自然会返回undefined。

正确实现方法

分两种场景按需选择:

  • 基础同步获取(仅适用单节点部署场景,获取当前节点下的房间客户端ID集合)
    直接调用Map的get()方法取值即可,返回的是Set结构存储的客户端socket ID列表:
    const roomClients = socket.adapter.rooms.get(idroom);
    console.log(roomClients); // 输出Set对象,包含该房间所有客户端的socket id
    // 如果要转成数组可以做如下处理
    const clientIdList = Array.from(roomClients || []);
    
  • 跨节点/多实例场景的官方推荐方法
    如果你的服务部署了多实例、使用了Redis适配器这类跨节点方案,需要用官方提供的in().allSockets()异步方法,会返回跨所有节点的该房间客户端ID集合:
    // 写法1:基于io实例调用
    const clientIds = await io.in(idroom).allSockets();
    // 写法2:基于socket实例调用
    const clientIds = await socket.nsp.in(idroom).allSockets();
    console.log(Array.from(clientIds)); // 转数组输出
    

注意事项

  • 如果指定房间不存在、或者房间内没有任何在线客户端,get()方法和allSockets()都会返回undefined或者空Set,建议取值后加空判断避免报错。
  • 如果需要获取客户端socket的完整实例而非仅ID,你可以自行维护在线用户Map,通过返回的socket ID去对应的Map里取值即可。

内容的提问来源于stack exchange,提问作者20010dl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:24:02