繁体   English   中英

Socket.io 不会发射到房间

[英]Socket.io won't emit to a room

我正在尝试创建一个聊天大厅,用户可以在其中创建私人房间,其他人可以通过 uuid 加入。 This is built with node.js and socket.io, and it seems as if io.to(room).emit('event', 'data') and io.sockets.to(room).emit('event', 'data')不工作,而io.emit('event', 'data')工作。 我的代码可以在下面找到:

io.sockets.on('connection', (socket) => {
  socket.on('createRoom', function(data) {
      let room = new Room(data).create();

      let id = room.data.uuid
      socket.join(id)

      io.to(id).emit('roomcreated', {data: data, msg: 'Room Created'}) //Does not work!
      io.emit('roomcreated', {data: data, msg: 'Room Created'}) //This Works
  });
});

.join()的一个常见问题是它实际上是异步的。 它不会立即完成。 这可能是因为它被设计用于支持集群的多进程、基于 redis 的适配器,并且连接进程必须是异步的,因为它正在与其他进程通信。

您可以通过向.join()发送回调来解决您的问题,并且仅在房间完成加入后才发送到房间。

io.sockets.on('connection', (socket) => {
  socket.on('createRoom', function(data) {
      let room = new Room(data).create();

      let id = room.data.uuid
      socket.join(id, (err) => {
         if (err) {
             // do something here if the join fails
             console.log(err);
             return;
         }
         
         // call this only after the join has completed
         io.to(id).emit('roomcreated', {data: data, msg: 'Room Created'});
      });
  });
});

我不完全确定io.in(id).emit('roomCreated', {d: data}); 但我找到了一种解决方法。

我创建了一个名为 SOCKET_LIST 的所有 sockets 的 object,并为每个房间创建了一个包含该套接字 id 的数组:

var SOCKET_LIST = {};

io.sockets.on('connection', (socket) => {

  socket.id = Math.random();
  SOCKET_LIST[socket.id] = socket;

  socket.on('createRoom', function(data) {
      let room = new Room(data).create();
      room.data.users.push(socket.id)

      let id = room.data.uuid
      socket.join(id, (err) => {
        if(err) {
          return console.log(err);
        }
        room.data.users.forEach(i => {
          SOCKET_LIST[i].emit('roomcreated', {data: data, msg: 'Room Created'})
        })
      })

  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM