socket.io 房间大小 4.x

socket.io room size 4.x

所以我一直在 node.js 和 socket.io 中制作实时 E2EE 聊天应用程序,但我 运行 遇到了问题

我使用的是最新的 socket.io 版本,特别是 4.2.0,我一直在尝试找出一个房间内的客户数量,以便创建一个检查以允许,或者阻止访问聊天区,因为它不支持 1 个房间中有 2 个以上的客户端。

我的 variables/includes socket.io

var socket = require("socket.io")
var io = socket(server)


var chat = io.of('/socket').on('connection', function (socket) {
socket.on('loginchat', async function(data){
 io.in(data.id).allSockets().then(result=>{
console.log(result.size) })
});
});

data.id 是一个 运行domly 生成的字符串,用于创建房间服务器端,所以我的想法是使用 allSockets() 来获取连接到该房间的套接字的数量,但是即使连接了 2 个客户端,它 returns 也为零。 来自

的 allSockets() 想法

我找不到关于堆栈溢出的有效解决方案,或者在文档中找不到任何明显的解决方法。我不是最擅长 socket.io 的,因为我只是把它捡起来用于这个项目,所以任何帮助都将不胜感激 :)

鉴于您提供的示例,您似乎从未制作过用于加入房间的套接字。所以你的房间永远是空的。

根据 the socket.io documentation 你必须先监听 connection 事件,然后你必须使用 join 将用户添加到房间。

const socket = require("socket.io")
const io = socket(server)

io.on("connection", socket => {

  socket.on('loginchat', async data => {
     //Assuming data.id is the room identifier
     const roomUsers = await io.in(data.id).allSockets();
     
     //There, you make your socket join the room if room users are not exceeding 
     //your maximum
     if(roomUsers.size < 2) socket.join(data.id);
  });
  
});

var socket = require("socket.io")
var io = socket(server)

var chat = io.of('/socket').on('connection', function (socket) {
socket.on('loginchat', async function(data){
const sockets = await io.of("/socket").in(data.id).fetchSockets();
  console.log(sockets.length)
 if(sockets.length <= 1){
  socket.room = data.id;
  socket.join(data.id);
 }else{
   //attempting to join a room with greater than 2 users
   console.log("too many")
 }
});
});

https://socket.io/docs/v3/migrating-from-3-x-to-4-0/

使用 fetchSockets() 并检查对象的长度,您可以检查房间的长度或用户数。

在 Socket.io v4.3.1 中工作,但很可能在任何 v4.x

中运行