加入

时间:2016-04-30 20:20:22

标签: javascript node.js sockets express socket.io

我想动态创建房间(根据前端的请求)。我跟着this gist

我想要一个特定的房间来听取活动并向房间里的其他成员广播。我不确定为什么以下代码不能这样做。特别是,为什么第二个日志语句永远不会发生。

io.sockets.on('connection', function (socket) {
  socket.on('joinRoom', function (roomName) {
    socket.join(roomName, function () {
      console.log('joined ' + roomName); // logs properly
      io.sockets.in(roomName).on('setVideoOnServer', function (inputUrl) {
        console.log('setVideoOnServer: ', inputUrl); // not hitting here
        io.sockets.in(roomName).emit('setVideoOnClient', inputUrl); // broadcast instead
      });
    });
  });
});

1 个答案:

答案 0 :(得分:1)

根据我的评论,我认为io.sockets.in(roomName).on(...)没有按照您的想法行事。

io.sockets.in()返回从Namespace派生的eventEmitter对象。命名空间对象中没有.on()的覆盖,所以你所做的就是为命名空间对象本身添加一个监听器,而不是任何给定的套接字或套接字组(尽管我可以通过查看套接字来判断) .io代码)。

Namespace对象中有.emit()的覆盖,这就是io.sockets.in(xxx).emit(...)有效的原因。

仅供参考,命名空间对象的代码在这里:https://github.com/socketio/socket.io/blob/master/lib/namespace.js

而且,即使它按照你的想法做了,每次新的套接字加入那个房间时你都会添加重复的事件处理程序,这也可能是一个问题,因为你要为每个套接字重新添加一个事件监听器每当有人加入房间时,已经在一个房间里。

我认为你可以用这个完成你想要的东西:

io.sockets.on('connection', function (socket) {
  socket.on('joinRoom', function (roomName) {
    socket.join(roomName, function () {
      console.log('joined ' + roomName); // logs properly
      socket.on('setVideoOnServer', function (inputUrl) {
        console.log('setVideoOnServer: ', inputUrl); // not hitting here
        io.sockets.in(roomName).emit('setVideoOnClient', inputUrl); // broadcast instead
      });
    });
  });
});

每次套接字加入房间时,都会注册setVideoOnServer事件。因此,一个房间的所有插座都将为该事件注册。

注意:如果您要将套接字连接到多个房间,则需要确保这样做是您想要的,因为您将为setVideoOnServer事件设置多个侦听器,每个都将setVideoOnClient广播到所有其他套接字。

而且,如果你离开这个房间,你也必须删除事件监听器。