đŹ 1. Introduction : Quâest-ce que le temps rĂ©el et pourquoi sâen soucier ?
Imagine ceci :
Tu regardes un match de foot, mais le score sâaffiche avec trois minutes de retard.
Tu consultes les prix des cryptos, mais le Bitcoin affiche le tarif dâil y a cinq minutes.
Ou ton ami tâĂ©crit â et son message arrive dix secondes plus tard. đ©
Câest lĂ que le temps rĂ©el entre en scĂšne.
Câest la magie qui garantit que les mises Ă jour te parviennent instantanĂ©ment â sans attente, sans latence, sans âjâarrive en retard Ă la fĂȘteâ ! â±ïž
Et câest ici que notre charmant hĂ©ros entre en jeu :
đĄ SSE â Server-Sent Events
(ou comme jâaime lâappeler, « les lettres dâamour du serveur » đ)
đ 2. Quâest-ce que SSE ? (Flux de donnĂ©es unidirectionnel du serveur)
Le SSE (Server-Sent Events) est une fonctionnalitĂ© HTML5 qui permet Ă une page web de recevoir automatiquement des mises Ă jour dâun serveur via une seule connexion HTTP longue durĂ©e.
Voici lâidĂ©e :
- Câest unidirectionnel (serveur â client), contrairement aux WebSockets.
- Parfait pour les notifications ou les mises Ă jour en direct.
- Fonctionne sur HTTP, donc pas de casse-tĂȘte proxy / pare-feu.
- Reconnexion automatique si la connexion tombe.
- LĂ©ger â pas de fetch ou de soupe de socket compliquĂ©e requise đ
âïž 3. Comment fonctionne SSE ? (Flux logique simple)
1ïžâŁ Le navigateur dit :
« HĂ© serveur, peux-tu mâenvoyer les nouveaux Ă©vĂ©nements dĂšs quâils arrivent ? »
const source = new EventSource('/events');
2ïžâŁ Le serveur rĂ©pond :
« Bien sĂ»r, mon chou, je garde cette connexion ouverte uniquement pour toi đ »
et envoie cet en-tĂȘte :
Content-Type: text/event-stream
3ïžâŁ Le serveur envoie de temps en temps des messages :
data: Un nouveau message vient dâarriver đŹ
\n\n
4ïžâŁ Le navigateur les reçoit ainsi :
source.onmessage = (e) => console.log(e.data);
đ« Et câest tout ! Tant que la page reste ouverte, les donnĂ©es coulent du serveur comme des lettres dâamour en temps rĂ©el. đ
đ» 4. CĂŽtĂ© client : utilisation dâEventSource
Voici le cĂŽtĂ© HTML romantique đ
(Tu peux enregistrer ce code en .html et le lancer directement.)
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Notifications en direct (SSE) đŹ</title>
<style>
body { font-family: sans-serif; background: #f0f8ff; padding: 20px; }
h1 { color: #0077cc; }
#log { border: 1px solid #ccc; padding: 10px; border-radius: 10px; background: white; height: 300px; overflow-y: auto; }
.msg { background: #e6f7ff; padding: 5px 10px; margin: 5px 0; border-radius: 6px; }
</style>
</head>
<body>
<h1>đŹ Notifications en direct (SSE)</h1>
<div id="log"></div>
<script>
const log = document.getElementById('log');
const addMessage = (text) => {
const div = document.createElement('div');
div.className = 'msg';
div.textContent = text;
log.appendChild(div);
log.scrollTop = log.scrollHeight;
};
// Connexion EventSource
const evtSource = new EventSource('/events');
evtSource.onopen = () => addMessage('đ ConnectĂ© ! Ă lâĂ©coute du serveurâŠ');
evtSource.onerror = () => addMessage('â ïž Connexion perdue, tentative de reconnexionâŠ');
evtSource.onmessage = (event) => addMessage('đ Message : ' + event.data);
// Ăcoute dâĂ©vĂ©nement personnalisĂ©
evtSource.addEventListener('alert', (event) => {
addMessage('đš Alerte : ' + event.data);
});
</script>
</body>
</html>
âš Quand cette page sâexĂ©cute, elle se connecte Ă /events.
Si le serveur envoie des donnĂ©es, tu les verras apparaĂźtre en direct â pas besoin de rafraĂźchir.
đ§ 5. CĂŽtĂ© serveur : SSE avec Node.js + Express
Du cĂŽtĂ© serveur, tu dois dĂ©finir correctement les en-tĂȘtes.
Si tu oublies Content-Type: text/event-stream, le navigateur ne reconnaĂźtra pas le flux.
// server.js
const express = require('express');
const app = express();
app.get('/events', (req, res) => {
res.set({
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
res.flushHeaders(); // commence immédiatement
res.write('data: đ Connexion SSE Ă©tablie !\n\n');
// Envoie un message toutes les 5 secondes
const interval = setInterval(() => {
const msg = `Bonjour du serveur : ${new Date().toLocaleTimeString()}`;
res.write(`data: ${msg}\n\n`);
}, 5000);
// Nettoyage quand le client se déconnecte
req.on('close', () => {
clearInterval(interval);
console.log('â Connexion fermĂ©e.');
});
});
app.listen(3000, () => console.log('đ Serveur SSE en Ă©coute sur le port 3000 !'));
Ensuite :
1ïžâŁ Lance node server.js
2ïžâŁ Ouvre http://localhost:3000 dans ton navigateur
3ïžâŁ đ De nouveaux messages apparaĂźtront toutes les 5 secondes !
đŹ 6. Format du message SSE
Un message SSE ressemble habituellement Ă ceci :
id: 123
event: notify
data: Bonjour mon amour, tu as un nouveau message đ
retry: 3000
- id : Identifiant du message. Si la connexion tombe, le navigateur utilise
Last-Event-IDpour reprendre. - event : Type dâĂ©vĂ©nement personnalisĂ© (par exemple
notify,warning). - data : Le contenu réel du message.
- retry : Délai de reconnexion (en millisecondes).
âïž 7. SSE vs WebSocket : lâarĂšne du code đ„
| Fonctionnalité | SSE | WebSocket |
|---|---|---|
| Direction | Uniquement serveur â client | Bi-directionnel |
| Configuration | Ultra simple đ | Plus complexe |
| Protocole | HTTP | WS (WebSocket) |
| Reconnexion | Automatique | Manuelle |
| Performance | Léger | Puissant en charge élevée |
| Support navigateurs | Navigateurs modernes | Presque tous |
đ RĂ©sumĂ© :
- Si tu as besoin de notifications en direct, de journaux ou de simples mises Ă jour â SSE
- Si tu as besoin de chat, jeux multiplayer ou messagerie bidirectionnelle â WebSocket
đš 8. PiĂšges frĂ©quents (appris Ă la dure đ )
đŁ Tamponnement proxy :
Si tu utilises Nginx comme proxy inverse, assure-toi de désactiver le tamponnement :
location /events {
proxy_pass http://localhost:3000/events;
proxy_buffering off;
}
Sans cela, les messages peuvent arriver avec retard. đŹ
đŁ CORS :
Si ton frontend et backend sont sur des domaines différents :
res.setHeader('Access-Control-Allow-Origin', '*');
đŁ En-tĂȘtes personnalisĂ©s :EventSource ne peut pas envoyer dâen-tĂȘtes personnalisĂ©s â pas de âBearer tokenâ.
Utilise les cookies pour lâauthentification.
đŁ Timeouts :
Pour garder les connexions actives, envoie occasionnellement un commentaire :
:\n\n
(Câest comme un âpingâ de cardio đ)
⥠9. Mini exemple pour les fans de PHP
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
echo "data: Bonjour du serveur !\n\n";
flush();
for ($i = 1; $i <= 5; $i++) {
echo "data: Notification #$i Ă " . date('H:i:s') . "\n\n";
flush();
sleep(2);
}
?>
đ Nâoublie pas flush() â PHP peut ĂȘtre un peu trop patient avec ses tampons.
đ 10. Niveau avancĂ© : types dâĂ©vĂ©nements personnalisĂ©s
Tu peux envoyer des types dâĂ©vĂ©nement personnalisĂ©s comme ceci :
event: alert
data: Maintenance serveur en cours đ§
\n\n
Et les gérer dans le navigateur :
source.addEventListener('alert', (e) => {
alert('â ïž ' + e.data);
});
đ§© 11. Cas dâusage rĂ©els
đ Scores en direct :
âFenerbahçe 3 â 2 Galatasarayâ se met Ă jour instantanĂ©ment !
đč Prix des cryptos :
Ton tableau de bord se met Ă jour pendant que tu prends un cafĂ© â
đ Dashboards :
Nombre dâutilisateurs en direct, journaux serveur, panels analytiques.
đŹ Notifications type push :
Nouveaux messages, commentaires ou alertes en temps réel.
đ 12. Derniers mots â Pourquoi SSE est comme une belle relation
Parce que câest simple.
Parce que câest fiable.
Parce que chaque message qui arrive te rĂ©chauffe le cĆur. â€ïž
« La connexion est toujours ouverte⊠Je ne tâai pas oubliĂ© đ »
Si WebSocket est une romance passionnĂ©e, intense đ
alors SSE est un amour calme et constant â toujours lĂ ,
silencieux mais fiable. đ«¶
La prochaine fois, mon amour, on plongera dans :
đ âConstruire un tableau de bord en temps rĂ©el avec SSEâ
ou
đ âNode + React : Centre de notifications (Ă©dition SSE)â ?
Lequel veux-tu Ă©crire ensuite, chĂ©ri(e) â le dashboard ou lâapp live ? đ

