Sending messages to multiple rooms using Socket.io

2019-04-01 05:39发布

Is it possible to send messages to multiple rooms using socket.io?

Sending to 1 room:

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

Sending to N rooms:

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

3条回答
相关推荐>>
2楼-- · 2019-04-01 06:14

Updated as of 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/

查看更多
【Aperson】
3楼-- · 2019-04-01 06:17

The sockets.in method only accepts one room as an argument, so to broadcast to multiple rooms you would have to reset the room, in between emissions. Something like this should work:

['room1', 'room2', 'room3'].forEach(function(room){
    io.sockets.in(room).emit("id", {});
});
查看更多
Luminary・发光体
4楼-- · 2019-04-01 06:21

Yes, it's possible to emit to multiple rooms altogether. From the tests:

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

That's because when you use to or in you're appending the room to the list of rooms to be targeted. From the 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;
};
查看更多
登录 后发表回答