DevPath · Aprenda a programar ESPTEN

Tempo real, GraphQL e mensageria

Tempo real com WebSockets

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

Coloque isto em prática

O DevPath é um curso prático: aqui você lê a teoria; no app você a coloca em prática com exercícios que rodam de verdade, offline.

Comece grátis no app →
GraphQL: um schema, um endpoint →