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.