Bibliothèques WebSocket pour Node.js : du simple chat aux systèmes temps réel à forte charge
WebSocket est un protocole assurant une connexion bidirectionnelle permanente entre le client et le serveur. Contrairement à HTTP, où la requête-réponse est initiée par le client, WebSocket permet au serveur d'envoyer des données à tout moment. Pour Node.js, réputé pour son asynchronisme et son architecture orientée événements, WebSocket est devenu un choix naturel pour créer des chats, des jeux en ligne, des terminaux de trading et la diffusion de données en continu.
Dans cet article, nous analyserons trois bibliothèques principales : ws (légère et rapide), Socket.IO (pratique avec des mécanismes de repli) et uWebSockets.js (performances record). Vous apprendrez laquelle choisir pour votre projet et comment écrire un simple chat avec chacune d'elles.
1. Bibliothèque ws — minimalisme et vitesse
ws est la bibliothèque WebSocket la plus populaire pour Node.js. Elle implémente le protocole pur RFC 6455 sans fioritures. Principaux avantages :
- Performances maximales — jusqu'à 200 000+ messages/seconde sur un seul cœur.
- Zéro dépendance — uniquement du JavaScript pur.
- Contrôle total de la connexion : handshake, trames, ping/pong.
- Prise en charge des Buffer et Streams Node.js pour les données binaires.
Inconvénients : pas de reconnexion automatique, pas de salles (rooms), pas de repli sur HTTP long-polling. Tout doit être implémenté manuellement ou via des paquets supplémentaires.
Exemple : serveur echo simple avec ws
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => { console.log('Client connecté');
ws.on('message', (message) => { console.log('Reçu :', message.toString()); // Renvoi (echo) ws.send(`Echo : ${message}`); });
ws.on('close', () => { console.log('Client déconnecté'); });
// Envoi d'un message de bienvenue à la connexion ws.send('Bienvenue sur le serveur WebSocket !');});
console.log('Serveur démarré sur ws://localhost:8080');Quand choisir ws ? — pour les microservices, les jeux à forte charge (où chaque image compte), pour l'intégration dans votre propre serveur HTTP (via server.on('upgrade')).
2. Socket.IO — confort et fiabilité pour la production
Socket.IO n'est pas seulement WebSocket, mais une véritable plateforme temps réel. Elle utilise WebSocket comme transport principal, mais bascule automatiquement sur HTTP long-polling si WebSocket n'est pas supporté (proxy, pare-feux, anciens navigateurs).
- Salles (Rooms) — regroupement de clients pour les diffusions broadcast.
- Espaces de noms (Namespaces) — séparation logique de l'application (ex : /chat et /game).
- Reconnexion automatique avec délai exponentiel.
- Prise en charge des événements — vous travaillez avec des événements, pas avec des messages bruts.
- Sérialisation intégrée — transmission d'objets JSON sans analyse manuelle.
Inconvénients : surcharge du protocole (paquets supplémentaires avec métadonnées), plus de dépendances, légèrement plus lent que ws pur.
Exemple : chat avec salles sur Socket.IO (serveur)
const http = require('http');const { Server } = require('socket.io');
const server = http.createServer();const io = new Server(server, { cors: { origin: '*' } // pour le développement});
io.on('connection', (socket) => { console.log('Nouveau client :', socket.id);
// Rejoindre une salle socket.on('join_room', (roomName) => { socket.join(roomName); socket.emit('message', `Vous avez rejoint la salle ${roomName}`); socket.to(roomName).emit('message', `L'utilisateur ${socket.id} a rejoint la salle`); });
// Envoi d'un message dans la Aussi dans la bibliothèque
Sérialisation d'objets en Swift (iOS/macOS) : Codable, JSON et PropertyList
Journalisation pour JavaScript (Node.js) : meilleures solutions
Travailler avec Apache Kafka en Go (Golang) : bibliothèques et exemples