【问题标题】:Sending messages to multiple rooms using Socket.io?使用 Socket.io 向多个房间发送消息?
【发布时间】:2013-08-20 16:26:51
【问题描述】:

是否可以使用 socket.io 向多个房间发送消息?

发送到 1 个房间:

io.sockets.in(room).emit("id", {})

发送到 N 个房间:

io.sockets.in(room1, room2, roomN).emit("id", {})

【问题讨论】:

  • 看来sockets.in(r1).in(r2) 在 0.9.16 中不起作用;(

标签: node.js socket.io channel


【解决方案1】:

是的,可以同时发射到多个房间。来自the tests

socket.on('emit', function(room){
  sio.in('woot').in('test').emit('a');
  sio.in('third').emit('b');
});

这是因为当您使用 toin 时,您会将房间附加到要定位的房间列表中。来自source code (lib/socket.js)

Socket.prototype.to =
Socket.prototype.in = function(name){
  this._rooms = this._rooms || [];
  if (!~this._rooms.indexOf(name)) this._rooms.push(name);
  return this;
};

【讨论】:

  • 这是正确的答案(我不知道另一个是否正确)。
【解决方案2】:

sockets.in 方法只接受一个房间作为参数,因此要广播到多个房间,您必须在发射之间重置房间。像这样的东西应该可以工作:

['room1', 'room2', 'room3'].forEach(function(room){
    io.sockets.in(room).emit("id", {});
});

【讨论】:

  • 更新了 0.9.16 的答案
  • 不幸的是。我想如果你愿意,你可以随时修改 sockets 对象,并添加一个多房间方法。
  • 从源码看来,快速修复似乎不够,我会坚持分别发射到两个房间;)
  • 我看到你使用io.sockets.in(room).emit 而不是io.to(room).emit 有什么不同吗?
  • @RazBuchnik 是一样的
【解决方案3】:

从 Socket.IO v2.0.3 更新

// sending to all clients in 'game1' and/or in 'game2' room, except sender
socket.to('game1').to('game2').emit('nice game', "let's play a game (too)");

https://socket.io/docs/emit-cheatsheet/

【讨论】:

    【解决方案4】:

    更新:

    从 Socket.IO v4.0.0 开始,现在可以发射到多个房间。根据文档,这就是使用修改后的 to() 方法应该如何完成的:

    io.to(["room1", "room2", "room3"]).emit(/* ... */);
    
    socket.to(["room1", "room2", "room3"]).emit(/* ... */);
    

    链接到文档本身:https://socket.io/blog/socket-io-4-release/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 2023-03-27
      • 1970-01-01
      • 2019-03-12
      • 2017-09-27
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多