Socket.IO 3.1.1版本如何获取指定房间内的客户端连接数
Socket.IO 3.x 版本获取房间客户端数量的原生实现
存在和2.x版本用法逻辑一致、无需自行编写计数逻辑的原生方案,3.x仅对旧版的回调式API做了风格重构,核心能力完全保留
核心实现方式
3.x版本(含3.1.1)完全移除了2.x中回调形式的socket.in(roomId).clients()方法,替换为两类可直接使用的原生统计能力,无需手动监听join-room、leave-room事件维护计数器:
单实例内存部署的极简取数方案
服务端适配器会自动维护当前命名空间下所有房间与Socket连接的映射关系,每个房间对应的连接集合是一个原生Set结构,直接读取Set大小即可得到连接数:// 取指定room_id下的客户端数量,无异步开销 const clientCount = io.sockets.adapter.rooms.get('room_id')?.size || 0;这种写法没有异步等待,性能最高,和2.x版本调用
clients()拿到的本地连接统计结果完全一致。兼容单实例/多实例分布式部署的通用方案
如果项目用了Redis适配器做多实例部署,本地内存映射无法拿到跨节点的连接数,可以用3.x内置的Promise形式方法,逻辑和旧版回调写法调用链路最接近,能自动适配分布式场景的统计逻辑:// 异步拉取指定房间下的全量Socket实例 const roomSockets = await io.in('room_id').fetchSockets(); // 直接取数组长度即为客户端数量 const clientCount = roomSockets.length;这个方法的扩展性更强,拿到Socket实例集合后,除了统计数量,还可以直接遍历给房间内的所有客户端发送定向消息,不需要额外查询连接列表。
常见注意点
- 直接读取本地适配器映射的写法仅适用于单实例部署,多节点集群场景下会漏统计其他实例上的连接,需要用
fetchSockets()的统一方法- 空值兜底是必须的:如果指定房间没有任何客户端连接,适配器中不会保留这个房间的映射记录,直接读取
size会触发报错,用可选链加|| 0做兜底即可- 2.x版本的旧版回调
clients()方法在3.x中已完全移除,直接调用会抛出方法不存在的错误
内容的提问来源于stack exchange,提问作者Maggie Grace
相关产品推荐
相关产品推荐

