Socket.IO Rooms & NameSpace

Socket.io es una excelente herramienta para lo que conocemos como aplicaciones en tiempo real, si tenemos una gran cantidad de usuario y queremos organizarlos y/o segmentarlo para saber a que grupo de usuarios le enviamos cierta información las características de Room y Namespace.

Los namespace

Son una segmentación de nivel superior, tanto el cliente como el server deben tener definidos estos contextos ya definidos una vez la aplicación esta en ejecución a diferencia de los rooms. Por defecto todas las instancias de socket.io usan un namespace ‘/’ dependera de nosotros queremos usar uno extra.

var server = require('http').Server(app);
var io = require('socket.io')(server);



Para crear un namespace simplemente:


var space = io.of('/out-of-earth');

space.on('connection', function(socket){
  console.log('someone connected'):
});

space.emit('hola', { key:'data' });


Como notaran al igual que cualquier instancia de socket.io estos namespace pueden registrar eventos de connection y/o emitir eventos de la misma forma.

En nuestro cliente simplemente tenemos que poner la url de nuestro server-io y el namespace, cabe mencionar que podemos tener mas de una conexión io en nuestro cliente, una para el default namespace y otra para nuestro namespace personalizado.

var socket = io('http://localhost/out-of-earth');


Rooms

Son una segmentación de segundo nivel en comparación con los namespace, estos son creados con la aplicación en tiempo de ejecución, podemos tener tantos rooms necesitemos. Las altas y bajas de usuarios en estos rooms suceden en el servidor, desde el cliente no podemos conectarnos a un room en particular.

Para agregar/eliminar un usuario de un room simplemente, tomamos el socket de algún usuario y ejecutamos algo como esto:

//agregar
    socket.join('/room',function(){  });

//eliminar
    socket.leave('/room',function(){  });


Una vez tengamos nuestros usuarios en nuestros rooms podemos enviarles pushs a estos usuarios de esta via:

io-instance.in('/room').emit('custom_event_room', { 
    info: 'new used connected from room' 
});

namespace.in('/room').emit('custom_event_room', { 
    info: 'new used connected from room' 
});


Se puede usar tanto instance.in como instance.to para enviar pushs a usuarios.

Ya una vez entendido todo esto, solo restara usar la imaginación y ver como no es util.

Referencia

Ejemplo Completo
Documentacion Oficial