From 002be6a430d92be930b0e2164f373672c8b7ae83 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Sat, 20 Sep 2025 17:33:26 +0800 Subject: change name --- src/server/main.rs | 2 +- src/server/server.rs | 9 -- src/server/server/tcpserver.rs | 2 - src/server/server/tcpserver/server.rs | 148 --------------------------------- src/server/server/tcpserver/tasks.rs | 20 ----- src/server/servers.rs | 9 ++ src/server/servers/tcpserver.rs | 2 + src/server/servers/tcpserver/server.rs | 148 +++++++++++++++++++++++++++++++++ src/server/servers/tcpserver/tasks.rs | 20 +++++ 9 files changed, 180 insertions(+), 180 deletions(-) delete mode 100644 src/server/server.rs delete mode 100644 src/server/server/tcpserver.rs delete mode 100644 src/server/server/tcpserver/server.rs delete mode 100644 src/server/server/tcpserver/tasks.rs create mode 100644 src/server/servers.rs create mode 100644 src/server/servers/tcpserver.rs create mode 100644 src/server/servers/tcpserver/server.rs create mode 100644 src/server/servers/tcpserver/tasks.rs diff --git a/src/server/main.rs b/src/server/main.rs index a8bbad8..74e88c2 100644 --- a/src/server/main.rs +++ b/src/server/main.rs @@ -1,4 +1,4 @@ -pub(crate) mod server; +pub(crate) mod servers; #[tokio::main] async fn main() { diff --git a/src/server/server.rs b/src/server/server.rs deleted file mode 100644 index fcc6e7f..0000000 --- a/src/server/server.rs +++ /dev/null @@ -1,9 +0,0 @@ -use remote_control_rs::tasks::Task; - -pub mod tcpserver; - -pub trait Server<'a> { - fn update(&mut self, task: Task); - - async fn listen(&mut self) -> !; -} diff --git a/src/server/server/tcpserver.rs b/src/server/server/tcpserver.rs deleted file mode 100644 index 1af118c..0000000 --- a/src/server/server/tcpserver.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod server; -pub mod tasks; diff --git a/src/server/server/tcpserver/server.rs b/src/server/server/tcpserver/server.rs deleted file mode 100644 index 3d735d9..0000000 --- a/src/server/server/tcpserver/server.rs +++ /dev/null @@ -1,148 +0,0 @@ -use std::{ - cell::RefCell, - net::SocketAddr, - sync::{Arc, Weak}, -}; - -use remote_control_rs::{client, tasks::Task}; -use tokio::{ - io::{self, AsyncReadExt}, - net::{TcpListener, TcpStream}, -}; - -use crate::server::{ - Server, - tcpserver::tasks::{Request, RequestType}, -}; - -use bincode::serde; - -struct TCPServer<'a> { - this: RefCell>, - task: Option, - listener: TcpListener, - clients: RefCell>>, -} - -impl<'a> TCPServer<'a> { - fn new(listener: TcpListener) -> Arc { - let s = Arc::new(Self { this: RefCell::new(Weak::new()), listener, task: None, clients: RefCell::new(Vec::new()) }); - *s.this.borrow_mut() = Arc::downgrade(&s); - s - } - - fn remove(&self, client: &Client<'a>) { - self.clients.borrow_mut().retain(|c| c != client); - } -} - -impl<'a> Server<'a> for TCPServer<'a> { - fn update(&mut self, task: Task) { - self.task = Some(task); - } - - async fn listen(&mut self) -> ! { - loop { - match self.listener.accept().await { - Ok((socket, addr)) => self.clients.borrow_mut().push(Client::new(self.this.borrow().upgrade().unwrap(), socket, addr)), // the unwrap shouldn't panics, self has to be alive - Err(e) => eprintln!("Failed to accept connection: {e}"), - }; - } - } -} - -struct Client<'a> { - server: Arc>, - stream: TcpStream, - addr: SocketAddr, - data: Option>, -} - -impl<'a> Client<'a> { - fn new(server: Arc>, stream: TcpStream, addr: SocketAddr) -> Self { - Self { server, stream, addr, data: None } - } - - fn handle_read(&mut self, buf: io::Result) -> bool { - match buf { - Ok(0) => self.server.remove(self), - Ok(_) => {} - Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => return false, - Err(e) => { - eprintln!("Failed to read from client: {e}"); - return false; - } - } - true - } - - // TODO: use framed - async fn read(&mut self) -> Option<(Vec, usize)> { - const usize: usize = std::mem::size_of::(); - let mut len = vec![0; usize]; // vec! only take usize - if !self.handle_read(self.stream.try_read(&mut len)) { - return None; - } - let len = usize::from_be_bytes(match len.try_into() { - Ok(n) => n, - Err(e) => { - eprintln!("Failed to convert length bytes to length usize: {:?}", e); - return None; - } - }); // TODO: move to a shared fn with client to ensure we use same endian - let mut buf = vec![0; len]; - let read = self.stream.read_exact(&mut buf).await; - if !self.handle_read(read) { - return None; - } - Some((buf, len)) - } - - async fn poll(&mut self) -> ! { - loop { - if let Err(e) = self.stream.readable().await { - eprintln!("Failed waiting for client to be readable: {e}"); - continue; - } - if let Some((buf, len)) = self.read().await { - let req: RequestType = match serde::decode_from_slice(buf.as_slice(), bincode::config::standard()) { - Ok((decoded, size)) => { - if size != len { - eprintln!("Decoded size {size} does not match expected size {len}, decode succeeded anyways?"); - } - decoded - } - Err(e) => { - eprintln!("Failed to decode request from client {}: {e}", self.addr); - continue; - } - }; - match req { - // TODO: seperate send and respond - RequestType::Send(req) => match req { - Request::Get(req) => { - todo!() - } - Request::Post(req) => { - todo!() - } - }, - RequestType::Respond(res) => match res { - Request::Get(req) => { - todo!() - } - Request::Post(req) => { - todo!() - } - }, - } - } - } - } -} - -impl<'a> PartialEq for Client<'a> { - fn eq(&self, other: &Self) -> bool { - self.data == other.data - } -} diff --git a/src/server/server/tcpserver/tasks.rs b/src/server/server/tcpserver/tasks.rs deleted file mode 100644 index 23e6f9e..0000000 --- a/src/server/server/tcpserver/tasks.rs +++ /dev/null @@ -1,20 +0,0 @@ -use remote_control_rs::tasks::{CompletedTask, Name}; -use serde::Deserialize; - -#[derive(Deserialize)] -pub enum RequestType { - Send(Request), - Respond(Request), -} - -#[derive(Deserialize)] -pub enum Request { - Get(TaskType), - Post(TaskType), -} - -#[derive(Deserialize)] -pub enum TaskType { - Completed(CompletedTask), - Pending(Name), -} diff --git a/src/server/servers.rs b/src/server/servers.rs new file mode 100644 index 0000000..fcc6e7f --- /dev/null +++ b/src/server/servers.rs @@ -0,0 +1,9 @@ +use remote_control_rs::tasks::Task; + +pub mod tcpserver; + +pub trait Server<'a> { + fn update(&mut self, task: Task); + + async fn listen(&mut self) -> !; +} diff --git a/src/server/servers/tcpserver.rs b/src/server/servers/tcpserver.rs new file mode 100644 index 0000000..1af118c --- /dev/null +++ b/src/server/servers/tcpserver.rs @@ -0,0 +1,2 @@ +pub mod server; +pub mod tasks; diff --git a/src/server/servers/tcpserver/server.rs b/src/server/servers/tcpserver/server.rs new file mode 100644 index 0000000..198fd6f --- /dev/null +++ b/src/server/servers/tcpserver/server.rs @@ -0,0 +1,148 @@ +use std::{ + cell::RefCell, + net::SocketAddr, + sync::{Arc, Weak}, +}; + +use remote_control_rs::{client, tasks::Task}; +use tokio::{ + io::{self, AsyncReadExt}, + net::{TcpListener, TcpStream}, +}; + +use crate::servers::{ + Server, + tcpserver::tasks::{Request, RequestType}, +}; + +use bincode::serde; + +struct TCPServer<'a> { + this: RefCell>, + task: Option, + listener: TcpListener, + clients: RefCell>>, +} + +impl<'a> TCPServer<'a> { + fn new(listener: TcpListener) -> Arc { + let s = Arc::new(Self { this: RefCell::new(Weak::new()), listener, task: None, clients: RefCell::new(Vec::new()) }); + *s.this.borrow_mut() = Arc::downgrade(&s); + s + } + + fn remove(&self, client: &Client<'a>) { + self.clients.borrow_mut().retain(|c| c != client); + } +} + +impl<'a> Server<'a> for TCPServer<'a> { + fn update(&mut self, task: Task) { + self.task = Some(task); + } + + async fn listen(&mut self) -> ! { + loop { + match self.listener.accept().await { + Ok((socket, addr)) => self.clients.borrow_mut().push(Client::new(self.this.borrow().upgrade().unwrap(), socket, addr)), // the unwrap shouldn't panics, self has to be alive + Err(e) => eprintln!("Failed to accept connection: {e}"), + }; + } + } +} + +struct Client<'a> { + server: Arc>, + stream: TcpStream, + addr: SocketAddr, + data: Option>, +} + +impl<'a> Client<'a> { + fn new(server: Arc>, stream: TcpStream, addr: SocketAddr) -> Self { + Self { server, stream, addr, data: None } + } + + fn handle_read(&mut self, buf: io::Result) -> bool { + match buf { + Ok(0) => self.server.remove(self), + Ok(_) => {} + Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => return false, + Err(e) => { + eprintln!("Failed to read from client: {e}"); + return false; + } + } + true + } + + // TODO: use framed + async fn read(&mut self) -> Option<(Vec, usize)> { + const usize: usize = std::mem::size_of::(); + let mut len = vec![0; usize]; // vec! only take usize + if !self.handle_read(self.stream.try_read(&mut len)) { + return None; + } + let len = usize::from_be_bytes(match len.try_into() { + Ok(n) => n, + Err(e) => { + eprintln!("Failed to convert length bytes to length usize: {:?}", e); + return None; + } + }); // TODO: move to a shared fn with client to ensure we use same endian + let mut buf = vec![0; len]; + let read = self.stream.read_exact(&mut buf).await; + if !self.handle_read(read) { + return None; + } + Some((buf, len)) + } + + async fn poll(&mut self) -> ! { + loop { + if let Err(e) = self.stream.readable().await { + eprintln!("Failed waiting for client to be readable: {e}"); + continue; + } + if let Some((buf, len)) = self.read().await { + let req: RequestType = match serde::decode_from_slice(buf.as_slice(), bincode::config::standard()) { + Ok((decoded, size)) => { + if size != len { + eprintln!("Decoded size {size} does not match expected size {len}, decode succeeded anyways?"); + } + decoded + } + Err(e) => { + eprintln!("Failed to decode request from client {}: {e}", self.addr); + continue; + } + }; + match req { + // TODO: seperate send and respond + RequestType::Send(req) => match req { + Request::Get(req) => { + todo!() + } + Request::Post(req) => { + todo!() + } + }, + RequestType::Respond(res) => match res { + Request::Get(req) => { + todo!() + } + Request::Post(req) => { + todo!() + } + }, + } + } + } + } +} + +impl<'a> PartialEq for Client<'a> { + fn eq(&self, other: &Self) -> bool { + self.data == other.data + } +} diff --git a/src/server/servers/tcpserver/tasks.rs b/src/server/servers/tcpserver/tasks.rs new file mode 100644 index 0000000..23e6f9e --- /dev/null +++ b/src/server/servers/tcpserver/tasks.rs @@ -0,0 +1,20 @@ +use remote_control_rs::tasks::{CompletedTask, Name}; +use serde::Deserialize; + +#[derive(Deserialize)] +pub enum RequestType { + Send(Request), + Respond(Request), +} + +#[derive(Deserialize)] +pub enum Request { + Get(TaskType), + Post(TaskType), +} + +#[derive(Deserialize)] +pub enum TaskType { + Completed(CompletedTask), + Pending(Name), +} -- cgit v1.2.3