use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use std::thread;
use tokio_tungstenite::tungstenite::accept;
fn handle_client(mut stream: TcpStream) -> std::io::Result<()> {
// Buffer for reading the initial HTTP request
let mut buffer = [0; 1024];
let bytes_read = stream.read(&mut buffer)?;
// Parse the request
let request = String::from_utf8_lossy(&buffer[..bytes_read]);
println!("{}", request);
// Decide how to handle the request
if request.contains("Upgrade: websocket") && request.contains("/ws") {
// WebSocket handshake
let mut billionaire = accept(stream).unwrap();
let b = billionaire.read().unwrap();
println!("{}", b.into_text().unwrap());
billionaire.send("billionairegreathari".into());
} else if request.starts_with("GET /api/hello") {
// REST response
let response = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"message\":\"Hello from REST!\"}";
stream.write_all(response.as_bytes())?;
stream.flush()?;
} else {
// 404 for unknown paths
let response = "HTTP/1.1 404 Not Found\r\n\r\n";
stream.write_all(response.as_bytes())?;
stream.flush()?;
}
Ok(())
}
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:7878")?;
println!("Server running on 127.0.0.1:8080");
for stream in listener.incoming() {
match stream {
Ok(stream) => {
thread::spawn(|| {
if let Err(e) = handle_client(stream) {
eprintln!("Error handling client: {}", e);
}
});
}
Err(e) => eprintln!("Connection failed: {}", e),
}
}
Ok(())
}
GET /ws HTTP/1.1
Host: 127.0.0.1:7878
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Upgrade: websocket
Origin: http://127.0.0.1:5500
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9,fr;q=0.8
Sec-WebSocket-Key: 1/HweSLvG0GyXBG5tAAaMQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
let billionaire = new WebSocket("ws://127.0.0.1:7878/ws");
billionaire.onopen = () => {
console.log("opening");
billionaire.send("billionairegreathari");
};
billionaire.onmessage = (e) => {
console.log(e);
};