socket server with rust

This commit is contained in:
2025-03-06 00:33:08 +01:00
parent 553db4c8a6
commit 6b406c24d3
16 changed files with 2332 additions and 1476 deletions
+68
View File
@@ -0,0 +1,68 @@
pub mod assets;
pub mod io;
pub mod methods;
pub mod parser;
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use std::sync::Arc;
use std::thread;
use io::Database;
use methods::handle_request;
use mongodb::sync::Client;
const MONGO_URI: &str = "mongodb://admin:admin@localhost/";
fn main() -> std::io::Result<()> {
let client = Client::with_uri_str(MONGO_URI).unwrap();
let database = Arc::new(Database::new(&client));
let listener = TcpListener::bind("127.0.0.1:8080")?;
println!("Server listening on port 8080");
for stream in listener.incoming() {
match stream {
Ok(stream) => {
println!("New connection: {}", stream.peer_addr().unwrap());
thread::spawn({
let database = Arc::clone(&database);
move || handle_client(stream, database)
});
}
Err(e) => eprintln!("Connection failed: {}", e),
}
}
Ok(())
}
pub fn handle_client(mut stream: TcpStream, database: Arc<Database>) {
let mut buffer = [0; 512];
loop {
match stream.read(&mut buffer) {
Ok(0) => break,
Ok(n) => {
let recv = String::from_utf8_lossy(&buffer[..n]).to_string();
match parser::parse(&recv) {
Ok((method, params)) => {
match handle_request(Arc::clone(&database), method, params) {
Ok(response) => {
stream.write_all(response.to_string().as_bytes()).unwrap()
}
Err(e) => eprintln!("Error handling request: {}", e),
}
}
Err(e) => eprintln!("Error parsing request: {}", e),
};
}
Err(e) => {
eprintln!("Error reading from client: {}", e);
break;
}
}
}
println!("Client disconnected");
}