使用Socket.io向多个房间发送消息?

5

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

向一个房间发送消息:


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

发送到N个房间:

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

看起来 sockets.in(r1).in(r2) 在0.9.16版本中不起作用 ;( - fusio
4个回答

12

是的,可以同时向多个房间发出消息。从测试代码可以看到:

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

这是因为当您使用toin时,会将房间追加到要定位的房间列表中。从源代码(lib/socket.js)中的源代码(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;
};

1
这是正确的答案(我不知道另一个是否正确)。 - Denys Séguret

11

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

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

已更新0.9.16的答案。 - levi
很不幸的是,如果你想的话,你总可以修改sockets对象并添加一个多房间方法。 - levi
从源代码来看,似乎简单的修复措施是不够的,我会坚持分别向两个房间发射 ;) - fusio
我发现你使用了 io.sockets.in(room).emit 而不是 io.to(room).emit,这两者在任何方面有区别吗? - Raz Buchnik
@RazBuchnik 它是相同的。 - MrBens
那个答案已经过时了,因为在socket.io v4中,可以通过提供一个数组向多个房间发出一条消息。 - IMalaniak

6

更新至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/


5

更新:

自 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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接