Durée totale : 15 heures (2 jours)
Technologies : TypeScript, Node.js, Socket.io
- Comprendre les besoins de communication en temps réel
- Découvrir les différentes techniques disponibles
- Installer l'environnement de développement
- Qu'est-ce que le temps réel sur le web ?
- Cas d'usage concrets : chat, notifications, tableaux de bord, jeux multijoueurs
- Évolution historique des techniques de communication client-serveur
- Présentation du modèle requête-réponse HTTP classique
- Limitations du protocole HTTP pour le temps réel
- Configuration de l'environnement de développement
- Installation de Node.js et npm
- Installation de TypeScript (
npm install -g typescript) - Configuration de
tsconfig.json - Installation des dépendances de base :
express,@types/express,@types/node
- Création d'un serveur HTTP basique en TypeScript
- Mise en place d'une structure de projet
/src /server server.ts /client index.html /dist tsconfig.json package.json
- Documentation MDN : HTTP protocol
- Documentation officielle TypeScript
- Comprendre le principe du polling
- Implémenter une solution de polling simple
- Analyser les avantages et inconvénients
- Définition du polling (interrogation périodique)
- Fonctionnement : requêtes HTTP répétées à intervalle régulier
- Analyse du trafic réseau généré
- Cas d'usage appropriés
- Création d'un endpoint API REST pour récupérer des données
app.get('/api/messages', (req, res) => { // Retourne les nouveaux messages });
- Implémentation côté client avec
setInterval()etfetch() - Création d'une interface simple affichant des messages en temps "quasi-réel"
- Observation du trafic réseau avec les DevTools
- Latence importante entre les mises à jour
- Charge serveur élevée (nombreuses requêtes inutiles)
- Consommation de bande passante
- Simplicité d'implémentation
- MDN : Fetch API
- MDN : setInterval
- Comprendre le principe du long polling
- Migrer l'application de polling vers long polling
- Comparer les performances avec le polling simple
- Définition du long polling
- Différence avec le polling classique
- Mécanisme de maintien de connexion
- Gestion du timeout
- Avantages par rapport au polling simple
- Modification du serveur pour maintenir la connexion ouverte
app.get('/api/long-poll', (req, res) => { // Attendre un événement ou timeout waitForNewData() .then(data => res.json(data)) .catch(() => res.status(204).end()); });
- Implémentation d'un système de file d'attente côté serveur
- Modification du client pour gérer la reconnexion automatique
- Gestion des erreurs et timeouts
- Réduction du nombre de requêtes
- Diminution de la latence
- Complexité accrue de l'implémentation
- Problèmes potentiels : timeouts, gestion de la reconnexion
- Créer un système de notifications avec long polling
- Implémenter un compteur d'utilisateurs connectés
- Découvrir l'API Server-Sent Events
- Implémenter une communication unidirectionnelle serveur → client
- Identifier les cas d'usage appropriés
- Présentation de l'API SSE
- Protocole et format des événements
- Différences avec le long polling
- Limitations : communication unidirectionnelle
- Reconnexion automatique native
- Configuration du serveur pour SSE
app.get('/events', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // Envoi d'événements const sendEvent = (data: any) => { res.write(`data: ${JSON.stringify(data)}\n\n`); }; });
- Utilisation de l'API
EventSourcecôté clientconst eventSource = new EventSource('/events'); eventSource.onmessage = (event) => { // Traiter les données };
- Création d'un tableau de bord temps réel (ex: flux d'actualités)
- Gestion des événements nommés
- Communication unidirectionnelle uniquement
- Support natif du navigateur
- Reconnexion automatique
- Pas de support IE
- Créer un système de monitoring temps réel affichant des métriques serveur
- Comprendre le protocole WebSocket
- Découvrir la communication bidirectionnelle
- Implémenter un premier exemple avec WebSocket natif
- Présentation du protocole WebSocket (RFC 6455)
- Handshake HTTP → Upgrade vers WebSocket
- Communication full-duplex
- Différences fondamentales avec HTTP
- Avantages par rapport aux solutions précédentes
- Format des frames WebSocket
- Installation de
ws:npm install ws @types/ws - Création d'un serveur WebSocket basique
import { WebSocketServer } from 'ws'; const wss = new WebSocketServer({ port: 8080 }); wss.on('connection', (ws) => { ws.on('message', (data) => { // Traiter le message }); });
- Connexion depuis le client avec l'API WebSocket native
const socket = new WebSocket('ws://localhost:8080'); socket.onmessage = (event) => { // Traiter le message };
- Création d'un chat simple bidirectionnel
- RFC 6455 : The WebSocket Protocol
- MDN : WebSocket API
- Documentation ws library
- Découvrir la bibliothèque Socket.io
- Comprendre ses avantages par rapport aux WebSockets natifs
- Mettre en place un projet avec Socket.io
- Présentation de Socket.io
- Fonctionnalités supplémentaires : reconnexion automatique, fallback, broadcasting
- Architecture : namespace, rooms
- Gestion automatique des transports (WebSocket, long polling...)
- Événements personnalisés
- Différences entre Socket.io v4 et versions précédentes
- Installation :
npm install socket.io @types/socket.io - Configuration du serveur Socket.io avec Express
import express from 'express'; import { createServer } from 'http'; import { Server } from 'socket.io'; const app = express(); const httpServer = createServer(app); const io = new Server(httpServer); io.on('connection', (socket) => { console.log('Client connecté'); socket.on('message', (data) => { // Traiter et diffuser io.emit('message', data); }); });
- Configuration du client Socket.io
import { io } from 'socket.io-client'; const socket = io('http://localhost:3000'); socket.on('message', (data) => { // Afficher le message });
- Refactorisation du chat précédent avec Socket.io
- Implémentation d'événements personnalisés
- Ajouter des indicateurs de présence (utilisateur en train de taper)
- Implémenter un système de notifications
- Documentation officielle Socket.io
- Socket.io Getting Started Guide
- Maîtriser les différents modes de diffusion
- Implémenter un système de rooms
- Gérer plusieurs utilisateurs simultanés
- Broadcasting :
emit,broadcast,to() - Différence entre :
socket.emit(): envoyer au client actuelsocket.broadcast.emit(): envoyer à tous sauf l'émetteurio.emit(): envoyer à tous les clientsio.to(room).emit(): envoyer à une room spécifique
- Concept de rooms et namespaces
- Gestion des utilisateurs connectés
- Stockage de données par socket (socket.data)
- Implémentation d'un système de rooms pour le chat
socket.on('join-room', (roomName: string) => { socket.join(roomName); io.to(roomName).emit('user-joined', socket.id); }); socket.on('leave-room', (roomName: string) => { socket.leave(roomName); io.to(roomName).emit('user-left', socket.id); }); socket.on('room-message', (roomName: string, message: string) => { io.to(roomName).emit('room-message', { user: socket.id, message: message }); });
- Création d'un système de salons de discussion multiples
- Liste des utilisateurs présents dans chaque room
- Système de gestion des noms d'utilisateurs
- Interface permettant de changer de salon
- Application de chat multi-rooms avec :
- Authentification simple (nom d'utilisateur)
- Création/suppression de salons
- Liste des participants par salon
- Historique des messages (en mémoire)
- Notifications de connexion/déconnexion
- Socket.io : Rooms documentation
- Socket.io : Emit cheatsheet
- Implémenter des communications privées
- Utiliser les namespaces pour isoler des fonctionnalités
- Gérer l'authentification et les autorisations
- Optimiser les performances
- Namespaces vs Rooms
- Communications privées entre deux clients
- Middleware Socket.io pour l'authentification
- Gestion des erreurs et déconnexions
- Bonnes pratiques de sécurité
- Scalabilité avec Redis adapter
- Implémentation de namespaces
const chatNamespace = io.of('/chat'); const notificationNamespace = io.of('/notifications'); chatNamespace.on('connection', (socket) => { // Logique spécifique au chat });
- Mise en place d'un middleware d'authentification
io.use((socket, next) => { const token = socket.handshake.auth.token; if (isValidToken(token)) { socket.data.userId = getUserIdFromToken(token); next(); } else { next(new Error('Authentication error')); } });
- Implémentation de messages privés
socket.on('private-message', (recipientId: string, message: string) => { io.to(recipientId).emit('private-message', { from: socket.id, message: message }); });
- Typage TypeScript des événements
interface ServerToClientEvents { message: (data: MessageData) => void; userJoined: (userId: string) => void; } interface ClientToServerEvents { sendMessage: (message: string) => void; } const io = new Server<ClientToServerEvents, ServerToClientEvents>(httpServer);
- Finalisation d'une application complète combinant :
- Chat public et privé
- Salons thématiques
- Authentification
- Notifications en temps réel
- Tableau de bord d'administration
- Récapitulatif des techniques étudiées
- Comparaison et choix de la solution appropriée selon le contexte
- Évaluation pratique
| Technique | Avantages | Inconvénients | Cas d'usage |
|---|---|---|---|
| Polling | Simple à implémenter | Latence élevée, charge serveur | Données peu critiques, mise à jour peu fréquente |
| Long Polling | Meilleure latence que polling | Complexité, gestion reconnexion | Notifications occasionnelles |
| SSE | Natif, reconnexion auto | Unidirectionnel | Flux de données serveur→client (feeds, logs) |
| WebSocket | Bidirectionnel, faible latence | Nécessite serveur compatible | Applications temps réel, jeux |
| Socket.io | Fonctionnalités avancées, fallback | Overhead supplémentaire | Applications professionnelles complexes |
- Analyser les besoins : unidirectionnel vs bidirectionnel
- Considérer la compatibilité navigateur
- Évaluer la charge serveur attendue
- Prendre en compte la complexité d'implémentation
- Quiz sur les concepts théoriques
- Exercice pratique : implémenter une fonctionnalité temps réel selon un cahier des charges
- Discussion sur les choix techniques effectués
- TypeScript Documentation
- Node.js Documentation
- Socket.io Documentation
- MDN Web Docs - WebSocket
- MDN Web Docs - Server-sent events
ws: WebSocket library pour Node.jssocket.io: Bibliothèque de communication temps réelexpress: Framework web pour Node.jstypescript: Superset typé de JavaScript
- Postman : test d'API REST
- DevTools navigateur : analyse du trafic réseau
- WebSocket King : client WebSocket pour tests
- Docker & Docker Compose : déploiement
- Compréhension théorique (30%) : capacité à expliquer le fonctionnement de chaque technique
- Implémentation pratique (50%) : qualité du code, respect des bonnes pratiques TypeScript
- Analyse critique (20%) : capacité à choisir la solution appropriée selon le contexte
- Code source commenté du projet final
- Documentation technique (choix d'architecture, justification des technologies)
- Démonstration fonctionnelle
Application de collaboration en temps réel (au choix) :
- Système de visioconférence textuel avec salons
- Tableau blanc collaboratif
- Outil de gestion de projet avec notifications
- Plateforme de quiz en direct multijoueur