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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:36:03