Historique des WebSockets
Le protocole WebSocket a été introduit en 2008 et standardisé par l'IETF en 2011. Avant cela, les applications web reposaient principalement sur le protocole HTTP pour la communication, qui fonctionnait en mode requête-réponse. WebSocket est conçu pour permettre une communication en temps réel plus efficace.
Introduction
WebSocket est un protocole de communication bidirectionnel, full-duplex, conçu pour fonctionner sur une connexion TCP, ce qui permet un échange de données en temps réel entre un client (souvent un navigateur) et un serveur. Contrairement au modèle traditionnel HTTP, où chaque requête du client nécessite une réponse du serveur (modèle de requête-réponse), WebSocket établit une connexion unique et persistante, permettant au client et au serveur de s’envoyer des messages à tout moment.
Fonctionnement des WebSockets
Le protocole WebSocket commence par une négociation via une requête HTTP standard, appelée handshake. Une fois la connexion établie, celle-ci reste ouverte, permettant un échange continu de messages entre le client et le serveur. Voici les principales étapes :
Handshake HTTP :
- La connexion WebSocket est initiée par une requête HTTP (avec l'en-tête Upgrade).
- Si le serveur accepte la demande, il répond avec une mise à niveau (HTTP 101 Switching Protocols), transformant ainsi la connexion HTTP en une connexion WebSocket.
- Une fois la connexion établie, le client et le serveur peuvent envoyer et recevoir des messages de manière asynchrone et bidirectionnelle.
- Les messages sont encodés en trames (frames), ce qui permet d'envoyer de petits segments de données au lieu d’un gros paquet, réduisant ainsi la latence.
- La connexion peut être fermée par le client ou le serveur en envoyant une trame de fermeture (Close frame), suivie d'un code de statut indiquant la raison.
Avantages et inconvénients de WebSocket
Avantages :
- Temps réel : La connexion persistante permet des mises à jour instantanées, idéales pour des applications de chat, jeux en ligne, et tableaux de bord.
- Latence faible : Étant donné que la connexion est permanente, il n’y a pas besoin de créer de nouvelles connexions pour chaque interaction.
- Communication bidirectionnelle : Contrairement à HTTP, WebSocket permet un flux d’informations dans les deux directions.
Inconvénients :
- Overhead initial : La phase de handshake prend quelques millisecondes de plus.
- Support limité : Bien que WebSocket soit largement pris en charge, certains pare-feux ou proxy peuvent bloquer les connexions WebSocket.
- Complexité : Les messages doivent être gérés dans les deux directions, nécessitant un traitement asynchrone et la gestion de plusieurs connexions.
Comparaison WebSocket vs HTTP
Aspect | WebSocket | HTTP |
---|---|---|
Connexion | Persistante | Fermée après chaque requête |
Latence | Faible, connexion unique | Haute, chaque requête nécessite un nouvel échange |
Mode de communication | Bidirectionnel, full-duplex | Requête-réponse, unidirectionnel |
Cas d’utilisation | Chat, jeux, notifications, flux de données | API REST, chargement de pages |
Mise en pratique
Créer un serveur WebSocket avec Python
Exemple de code pour un serveur WebSocket avec la bibliothèque websockets
en Python.
import asyncio
import websockets
async def serveur(websocket, path):
async for message in websocket:
await websocket.send(f"Message reçu: {message}")
start_server = websockets.serve(serveur, "localhost", 12345)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Créer un client WebSocket avec JavaScript
Code d'exemple pour un client WebSocket en JavaScript.
// Connexion WebSocket
const socket = new WebSocket("ws://localhost:12345");
socket.onopen = () => {
socket.send("Bonjour serveur");
};
socket.onmessage = (event) => {
console.log("Message reçu: ", event.data);
};
socket.onclose = () => {
console.log("Connexion fermée");
};
Tester la connexion
Exécutez le serveur Python, puis ouvrez le fichier client dans un navigateur pour voir les messages échangés.