Crash Landing On You - Jeu Multijoueur
Jeu web multijoueur en temps réel développé avec Next.js, TypeScript, Express, API REST et socket.io.
Comparatif pratique entre API REST et WebSocket (Socket.IO) pour Node.js/Express : exemples, cas d'usage, code, diagrammes Mermaid.
Lorsqu’on développe une application web dynamique avec Node.js, il est essentiel de choisir la bonne stratégie de communication entre le client et le serveur. Deux options populaires s’offrent aux développeurs : les API REST traditionnelles et les WebSocket via Socket.IO.
L’objectif est de t’aider à comprendre les différences concrètes entre ces deux approches, à travers des explications claires, des exemples de code, des cas d’usage typiques et des diagrammes Mermaid. Le tout en environnement Express moderne (ESM), pour t’aider à faire le bon choix selon le contexte de ton projet.
Voici un tableau comparatif des principales différences entre une API REST classique et un système de communication basé sur WebSocket :
Aspect | REST API | WebSocket (Socket.IO) |
---|---|---|
Protocole | HTTP | WS (WebSocket) via TCP |
Connexion | Brève (stateless, 1 requête = 1 réponse) | Persistante (établie puis réutilisée) |
Communication | Client → Serveur | Bidirectionnelle (Client ↔ Serveur) |
Temps réel | Non (ou long polling) | Oui |
Idéal pour… | CRUD, formulaires, SEO | Chat, jeu, dashboard temps réel |
Complexité | Simple | Moyennement complexe |
import express from 'express'
const app = express()
app.use(express.json())
let messages = []
app.post('/messages', (req, res) => {
messages.push(req.body)
res.status(201).json({ status: 'ok', saved: req.body })
})
app.get('/messages', (req, res) => {
res.json(messages)
})
app.listen(3000, () => {
console.log('REST API dispo sur http://localhost:3000')
})
import express from 'express'
import { createServer } from 'http'
import { Server } from 'socket.io'
const app = express()
const server = createServer(app)
const io = new Server(server, { cors: { origin: '*' } })
io.on('connection', (socket) => {
console.log('Client connecté')
socket.on('chat:message', (data, ack) => {
console.log('Nouveau message:', data)
socket.broadcast.emit('chat:message', data)
if (ack) ack({ status: 'reçu' })
})
})
server.listen(3001, () => {
console.log('WebSocket dispo sur ws://localhost:3001')
})
fetch('http://localhost:3000/messages', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ from: 'Nico', text: 'Hello via REST' }),
}).then(res => res.json()).then(console.log)
import { io } from 'socket.io-client'
const socket = io('http://localhost:3001')
socket.emit('chat:message', { from: 'Nico', text: 'Hello via WS' }, (ack) => {
console.log('Accusé réception:', ack)
})
socket.on('chat:message', (msg) => {
console.log('Message reçu en temps réel:', msg)
})
sequenceDiagram
participant Client
participant Server
Client->>Server: POST /messages {from, text}
Server-->>Client: 201 Created
loop Toutes les 2 secondes
Client->>Server: GET /messages
Server-->>Client: [ ...messages ]
end
sequenceDiagram
participant Client
participant Serveur
participant AutresClients
Client->>Serveur: Connexion Socket.IO
Serveur-->>Client: Connexion établie
Client->>Serveur: emit("chat:message", {from, text}, ack)
Serveur-->>Client: ack({ status: "reçu" })
Serveur-->>AutresClients: broadcast("chat:message", {from, text})
Fonctionnalité | REST | WebSocket (Socket.IO) |
---|---|---|
Envoi de message | POST /messages | socket.emit("chat:message") |
Réception de message | GET /messages (polling) | socket.on("chat:message") |
Réponse serveur | res.status().json() | callback de emit(..., ack) |
Diffusion à d’autres | ❌ | socket.broadcast.emit(...) |
Communication bidirectionnelle | ❌ | ✅ |
Plutôt que de choisir REST ou WebSocket, il est souvent pertinent d’utiliser les deux dans une application moderne.
En comprenant ces deux approches, tu peux construire une architecture web robuste, évolutive et adaptée à chaque fonctionnalité de ton application.
Ajoute à ton projet des fonctionnalités comme l’authentification Socket.IO, la gestion de rooms, les namespaces, ou encore des événements personnalisés.
Tu as maintenant les bases pour faire le bon choix technique et structurer proprement ton back-end Express avec REST et WebSocket.
Jeu web multijoueur en temps réel développé avec Next.js, TypeScript, Express, API REST et socket.io.