Pourquoi une requête HTTP classique est comme une lettre postale, alors que SSE est un télégramme en temps réel
\n\nImaginez : vous attendez une notification concernant un nouveau commentaire sur un site. Vous actualisez la page toutes les 5 secondes. Le serveur renvoie à chaque fois un tas de HTML, CSS, images — et seulement ensuite, tout en bas, vous voyez : « Aucun nouveau commentaire ». Cela vous dit quelque chose ? Cela s'appelle le polling. Ça fonctionne, mais ça consomme de la bande passante et charge le serveur.
\n\nImaginez maintenant un autre scénario : vous ouvrez la page, et une seconde plus tard, un message apparaît : « Vassily a laissé un commentaire : "Super article !" ». Sans rechargement, sans requêtes superflues. Le serveur « pousse » lui-même les données vers vous. C'est ce qu'on appelle les Server-Sent Events (SSE) — une technologie qui permet au serveur d'envoyer un flux d'événements au client via une simple connexion HTTP.
\n\nDans cet article, nous allons voir comment implémenter SSE en C++ pur sans utiliser de frameworks lourds. Vous découvrirez pourquoi les Server-Sent Events en C++ sont un excellent choix pour la surveillance, les cotations boursières, les notifications de chat et toutes les tâches nécessitant une transmission unidirectionnelle de données en temps réel.
\n\nComment fonctionnent les Server-Sent Events ? Analyse du protocole
\n\nSSE fait partie de la spécification HTML5. Le client ouvre une connexion HTTP standard et dit au serveur : « Je suis prêt à écouter les événements ». En réponse, le serveur ne ferme pas la connexion, mais commence à envoyer des données dans un format spécial text/event-stream.
Le format du message est extrêmement simple :
\n\ndata: Ceci est le texte de l'événement\\n\\n\n\nChaque événement commence par data: et se termine par un double saut de ligne. On peut ajouter id: pour l'identification, event: pour le type d'événement et retry: pour indiquer le délai de reconnexion en millisecondes.
Exemple d'un flux complet :
\n\nid: 42\nevent: new_message\ndata: {"user": "Vassily", "text": "Bonjour !"}\n\nid: 43\nevent: ping\ndata: Le serveur est vivant\n\n\n\nLe client (navigateur ou toute application) traite ces lignes et génère des événements JavaScript. Tout ce qui est génial est simple.
\n\nSSE vs WebSocket : quand choisir quoi ?
\n\nBeaucoup pensent immédiatement à WebSocket lorsqu'il s'agit de temps réel. Comparons :
\n\n- \n
- WebSocket — communication bidirectionnelle. Le client et le serveur peuvent initier un échange. Nécessite un protocole séparé (ws://), un passage via des proxys, souvent bloqué par les pare-feux d'entreprise. \n
- SSE — communication unidirectionnelle (serveur → client). Fonctionne sur HTTP standard. Se reconnecte automatiquement en cas de rupture. Passe facilement à travers tous les proxys. \n
Si votre tâche consiste à envoyer des notifications au client, sans attendre de commandes de sa part, les Server-Sent Events en C++ sont une solution élégante et simple. Pas besoin d'importer des bibliothèques lourdes, pas besoin d'écrire des gestionnaires complexes.
\n\nÉcrire un serveur SSE en C++ à partir de zéro
\n\nPour l'implémentation, nous avons besoin d'un minimum : des sockets et la gestion de HTTP. Dans les projets réels, on utilise Boost.Beast ou libmicrohttpd, mais pour comprendre l'essentiel, nous allons écrire un serveur simple en C++ pur avec des sockets POSIX.
\n\nNotre serveur va :
\n- \n
- Accepter une requête HTTP du client \n
- Déterminer que le client veut du SSE (via l'en-tête
Accept: text/event-stream) \n - Envoyer un flux d'événements avec l'heure actuelle toutes les 2 secondes \n
Étape 1 : Créer un socket et écouter un port
\n\n#include <iostream>\n#include <string>\n#include <cstring>\n#include <unistd.h>\n#include <arpa/inet.h>\n#include <sys/socket.h>\n#include <thread>\n#include <chrono>\n#include <sstream>\n\nvoid handle_client(int client_socket) {\n // Tampon pour la requête\n char buffer[4096] = {0};\n read(client_socket, buffer, 4096);\n \n // Vérifier qu'il s'agit d'une requête GE