如何让用户加入他们的多个房间 socket.io

Posted

技术标签:

【中文标题】如何让用户加入他们的多个房间 socket.io【英文标题】:How to keep user joined to their multiple rooms socket.io 【发布时间】:2021-10-28 14:24:28 【问题描述】:

我对 socket.io 完全陌生,而且我已经被这个问题困扰了很多天。我也找不到有关此主题的任何深度 youtube 视频。我想做的是,我正在创建一个聊天应用程序。登录后,您将看到所有组,您可以加入这些组。假设用户加入了 3 个组。一旦该用户登录,我想将该用户加入这三个组,以便他在有消息时收到消息。怎么能这样?? 这是我到目前为止所做的,

前端

消息发送时

socket.emit("message",  name, message, room: selectedGroup.name );
socket.emit("join-group",  name, room: group.name );
socket.on("message", ( name, message, room ) => 
  const update =  ...group ;
  update.messages.push( sender: name, message );
  setSelectedGroup(update);
);

后端

    io.on("connection", (socket) => 
  socket.on("join-group", ( name, room ) => 
    socket.join(room);
  );
  socket.on("message", ( name, message, room ) => 
    socket.join(room);
    io.to(room).emit("message",  name, message, room );
  );
);

【问题讨论】:

【参考方案1】:

我的主要语言不是英语,所以对此我深表歉意

ioobject中有一个适配器可以访问里面所有活动的房间,如果你想在用户登录的时候访问所有的房间,你必须在 onConnection 中使用这些命令

但是,版本 2、3、4 在这方面有所不同。

https://socket.io/docs/v4/adapter/

从右上角你可以找到你想要的版本

const socketio = require("socket.io");
const server = http.createServer(app);
const io = socketio(server);

const activeRooms(io)=> 
    const arr = Array.from(io.sockets.adapter.rooms);
    // [['room1', Set(2)], ['room2', Set(2)]]
    const filtered = arr.filter(room => !room[1].has(room[0]))
    // ['room1', 'room2']
    const res = filtered.map(i => i[0]);
    return res;


const rooms = activeRooms()

    if (rooms) 
            rooms.forEach((element) => 
              socket.join(element.toString());
            );
            socket.join(socket.username);
          
        

【讨论】:

以上是关于如何让用户加入他们的多个房间 socket.io的主要内容,如果未能解决你的问题,请参考以下文章

Socket IO - 如何让多个管理员用户访问多个 URL 上的多个私人房间

如何用一个节加入多个 xmpp 房间?

如何让 Node.js 进程相互通信

Socket.io:如何正确加入和离开房间

如何生成房间 ID 并强制两个用户加入该房间?

如何使用 Flask 和 Socket.io 加入和离开房间的简明示例?