Le HTTP classique suit un modèle requête-réponse : le client demande, le serveur répond. Mais pour du temps réel - notifications, chat, mise à jour de tableaux de bord - ce modèle montre ses limites. Le client devrait interroger le serveur en permanence pour savoir s’il y a du nouveau.
Les WebSocket établissent une connexion bidirectionnelle persistante. Et Socket.IO simplifie tout ça.
sequenceDiagram participant Client participant Serveur Client->>Serveur: connexion WebSocket Note over Client,Serveur: connexion persistante, bidirectionnelle Serveur->>Client: message Client->>Serveur: message Client->>Serveur: message Serveur->>Client: message Note over Client,Serveur: Les deux peuvent envoyer des messages à tout moment
Pourquoi Socket.IO plutôt que les WebSocket natives ?
Socket.IO ajoute plusieurs fonctionnalités cruciales :
Reconnexion automatique : si la connexion tombe, elle se rétablit
Fallback : si WebSocket n’est pas supporté, il utilise du long-polling HTTP
Rooms : groupes de sockets pour broadcaster
Namespaces : séparation logique des canaux
Événements : on travaille avec des événements nommés, pas des messages bruts
httpServer.listen(4000, () => { console.log("Socket.IO server ready on port 4000"); });
pingTimeout/pingInterval : ces paramètres permettent de détecter les connexions mortes. Le serveur envoie un ping toutes les 25s, et si pas de réponse en 60s, il ferme la connexion.
io.on("connection", (socket) => { // Rejoindre un salon de discussion socket.on("join:room", (room: string) => { socket.join(room); socket.to(room).emit("notification", { type: "join", username: socket.data.username, }); });
// Quitter un salon socket.on("leave:room", (room: string) => { socket.leave(room); });
// Message dans un salon socket.on("message:send", ({ room, content }) => { const message = { id: crypto.randomUUID(), username: socket.data.username, content, timestamp: newDate().toISOString(), };
// Broadcast à tout le salon (sauf l'émetteur) socket.to(room).emit("message:new", message); // Confirmation à l'émetteur socket.emit("message:sent", message); }); });
// Notification moins urgente pour tout le monde if (alert.severity === "info") { this.io.emit("notification", { type: "info", message: alert.message, }); } }
asyncsendMetricUpdate(metric: Metric) { // Envoyer uniquement aux clients qui regardent ce dashboard this.io.to(`dashboard:${metric.dashboardId}`).emit("metric:update", metric); } }
// Dans le monitoring monitor.on("cpu:high", (data) => { notifier.sendAlert({ severity: "warning", message: `CPU à ${data.percent}% sur ${data.host}`, }); });
Tableau de bord temps réel
Pour un dashboard qui se met à jour automatiquement :
Socket.IO est la solution la plus mature pour ajouter du temps réel à vos applications Node.js. Avec sa gestion automatique de la reconnexion, ses rooms, ses namespaces, et son fallback HTTP, il résout tous les problèmes des WebSocket natives.
J’utilise Socket.IO pour le chat de mon outil de collaboration, les notifications d’infrastructure, et les mises à jour de dashboards. C’est un outil fiable qui tourne depuis des mois sans intervention.
Et vous, quel cas d’usage temps réel comptez-vous implémenter ?