quarta-feira, 20 de janeiro de 2016

Node.js - Socket.io Manual - Parte 2 - Salas e Namespaces

 

Salas e Namespaces

Esse conceito é muito importante no Socket.io pois nos possibilita criar namespaces para os sockets, ou seja, criando diferentes endpoints.

Este é um recurso útil para minimizar o número de recursos (conexões TCP) e a facilidade de separação entre os canais de comunicação (sockets).

Namespace Padrão

Chamamos o namespace padrão / e é ondes clientes do Socket.IO irão conectar por padrão, e aquele que o servidor escuta por padrão.

Este namespace é identificado por io.sockets ou simplesmente io:

// os dois seguintes irão emitir a todos os sockets ligados ao`/`

io.sockets.emit('oi', 'para todos'); 

io.emit('oi', 'para todos'); // forma curta 

Cada namespace emite um evento de conexão que recebe cada socket como parâmetro.

io.on('connection', function(socket){ 

  socket.on('disconnect', function(){ });

});

Namespaces personalizados

Para configurar um namespace personalizado, você pode chamar a função of no servidor:

var nsp = io.of('/meu-namespace'); 

nsp.on('connection', function(socket){ 

  console.log('alguém conectou');

});

nsp.emit('oi', 'para todos!'); 

No lado do cliente, você diz para o Socket.io conectar naquele namespace:

var socket = io('/meu-namespace'); 

Nota importante: O namespace é um detalhe de implementação do protocolo Socket.IO, e não está relacionada com a URL real do transporte, cujo padrão é /socket.io/....

Salas

Dentro de cada namespace, você também pode definir canais arbitrários que os sockets podem entrar e sair.

Entrando e saindo

Você pode entrar join para assinar o socket a um determinado canal:

io.on('connection', function(socket){ 

  socket.join('minha sala');

});

io.to('minha sala').emit('algum evento'): 

Para deixar um canal você pode chamar leave da mesma forma que o join.

Sala padrão

Cada Socket no Socket.io é identificado por um randômico e únido identificador Socket.io#id. Para nossa facilidade, cada socket automaticamente entra em uma sala identificada por esse id.

Desconectando

Após a desconexão, sockets chamam leave em todos os canais que ele fazia parte automaticamente

O envio de mensagens a partir do mundo exterior

Em alguns casos, você pode querer emitir eventos para sockets em Socket.IO de fora do contexto do seu processo do Socket.io.

Há várias maneiras de resolver este problema, como a implementação de seu próprio canal para enviar mensagens para o processo.

Para nossa sorte temos 2 módulos que facilitam isso:

·         socket.io-redis

·         socket.io-emitter

Ao implementar o Adapter do Redis:

var io = require('socket.io')(3000); 

var redis = require('socket.io-redis'); 

io.adapter(redis({ host: 'localhost', port: 6379 })); 

Pode então emitir mensagens de qualquer outro processo de qualquer canal:

var io = require('socket.io-emitter')(); 

setInterval(function(){ 

  io.emit('time', new Date);

}, 5000);

Estou em um lugar sem wifi esse estava no draft, depois atualizarei com as imagens com mais exemplos.

0 comentários :

Enviar um comentário