14

What is the proper way to manage multiple chat rooms with socket.io?

So on the server there would be something like:

io.sockets.on('connection', function (socket) {
  socket.on('message', function (data) {
    socket.broadcast.emit('receive', data);
  });
});

Now this would work fine for one room, as it broadcasts the message out to all who are connected. How do you send messages to people who are in specific chat rooms though?

Add .of('/chat/room_name')? Or store an array of everybody in a room?

Guy guy
  • 309
  • 1
  • 3
  • 10

2 Answers2

23

Socket.IO v0.7 now gives you one Socket per namespace you define:

var room1 = io.connect('/room1');
room1.on('message', function () {
    // chat socket messages
});
room1.on('disconnect', function () {
    // chat disconnect event
});

var room2 = io.connect('/room2');
room2.on('message', function () {
    // chat socket messages
});
room2.on('disconnect', function () {
    // chat disconnect event
});

With different sockets, you can selectively send to the specific namespace you would like.

Socket.IO v0.7 also has concept of "room"

io.sockets.on('connection', function (socket) {
  socket.join('a room');
  socket.broadcast.to('a room').send('im here');
  io.sockets.in('some other room').emit('hi');
});

Source: http://socket.io/#announcement

Sơn Trần-Nguyễn
  • 2,188
  • 1
  • 26
  • 30
  • Thanks, I think the second example is what I am looking for as the rooms are created dynamically. So lets say i have two sections, chat and groups. Would i do io.connect('/chat OR /group') and have socket.join('GROUP OR CHAT ID') to connect to a specific group or chat? – Guy guy Jul 16 '11 at 21:08
  • I believe so. The first one allows you to have different channels to subscribe to, and the second one gives you a simple concept of room that you can group different sockets. – Sơn Trần-Nguyễn Jul 17 '11 at 08:18
1

Update: Both Now.js and Bridge are now dead, see now.js dead and bridge dead. Socket.io seems to have adopted the callback feature as of v0.9, which is a good step forward.

While it isn't directly Socket.io related, Now.js (a higher level abstraction ontop of Socket.io) supports groups - http://nowjs.com/doc

They have a multi-room-chat example in their offocial repo here: https://github.com/Flotype/now/blob/master/examples/multiroomchat_example/multiroomchat_server.js

balupton
  • 47,113
  • 32
  • 131
  • 182