WebSocket RS Documentation
Welcome to the WebSocket RS documentation. This guide will help you get started with building real-time applications using our high-performance WebSocket server written in Rust.
๐ฆ Installation
Add WebSocket RS to your Cargo.toml:
Cargo.toml
[dependencies]
websocket-rs = "0.1.0"
tokio = { version = "1.0", features = ["full"] }
Or install using Cargo:
Terminal
cargo add websocket-rs
cargo add tokio --features full
๐ Quick Start
Here's a simple example to get you started:
main.rs
use websocket_rs::{WebSocketServer, Message};
#[tokio::main]
async fn main() -> Result<(), Box> {
// Create server instance
let mut server = WebSocketServer::new("127.0.0.1:8080");
println!("WebSocket server running on ws://127.0.0.1:8080");
// Start the server
server.start(|client_id, message| {
println!("Client {}: {}", client_id, message);
// Echo the message back
Message::Text(format!("Echo: {}", message))
}).await?;
Ok(())
}
โ๏ธ Server Setup
Basic Server
Create a basic WebSocket server:
Rust
use websocket_rs::WebSocketServer;
let server = WebSocketServer::new("0.0.0.0:8080");
// Server is now ready to accept connections
Server with Configuration
Rust
use websocket_rs::{WebSocketServer, Config};
let config = Config {
max_connections: 1000,
ping_interval: Duration::from_secs(30),
timeout: Duration::from_secs(60),
};
let server = WebSocketServer::with_config("0.0.0.0:8080", config);
๐ Client Connection
JavaScript Client
JavaScript
// Create WebSocket connection
const ws = new WebSocket('ws://localhost:8080');
// Connection opened
ws.addEventListener('open', (event) => {
console.log('Connected to server');
ws.send('Hello Server!');
});
// Listen for messages
ws.addEventListener('message', (event) => {
console.log('Message from server:', event.data);
});
// Connection closed
ws.addEventListener('close', (event) => {
console.log('Disconnected from server');
});
// Handle errors
ws.addEventListener('error', (error) => {
console.error('WebSocket error:', error);
});
Rust Client
Rust
use websocket_rs::WebSocketClient;
#[tokio::main]
async fn main() -> Result<(), Box> {
let client = WebSocketClient::connect("ws://localhost:8080").await?;
// Send a message
client.send("Hello Server!").await?;
// Receive messages
while let Some(msg) = client.receive().await? {
println!("Received: {}", msg);
}
Ok(())
}
๐จ Message Handling
Text Messages
Rust
server.on_message(|client_id, message| {
match message {
Message::Text(text) => {
println!("Text from {}: {}", client_id, text);
// Process text message
},
Message::Binary(data) => {
println!("Binary data from {}: {} bytes", client_id, data.len());
// Process binary data
},
_ => {}
}
});
JSON Messages
Rust
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct ChatMessage {
user: String,
content: String,
timestamp: u64,
}
server.on_message(|client_id, message| {
if let Message::Text(text) = message {
if let Ok(chat_msg) = serde_json::from_str::(&text) {
println!("{} says: {}", chat_msg.user, chat_msg.content);
}
}
});
๐ก Broadcasting
Broadcast to All Clients
Rust
// Broadcast a message to all connected clients
server.broadcast("Server announcement!").await?;
Broadcast to Specific Clients
Rust
// Send to specific client
server.send_to(client_id, "Private message").await?;
// Send to multiple clients
let client_ids = vec![1, 2, 3];
server.broadcast_to(client_ids, "Group message").await?;
Chat Room Example
Rust
use std::collections::HashMap;
let mut rooms: HashMap> = HashMap::new();
server.on_message(move |client_id, message| {
if let Message::Text(text) = message {
// Parse command
if text.starts_with("/join ") {
let room = text[6..].to_string();
rooms.entry(room.clone())
.or_insert_with(Vec::new)
.push(client_id);
} else {
// Broadcast to room members
if let Some(room_members) = rooms.get(¤t_room) {
server.broadcast_to(room_members.clone(), text).await?;
}
}
}
});
โ ๏ธ Error Handling
Rust
server.on_error(|client_id, error| {
eprintln!("Error with client {}: {}", client_id, error);
});
server.on_close(|client_id| {
println!("Client {} disconnected", client_id);
});
๐ Advanced Topics
Custom Message Protocol
Rust
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
enum CustomMessage {
Join { username: String },
Leave { username: String },
Chat { user: String, message: String },
Typing { user: String },
}
server.on_message(|client_id, message| {
if let Message::Text(text) = message {
match serde_json::from_str::(&text) {
Ok(custom_msg) => match custom_msg {
CustomMessage::Join { username } => {
println!("{} joined", username);
},
CustomMessage::Chat { user, message } => {
server.broadcast(format!("{}: {}", user, message)).await?;
},
_ => {}
},
Err(e) => eprintln!("Failed to parse message: {}", e),
}
}
});
Connection Authentication
Rust
server.on_connect(|client_id, request| {
// Verify token from query parameter
if let Some(token) = request.query("token") {
if verify_token(token) {
println!("Client {} authenticated", client_id);
return Ok(());
}
}
Err("Unauthorized")
});
Rate Limiting
Rust
use std::collections::HashMap;
use std::time::{Duration, Instant};
struct RateLimiter {
limits: HashMap,
max_per_minute: u32,
}
impl RateLimiter {
fn check(&mut self, client_id: usize) -> bool {
let now = Instant::now();
let entry = self.limits.entry(client_id)
.or_insert((0, now));
if now.duration_since(entry.1) > Duration::from_secs(60) {
entry.0 = 1;
entry.1 = now;
true
} else if entry.0 < self.max_per_minute {
entry.0 += 1;
true
} else {
false
}
}
}
๐ก Examples
Simple Echo Server
A basic server that echoes back all messages
Rust
use websocket_rs::WebSocketServer;
#[tokio::main]
async fn main() -> Result<(), Box> {
let mut server = WebSocketServer::new("127.0.0.1:8080");
server.start(|_, message| {
Message::Text(format!("Echo: {}", message))
}).await?;
Ok(())
}
Chat Server
A complete chat server with rooms and user management
Rust
// See full example in examples/chat-server.rs
Real-time Dashboard
Stream live data updates to connected clients
Rust
// See full example in examples/dashboard.rs