WebSocket en Rust: aplicaciones en tiempo real de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a WebSocket en Rust: por qué es la elección de los profesionales



Las aplicaciones web modernas requieren transmisión instantánea de datos. Ya sea un chat en línea, un terminal bursátil, un juego multijugador o un sistema de monitoreo — el protocolo WebSocket se ha convertido en el estándar para la comunicación en tiempo real. Rust, con su énfasis en rendimiento y seguridad de memoria, es la plataforma ideal para crear tales sistemas.



En este artículo analizaremos la creación de aplicaciones WebSocket en Rust desde cero. Aprenderá cómo funcionan las bibliotecas principales, cómo manejar múltiples conexiones y cómo construir sistemas escalables en tiempo real. El material está dirigido a desarrolladores familiarizados con los fundamentos de Rust y la programación asíncrona.



1. Fundamentos de WebSocket en Rust: eligiendo una biblioteca



El ecosistema de Rust ofrece varias soluciones maduras para trabajar con WebSocket. Las más populares:



  • tokio-tungstenite — WebSocket asíncrono basado en tokio, de bajo nivel y flexible
  • warp — framework web con soporte integrado para WebSocket
  • actix-web — potente framework con soporte para WebSocket


Para nuestra guía elegiremos tokio-tungstenite como la solución más versátil.



Instalación de dependencias



Cree un nuevo proyecto y agregue a Cargo.toml:



[dependencies]tokio = { version = "1", features = ["full"] }tokio-tungstenite = "0.21"futures-util = "0.3"serde = { version = "1", features = ["derive"] }serde_json = "1"


Servidor WebSocket básico



Escribamos un servidor eco simple que devuelva el mensaje recibido:



use futures_util::{SinkExt, StreamExt};use tokio::net::TcpListener;use tokio_tungstenite::accept_async;use tokio_tungstenite::tungstenite::Message;

#[tokio::main]async fn main() { let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap(); println!("Servidor iniciado en ws://127.0.0.1:8080");

while let Ok((stream, addr)) = listener.accept().await { println!("Nueva conexión: {}", addr); tokio::spawn(handle_connection(stream)); }}

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(Ok(msg)) = read.next().await { if let Message::Text(text) = msg { println!("Recibido: {}", text); let response = format!("Eco: {}", text); write.send(Message::Text(response.into())).await.unwrap(); } }}


Este código demuestra la estructura básica: un servidor TCP asíncrono, aceptación de conexiones WebSocket y procesamiento de mensajes en tareas separadas.



2. Arquitectura de un chat en tiempo real en Rust



Ahora construyamos un chat completo donde los mensajes de un cliente se envían a todos los usuarios conectados. Para esto necesitamos un estado compartido — una lista de conexiones activas.



Implementación con estado compartido



use std::collections::HashMap;use std::sync::Arc;use tokio::sync::{Mutex, broadcast};

type Tx = broadcast::Sender<String>;type Clients = Arc<Mutex<HashMap<String, Tx>>>;

#[tokio::main]async fn main() { let clients: Clients = Arc::new(Mutex::new(HashMap::new())); let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap();

while let Ok((stream, addr)) = listener.accept().await { let clients = clients.clone(); tokio::spawn(handle_client(stream, addr, clients)); }}

async fn handle_client( stream: tokio::net::TcpStream, addr: std::net::SocketAddr, clients: Clients) { let ws_stream = accept_async(stream).await.unwrap(); let (mut write, mut read) = ws_stream.split();

// Creamos un canal para difusión

Blogs

Book Recommendations