O limite do HTTP
O HTTP é requisição-resposta: o cliente pergunta e o servidor responde. O servidor não pode falar primeiro. Para um chat ou um painel ao vivo isso é um problema: como o servidor avisa o navegador de que chegou uma mensagem nova?
A solução clássica é o polling: o cliente pergunta a cada poucos segundos "tem algo novo?". Funciona, mas desperdiça requisições (quase sempre a resposta é "não") e adiciona latência (até vários segundos de atraso).
WebSockets
Um WebSocket abre uma conexão persistente e bidirecional entre cliente e servidor sobre uma única conexão TCP. Uma vez aberta, os dois lados podem enviar dados a qualquer momento, sem precisar pedir permissão de novo.
// No navegador
const socket = io(); // abre a conexão
socket.on("mensagem", (m) => { // escuta eventos do servidor
console.log("Chegou:", m);
});
socket.emit("enviar", "Olá"); // emite um evento para o servidor
Socket.io é a biblioteca mais usada no Node para isso. Seu modelo é de
eventos com nome: emit("nome", dados) envia e on("nome", cb)
escuta. É o mesmo padrão publicador/assinante que você já conhece dos
EventEmitter do Node.
// No servidor
io.on("connection", (socket) => {
socket.on("enviar", (texto) => {
io.emit("mensagem", texto); // reenvia para todos os conectados
});
});
Salas (rooms)
Uma sala agrupa conexões para emitir apenas para um subconjunto. Útil para canais de chat, partidas ou um usuário específico:
socket.join("sala-42"); // o socket entra na sala
io.to("sala-42").emit("mensagem", texto); // só os dessa sala recebem
Casos de uso
- Chat e mensageria instantânea.
- Notificações push no próprio app.
- Dashboards ao vivo (cotações, métricas, placares).
- Colaboração em tempo real (editar um documento entre vários).