Introduction à WebSocket en Rust
Les applications temps réel sont devenues une partie intégrante du web moderne. Systèmes de chat, jeux en ligne, cotations boursières et notifications en temps réel — tout cela nécessite un échange de données bidirectionnel constant entre le client et le serveur. Le protocole WebSocket offre exactement cette possibilité, et Rust, grâce à ses performances et sa sécurité, est le langage idéal pour créer de tels systèmes.
Dans cet article, nous allons détailler comment créer des applications temps réel en Rust avec WebSocket. Vous découvrirez les crates populaires, les approches architecturales et obtiendrez des exemples de code prêts à l'emploi pour démarrer rapidement.
Fondamentaux de WebSocket et choix des bibliothèques
WebSocket est un protocole qui assure une communication full-duplex via une seule connexion TCP. Contrairement à HTTP, où le client initie une requête et le serveur répond, WebSocket permet aux deux parties d'envoyer des données à tout moment.
Crâtes populaires pour WebSocket en Rust
- tokio-tungstenite — client et serveur WebSocket asynchrones basés sur Tokio. Léger et rapide.
- actix-web — framework web puissant avec support intégré de WebSocket.
- tungstenite — version synchrone, pratique pour les scénarios simples.
- warp — un autre framework asynchrone avec support de WebSocket.
Pour la plupart des projets, nous recommandons tokio-tungstenite ou actix-web. Le premier pour les serveurs et clients légers, le second pour les applications web complètes.
Création d'un serveur WebSocket en Rust
Examinons la création d'un simple serveur echo qui reçoit des messages et les renvoie au client. Utilisons tokio-tungstenite.
Configuration du projet
Créez un nouveau projet Cargo et ajoutez les dépendances dans Cargo.toml :
[dependencies]tokio = { version = "1", features = ["full"] }tokio-tungstenite = "0.21"futures-util = "0.3"Serveur echo de base
use futures_util::{SinkExt, StreamExt};use tokio::net::TcpListener;use tokio_tungstenite::accept_async;
#[tokio::main]async fn main() -> Result<(), Box> { let listener = TcpListener::bind("127.0.0.1:8080").await?; println!("Serveur démarré sur ws://127.0.0.1:8080");
while let Ok((stream, addr)) = listener.accept().await { println!("Nouvelle connexion : {}", addr); tokio::spawn(handle_connection(stream)); }
Ok(())}
async fn handle_connection(stream: tokio::net::TcpStream) { let ws_stream = accept_async(stream).await.unwrap(); let (mut write, mut read) = ws_stream.split();
while let Some(msg) = read.next().await { let msg = msg.unwrap(); // Renvoyer le message write.send(msg).await.unwrap(); }} Ce code crée un serveur TCP sur le port 8080, accepte les connexions WebSocket et lance une tâche asynchrone pour chaque client qui renvoie en echo tous les messages entrants.
Création d'un client WebSocket en Rust
Écrivons maintenant un client qui se connecte à notre serveur, envoie un message et reçoit une réponse.
use futures_util::StreamExt;use tokio_tungstenite::connect_async;
#[tokio::main]async fn main() -> Result<(), Box> { let url = "ws://127.0.0.1:8080"; let (ws_stream, _) = connect_async(url).await?;
println!("Connecté au serveur");
let (mut write, mut read) = ws_stream.split();
// Envoyer un message write.send("Bonjour, WebSocket!".into()).await?;
// Recevoir la réponse if let Some(msg) = read.next().await { let msg = msg?; println!("Reçu : {}", msg.to_text().unwrap()); }
Ok(())} Chat en temps réel avec actix-web
Maintenant, cr