Socket.IO - Namespaces

O Socket.IO permite "namespace" seus soquetes, o que significa essencialmente atribuir diferentes pontos de extremidade ou caminhos. Esse é um recurso útil para minimizar o número de recursos (conexões TCP) e, ao mesmo tempo, separar as preocupações em seu aplicativo, introduzindo a separação entre os canais de comunicação. Na verdade, vários namespaces compartilham a mesma conexão WebSockets, economizando portas de soquete no servidor.

Os espaços para nome são criados no lado do servidor. No entanto, eles se juntam aos clientes enviando uma solicitação ao servidor.

Namespaces padrão

O espaço para nome raiz '/' é o espaço para nome padrão, associado aos clientes se um espaço para nome não for especificado pelo cliente durante a conexão com o servidor. Todas as conexões com o servidor usando o lado do cliente do objeto de soquete são feitas no espaço para nome padrão. Por exemplo -

var socket = io();

Isso conectará o cliente ao espaço para nome padrão. Todos os eventos nessa conexão de namespace serão tratados pelo objeto io no servidor. Todos os exemplos anteriores estavam utilizando namespaces padrão para se comunicar com o servidor e vice-versa.

Namespaces personalizados

Podemos criar nossos próprios namespaces personalizados. Para configurar um espaço para nome personalizado, podemos chamar a função 'of' no lado do servidor -

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

app.get('/', function(req, res) {
   res.sendfile('index.html');
});

var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket) {
   console.log('someone connected');
   nsp.emit('hi', 'Hello everyone!');
});

http.listen(3000, function() {
   console.log('listening on localhost:3000');
});

Agora, para conectar um cliente a esse espaço para nome, é necessário fornecer o espaço para nome como argumento para a chamada do construtor io para criar uma conexão e um objeto de soquete no lado do cliente.

Por exemplo, para conectar-se ao espaço para nome acima, use o seguinte HTML -

<!DOCTYPE html>
<html>
   <head>
      <title>Hello world</title>
   </head>
   <script src = "/socket.io/socket.io.js"></script>
   
   <script>
      var socket = io('/my-namespace');
      socket.on('hi',function(data) {
         document.body.innerHTML = '';
         document.write(data);
      });
   </script>
   <body></body>
</html>

Sempre que alguém se conectar a esse espaço para nome, ele receberá um evento 'oi'.