Socket.IO - Primeiros passos

// server.js
const http = require('http');
server = http.createServer(app); 
// server.js
const io = require('socket.io')(server);
const Room = require('./Room')(io);
server.listen(port, () => console.log("Chat online"));
// server-side
socket.on('mensagem', function(texto) {
    console.log(texto);
});
// client-side
socket.emit('mensagem', 'Olá pessoas desenvolvedoras do tabnews');
socket.join(nomeDaSala);
socket.leave(nomeDaSala);
socket.to(nomeDaSala).emit('mensagem', 'Olá pessoas desenvolvedoras do tabnews');
function listen(socket){
   const io = _io;
   
   socket.on('join', function(sala){
       socket.join(sala);
   });

   socket.on('leave', function(sala){
       socket.leave(sala);
   });

   socket.on('mensagem', function(Sala, Mensagem){
       socket.to(Sala).emit('msg', Mensagem);
   });
}

module.exports = function(io){
   _io = io;
   return {listen};
};
 socket.on('msg', function(Mensagem){
     // Código relacionado a receber uma mensagem no cliente.
 });
 
 socket.emit("join",nomeDaSala);
 
 socket.emit("leave", nomeDaSala);
 

Bate-Papo

O repositório pode ser encontrado aqui.

Obrigado pelo texto! É ótimo ver que o Socket.IO é uma biblioteca tão versátil e útil para a criação de aplicações em tempo real. Adorei o exemplo da sala de bate-papo, e é realmente incrível como podemos criar inúmeras outras aplicações com ele, como jogos online, servidores SIP e até mesmo clones de softwares populares. Obrigado por compartilhar seus conhecimentos sobre o Socket.IO!

Este comentário foi gerado por uma inteligência artificial. Para saber mais, leia esta publicação.

eu sempre tentei criar um clone do omegle e nunca consegui, por causa do tal do sem servidor, e essas coisas.

Cara, sem dúvidas o socket.io é incrivel, mas sempre acabo sofrendo com um problema: o reconnect. No meu caso sempre quando estou conectado em um ws e troco do wifi para 4g e vice-versa, falha em reconectar. Ja procurei a beça e sempre acabo no mesmo cenário, alguma dica?

Oi Alan. Tudo bem?

De fato, essa é uma dificuldade comum em quem já está desenvolvendo com socket.io

Por que isso ocorre?

Como a biblioteca funciona sobre websocket, o túnel de rede é criado. Ao iniciar um novo túnel, o socket.id é perdido e um novo é gerado criando o fluxo de join novamente

Como podemos resolver

Se a sua aplicação permitir, deixe um id gerado por você associado a uma página (pode ser algo aleatório ou informações de login, caso sua aplicação tenha controle de usuários). Quando você for realizar o seu join, salve no seu server alguma matriz multidimensional que relacione o socket.id com o seu id.

Em caso de queda, seja por refresh da página ou socket.disconect, você pode iniciar uma nova conexão e o socket.IO irá gerar um novo socket.id e caso esse socket.id não esteja relacionado com o seu id, você substitui na sua matriz e faz leave do id antigo e join no id novo

Em alguns trabalhos que já realizei com socket.io, no lado do cliente, eu garantia que a pessoa não duplicasse a página ou não realizasse login em outra máquina. Então, quando alguém logava com alguma conta já logada, a página anterior era desconectada automaticamente e redirecionava para a página de login.

Espero que ajude

E quanto a autenticação? JWT funciona? Cookies? Qual é o fornato correto?

E quanto a eventos dinâmicos? Qual o padrão para envio e recebimento de eventos com ids?

Ex.: quero ouvir um evento "msg:1234" relativo ao id da sala 1234. Poderia ter dezenas de salas diferentes e ouvir somente as que estou conectado ou pode acontecer de o servidor enviar mensagens para salas em que eu não estou ouvindo? Minha rede recebe mensgens que não deveria chegar para mim, mesmo que a interface não faça nada com ela? Isso ainda estará vagando pela rede de todo mundo?

Olá klawdyo. Tudo bem?

Sobre a autenticação, você terá de controlar manualmente. Seja por eventos ou controlando os usuários da sua aplicação. O envio de um token por JWT através dos sockets funciona sem problemas e você pode pegar o payload dos dois lados. Inclusive, os parâmetros de informação trafegadas não precisam ser texto, mas podem ser bytes. Se o próprio socket.IO tem uma autenticação dele? Não.

Sobre a eventos dinâmicos, criá-los não será para você a melhor prática, apesar de funcionar. No lado server, você tem conhecimento de todas as salas enquanto no lado client, você pode armazenar em qual sala aquele socket está em uma constante e mandar a sala como parâmetro para o server e o server consegue mandar para a sala com o to. Exemplo:

```js // server-side socket.on('mensagem', function(Sala, Mensagem){ socket.to(Sala).emit('mensagem', Mensagem); }); ```` ```js // client-side socket.on('mensagem', function(Mensagem){ // código que trata do recebimento da mensagem }); socket.emit('mensagem', 'minhaSala','minha Mensagem'); ````

Para além disso, caso você tenha um evento personalizado para cada sala, você ficará limitado ao número de salas e não conseguirá fazer isso escalável e dinâmico. Por exemplo, se você tiver 500 salas, você não irá, no lado server, fazer o método on para 500 salas, apesar de no lado cliente, você conseguir fazer um emit para um evento com nome dinâmico. Caso queira fazer isso, mesmo assim, você pode usar o evento onAny no lado server. Esse evento dispara com qualquer evento recebido pelo socket.IO e tem como primeiro parâmetro, o nome do evento que foi lançado pelo emit no lado cliente.