Socket.IO 4.2.0调用allSockets获取房间客户端数返回0问题求助
问题根因
你创建了/socket自定义命名空间,所有客户端连接都挂载在该命名空间下,而你代码中调用的是根命名空间io的allSockets()方法,根命名空间不存在对应房间的连接记录,因此永远返回0。
解决方案
将统计房间人数的调用对象从根命名空间io替换为你定义的自定义命名空间实例chat即可,修改后的代码示例如下:
var socket = require("socket.io") var io = socket(server) var chat = io.of('/socket').on('connection', function (socket) { socket.on('loginchat', async function(data){ // 用自定义命名空间实例chat调用方法 const roomSockets = await chat.in(data.id).allSockets() const currentCount = roomSockets.size console.log(currentCount) // 人数小于2才允许加入房间 if (currentCount < 2) { socket.join(data.id) // 后续加入成功的逻辑 } else { // 房间已满的处理逻辑 } }) })
补充说明
- 上述方案仅适用于单实例Socket.IO服务部署场景,如果你后续扩展为多实例部署,需要配置适配Redis等跨实例同步的适配器,才能正确统计跨实例的房间人数。
- 注意要先统计人数、判断符合条件后再执行
socket.join()操作加入房间,避免统计逻辑出错。
内容的提问来源于stack exchange,提问作者Rexy
相关产品推荐
相关产品推荐

