Tokio WebSocket Server
A robust, asynchronous WebSocket server implementation built on Tokio, with support for both secure (WSS) and plain (WS) connections.

Features
- 🔒 TLS Support - Seamlessly handle both secure (WSS) and plain (WS) connections
- 🚀 Fully Asynchronous - Built on Tokio for high performance
- 🔌 Simple API - Easy to integrate into your Rust applications
- 📨 Message Routing - Send messages to specific clients or broadcast to all
- 🛡️ Connection Management - Automatically track client connections and handle disconnects
- 💬 Multiple Message Types - Support for text, binary, ping/pong, and close messages
Installation
Add this to your Cargo.toml:
[dependencies]
tokio_websocket_server = "0.1.0"
Quick Start
use tokio_websocket_server::{WebSocketMessage, WebsocketServer};
#[tokio::main]
async fn main() {
let ws_server = WebsocketServer::new("127.0.0.1".to_string(), "8080".to_string(), None, None);
let ws_sender = ws_server.clone();
let mut message_receiver = ws_server.start().await;
while let Some((client_id, message)) = message_receiver.recv().await {
match message {
WebSocketMessage::Text(text) => {
println!("Received from {}: {}", client_id, text);
let response = WebSocketMessage::Text(format!("Echo: {}", text));
ws_sender.send_to_client(client_id, response).await.unwrap();
},
_ => {}
}
}
}
Secure WebSocket Example (WSS)
use tokio_websocket_server::{WebSocketMessage, WebsocketServer};
#[tokio::main]
async fn main() {
let ws_server = WebsocketServer::new(
"127.0.0.1".to_string(),
"8443".to_string(),
Some("path/to/cert.pem".to_string()),
Some("path/to/key.pem".to_string())
);
let mut message_receiver = ws_server.start().await;
}
Broadcasting Messages
ws_server.broadcast(WebSocketMessage::Text("Server announcement!".to_string())).await.unwrap();
Complete Example
Here's a more complete example showing how to handle different message types:
use tokio_websocket_server::{WebSocketMessage, WebsocketServer};
use tracing::{info, error};
#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
let ws_server = WebsocketServer::new("0.0.0.0".to_string(), "5000".to_string(), None, None);
let ws_server_clone = ws_server.clone();
let mut receiver = ws_server.start().await;
tokio::spawn(async move {
while let Some((client_id, message)) = receiver.recv().await {
match message {
WebSocketMessage::Text(text) => {
info!("Received text message from {}: {}", client_id, text);
if text == "list_clients" {
let clients = ws_server_clone.get_clients().await;
let response = WebSocketMessage::Text(format!("Connected clients: {:?}", clients));
ws_server_clone.send_to_client(client_id, response).await.unwrap();
} else {
let response = WebSocketMessage::Text(format!("Echo: {}", text));
ws_server_clone.send_to_client(client_id, response).await.unwrap();
}
},
WebSocketMessage::Binary(data) => {
info!("Received binary message from {}: {} bytes", client_id, data.len());
let response = WebSocketMessage::Binary(data);
ws_server_clone.send_to_client(client_id, response).await.unwrap();
},
WebSocketMessage::Close(_) => {
info!("Client {} requested to close connection", client_id);
},
_ => {}
}
}
});
loop {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
}
}
Client Example (JavaScript)
Here's how to connect to your WebSocket server from a web browser:
const ws = new WebSocket('ws://localhost:5000');
ws.onopen = () => {
console.log('Connected to WebSocket server');
ws.send('Hello from browser!');
};
ws.onmessage = (event) => {
console.log('Received:', event.data);
};
ws.onclose = () => {
console.log('Disconnected from WebSocket server');
};
function sendMessage() {
ws.send('Test message');
}
API Reference
WebsocketServer
pub fn new(ip_address: String, port: String, cert_path: Option<String>, key_path: Option<String>) -> Self
pub async fn start(&self) -> Receiver<(String, WebSocketMessage)>
pub async fn send_to_client(&self, client_id: String, message: WebSocketMessage) -> Result<(), String>
pub async fn broadcast(&self, message: WebSocketMessage) -> Result<(), String>
pub async fn get_clients(&self) -> Vec<String>
WebSocketMessage
pub enum WebSocketMessage {
Text(String),
Binary(Vec<u8>),
Ping(Vec<u8>),
Pong(Vec<u8>),
Close(Option<(u16, String)>),
}
License
This project is licensed under the MIT License - see the LICENSE file for details.