【问题标题】:How to keep user joined to their multiple rooms socket.io如何让用户加入他们的多个房间 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 });
  });
});

【问题讨论】:

    标签: reactjs express sockets websocket socket.io


    【解决方案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);
              }
            }
    

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 2017-05-12
      • 2018-05-24
      • 2015-10-21
      • 2012-06-06
      • 2021-11-12
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多