Socket.IO est une bibliothèque de communication bidirectionnelle en temps réel entre client et serveur basée sur WebSocket avec repli automatique. Elle fournit un transport fiable pour le transfert instantané de données dans les chats, les jeux et les éditeurs collaboratifs. Selon la documentation officielle de Socket.IO (2024), la bibliothèque gère plus d'un million de connexions sur un seul serveur avec une configuration appropriée.
Points clés
Socket.IO est une bibliothèque JavaScript open source pour la communication bidirectionnelle événementielle entre client et serveur. Elle a été créée en 2010 par le développeur Guillermo Rauch et est depuis devenue le standard de facto pour les applications en temps réel sur Node.js.
Contrairement à l'API WebSocket native, Socket.IO fournit des abstractions supplémentaires : salles, espaces de noms, reconnexion automatique et types de données binaires. La bibliothèque n'est pas une implémentation distincte de WebSocket — elle utilise Engine.IO comme couche de transport, qui établit d'abord une connexion HTTP long-polling puis tente une mise à niveau vers WebSocket.
Selon les statistiques npm (2025), plus de 12 millions d'exemplaires du package socket.io sont téléchargés chaque semaine, ce qui en fait l'une des bibliothèques les plus populaires de l'écosystème Node.js. Socket.IO est pris en charge sur toutes les plateformes modernes : navigateurs, iOS, Android, React Native et applications de bureau.
Socket.IO version 1.0 est sortie en 2014 et a introduit le concept d'espaces de noms, qui permettent de multiplexer plusieurs canaux logiques sur une seule connexion TCP. La version 2.0 (2017) a ajouté la prise en charge des données binaires et amélioré les performances d'analyse. La version actuelle 4.x (2020–2025) inclut la prise en charge complète de TypeScript, un mode adaptateur phare pour le passage à l'échelle et une rétrocompatibilité améliorée.
Chaque version majeure maintient la rétrocompatibilité de l'API — un client socket.io@2 peut se connecter à un serveur socket.io@4 via un mode de compatibilité spécial. Ceci est important pour les projets de longue durée où les mises à niveau côté client se font progressivement.
L'architecture de Socket.IO se compose de deux composants : le module serveur (package npm socket.io) et le module client (package npm socket.io-client). Le serveur fonctionne sur un serveur HTTP(S) Node.js et utilise Engine.IO pour gérer la couche de transport.
Lors de la connexion initiale, le client envoie une requête HTTP au serveur. Engine.IO répond et établit une connexion long-polling. Après cela, le client envoie une requête pour mettre à niveau le protocole de transport vers WebSocket. Si le serveur prend en charge WebSocket, la mise à niveau se produit dans une seule session TCP. Sinon, la connexion reste en long-polling et le code de l'application ne nécessite aucune modification.
Selon les tests de performance de Socket.IO (2024), lors de l'utilisation de WebSocket, la latence est de 2 à 5 ms par transmission de message, tandis que le long-polling ajoute 150 à 300 ms en raison de la surcharge HTTP. Le choix du transport est transparent pour le développeur.
Engine.IO est la couche de transport de bas niveau sur laquelle Socket.IO est construit. Il gère l'établissement de la connexion, la sélection du transport, le heartbeat (ping/pong) et la fermeture de la connexion. Les principaux types de paquets Engine.IO sont : open (initialisation), close (fermeture), ping/pong (maintien en vie), upgrade (changement de transport) et message (données).
Socket.IO construit son modèle événementiel sur Engine.IO — c'est avec cela que le développeur travaille. Chaque message Socket.IO est encapsulé dans un paquet Engine.IO de type message avec un identifiant unique pour la confirmation de livraison.
Socket.IO fournit un ensemble de fonctionnalités absentes de l'API WebSocket native qui rendent le développement d'applications en temps réel considérablement plus facile. Examinons les principales.
Reconnexion automatique — le client restaure automatiquement la connexion en cas de déconnexion avec backoff exponentiel (100 ms, 200 ms, 400 ms... jusqu'à un maximum). Selon la documentation de Socket.IO (2024), les paramètres de tentative sont disponibles via les paramètres reconnectionDelay et reconnectionAttempts. Cette option est cruciale pour les applications mobiles où la connexion peut être interrompue lors des changements de réseau.
Prise en charge des salles — le serveur peut regrouper les sockets dans des salles et envoyer des messages uniquement aux participants d'une salle spécifique. Les salles ne nécessitent pas de création explicite — elles sont créées lorsque le premier socket les rejoint. Les salles sont implémentées au niveau du processus et ne sont pas partagées entre différents serveurs sans un adaptateur spécial.
Espaces de noms — séparation logique des canaux de communication sur une seule connexion. Par exemple, l'espace de noms /chat pour les messages de chat et /notifications pour les notifications. Chaque espace de noms a ses propres salles, middleware et gestionnaires. Les espaces de noms sont multiplexés sur une seule connexion TCP, économisant ainsi des ressources.
Confirmation de livraison — lors de l'envoi d'un message, une fonction de rappel peut être passée qui sera appelée lorsque le serveur confirmera la réception. Ceci est implémenté via un identifiant unique pour chaque paquet. Le mécanisme de confirmation garantit que les messages critiques (par exemple, les transactions de paiement) sont livrés au destinataire.
Le choix entre Socket.IO et WebSocket natif dépend des exigences du projet. WebSocket est un protocole standardisé (RFC 6455) pris en charge par tous les navigateurs modernes. Socket.IO est une bibliothèque qui utilise WebSocket comme transport mais ajoute des fonctionnalités supplémentaires.
| Caractéristique | Socket.IO | WebSocket |
|---|---|---|
| Transport | WebSocket + HTTP long-polling (repli) | WebSocket uniquement |
| Modèle d'événements | Événements nommés avec charge utile JSON | Frames texte/binaires uniquement |
| Salles | Regroupement de sockets intégré | Nécessite une implémentation manuelle |
| Reconnexion automatique | Intégrée | Nécessite une implémentation manuelle |
| Confirmation de livraison | Mécanisme ACK avec rappel | Disponible via des extensions de protocole |
| Passage à l'échelle | Adaptateurs (Redis, MongoDB, Cluster) | Nécessite une infrastructure personnalisée |
| Taille de la bibliothèque | ~50 Ko (client, gzip) | Intégré au navigateur (0 Ko) |
Si votre projet nécessite des performances maximales et une taille de client minimale — choisissez WebSocket natif. Si vous avez besoin d'une livraison fiable, d'un regroupement et d'un modèle événementiel — Socket.IO réduira le temps de développement de 2 à 3 fois grâce à des abstractions prêtes à l'emploi.
Selon l'enquête State of JS 2024, 67 % des développeurs d'applications en temps réel préfèrent Socket.IO en raison de son API pratique et de sa gestion intégrée des cas limites (déconnexion réseau, reconnexion, données binaires).
Installer Socket.IO nécessite deux packages : côté serveur et côté client. Examinons la configuration de base pour un projet Node.js. Le serveur crée un serveur HTTP, initialise Socket.IO et gère les événements de connexion et de déconnexion des clients.
Selon la documentation de Socket.IO (2024), le serveur peut être démarré sans Express en utilisant le module http intégré, mais dans les projets réels, on utilise généralement Express ou Fastify pour le routage des requêtes HTTP.
const express = require('express');
const http = require('http');
const Server = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server, {
cors: { origin: '*' }
});
io.on('connection', (socket) => {
console.log('Client connecté :', socket.id);
socket.emit('welcome', { message: 'Hello from server' });
socket.on('disconnect', () => {
console.log('Client déconnecté');
});
});
server.listen(3000, () => {
console.log('Serveur en écoute sur le port 3000');
});
import { io } from 'socket.io-client';
const socket = io('http://localhost:3000', {
transports: ['websocket', 'polling'],
reconnectionDelay: 1000
});
socket.on('welcome', (data) => {
console.log(data.message);
});
socket.emit('chat message', {
user: 'Alice',
text: 'Hello everyone!'
});
Le modèle d'événements de Socket.IO est basé sur des événements nommés. Le serveur et le client envoient et reçoivent des messages liés à un nom d'événement spécifique. La charge utile peut être une chaîne, un objet JSON ou des données binaires (Buffer, ArrayBuffer, Blob).
Chaque événement prend en charge ACK (accusé de réception) — le passage d'une fonction de rappel qui s'exécute côté expéditeur après le traitement de l'événement par le destinataire. Cela permet d'implémenter un modèle requête-réponse sur le modèle événementiel. ACK ne fonctionne que si le destinataire appelle explicitement le rappel.
Selon la documentation de Socket.IO (2024), la taille maximale d'un seul message ne doit pas dépasser 1 Mo pour des performances optimales. Les messages plus volumineux doivent être divisés en fragments ou envoyés via un canal séparé.
io.on('connection', (socket) => {
socket.join('room-1');
socket.to('room-1').emit('user joined', {
userId: socket.id
});
io.to('room-1').emit('message', {
text: 'Broadcast to room'
});
socket.leave('room-1');
});
Le passage à l'échelle horizontale de Socket.IO nécessite de résoudre le problème du partage d'état entre plusieurs processus serveur. Les salles, les espaces de noms et la liste des sockets connectés sont stockés dans la mémoire d'un seul processus et ne sont pas visibles par les autres processus sans adaptateur.
Adaptateurs officiels de Socket.IO : redis (via Redis Pub/Sub), mongodb (via MongoDB change streams), cluster (pour le mode multiprocessus de Node.js cluster). L'adaptateur agit comme un courtier de messages entre les instances de Socket.IO. Lorsqu'un événement est envoyé à une salle, l'adaptateur le publie dans Redis et tous les serveurs reçoivent la notification.
Selon les tests de charge de Socket.IO (2024), un cluster de 4 serveurs avec l'adaptateur Redis gère jusqu'à 400 000 connexions simultanées avec une latence inférieure à 10 ms. Sans adaptateur, la capacité maximale d'un seul processus Node.js est d'environ 100 000 connexions avec 1 Go de mémoire.
const Server = require('socket.io');
const RedisAdapter = require('@socket.io/redis-adapter');
const Redis = require('ioredis');
const pubClient = new Redis({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
const io = new Server(server);
io.adapter(RedisAdapter(pubClient, subClient));
Lors de l'utilisation de Kubernetes ou Docker Swarm, il est recommandé de configurer en plus l'affinité de session (sessions persistantes) afin que les requêtes d'un même client arrivent sur le même serveur ; sinon, l'affectation peut changer à chaque reconnexion.
Foire aux questions
Socket.IO fournit un modèle d'événements avec des événements nommés, une reconnexion automatique, la prise en charge des salles et un repli vers HTTP long-polling. Le WebSocket natif est un protocole de bas niveau avec une API minimale qui nécessite une implémentation manuelle de ces mécanismes.
Oui, il existe des implémentations tierces de la partie serveur pour Python (python-socketio), Java (netty-socketio), Go (go-socketio) et d'autres langages. Le client socket.io-client est disponible pour JavaScript, Swift, Kotlin et C++.
Un seul processus Node.js avec Socket.IO gère jusqu'à 100 000 connexions avec 1 Go de RAM. Avec l'adaptateur Redis et 4 serveurs, le cluster peut gérer jusqu'à 400 000 clients simultanés.
Oui, pour iOS il existe un client officiel en Swift, pour Android — un client en Java/Kotlin. Pour React Native, le client JavaScript standard socket.io-client est utilisé.
Utilisez HTTPS/WSS au lieu de HTTP/WS, configurez un middleware pour l'authentification via des jetons (JWT), définissez des limites d'événements sortants via des validateurs et utilisez la limitation de débit pour la protection contre les DDoS.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi