Biblioteca ws: WebSocket para Node.js
A biblioteca ws é uma implementação simples, rápida e totalmente testada do protocolo WebSocket para Node.js. Ela é o padrão de facto para criar aplicações em tempo real (chats, jogos online, notificações, edição colaborativa) no lado do servidor em JavaScript. Ao contrário do módulo http integrado, o ws fornece comunicação bidirecional completa entre cliente e servidor sem requisições HTTP constantes.
Principais funcionalidades
- Suporte completo ao protocolo RFC 6455 — funciona com todos os navegadores modernos.
- Alta performance — consumo mínimo de memória e baixa latência.
- API simples — criação de servidor e cliente em poucas linhas de código.
- Suporte a extensões — compressão de dados (permessage-deflate).
- Integração com servidor HTTP — pode compartilhar porta com Express ou outro framework.
- Reconexão automática — mecanismos integrados para o cliente.
Instalação
Instalação via npm:
npm install wsApós a instalação, a biblioteca está pronta para uso.
Criação de um servidor WebSocket
Vamos criar um servidor simples que aceita conexões e envia uma mensagem de boas-vindas:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) { console.log('Novo cliente conectado');
// Envia mensagem para o cliente ws.send('Bem-vindo ao servidor WebSocket!');
// Processa mensagens recebidas ws.on('message', function incoming(message) { console.log('Recebido: %s', message); // Envia de volta (eco) ws.send('Eco: ' + message); });
// Processa fechamento da conexão ws.on('close', function() { console.log('Cliente desconectado'); });});
console.log('Servidor WebSocket rodando em ws://localhost:8080');Criação de um cliente WebSocket
O cliente se conecta ao servidor, envia uma mensagem e recebe a resposta:
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080');
ws.on('open', function open() { console.log('Conexão estabelecida'); ws.send('Olá, servidor!');});
ws.on('message', function incoming(data) { console.log('Resposta do servidor: %s', data); ws.close();});
ws.on('close', function() { console.log('Conexão fechada');});
ws.on('error', function error(err) { console.error('Erro:', err.message);});Trabalhando com JSON e múltiplos clientes
Exemplo real — um servidor de chat que distribui mensagens para todos os clientes conectados (broadcast):
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws, req) { console.log('Cliente conectado. Total de clientes:', wss.clients.size);
ws.on('message', function incoming(message) { // Faz o parse do JSON let data; try { data = JSON.parse(message); } catch (e) { ws.send(JSON.stringify({ error: 'JSON inválido' })); return; }
// Distribui para todos, exceto o remetente wss.clients.forEach(function each(client) { if (client !== ws && client.readyState === WebSocket.OPEN) { client.send(JSON.stringify({ username: data.username, text: data.text, timestamp: Date.now() })); } }); });
ws.send(JSON.stringify({ system: 'Bem-vindo ao chat!' }));});O cliente pode enviar JSON:
ws.send(JSON.stringify({ username: 'Alice', text: 'Olá a todos!' }));