From e4e0bf33f08632d0dff1fefa219dee38fb9dab5f Mon Sep 17 00:00:00 2001 From: Stanislav N Mikhailov Date: Fri, 17 Jul 2026 19:53:37 +0300 Subject: [PATCH] refactor: decompose connection logic into a separate file --- src/connection.rs | 72 ++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 79 +++++------------------------------------------ src/protocol.rs | 0 3 files changed, 80 insertions(+), 71 deletions(-) create mode 100644 src/connection.rs create mode 100644 src/protocol.rs diff --git a/src/connection.rs b/src/connection.rs new file mode 100644 index 0000000..fb302e5 --- /dev/null +++ b/src/connection.rs @@ -0,0 +1,72 @@ +use std::net::SocketAddr; + +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::{TcpStream}; +use std::io; + +pub struct Connection { + id: u64, + client_addr: SocketAddr, + stream: TcpStream, + message_count: u64, +} + +impl Connection { + pub fn new( + id: u64, + client_addr: SocketAddr, + stream: TcpStream, + ) -> Self { + Self { + id, + client_addr, + stream, + message_count: 0, + } + } + + pub async fn run(mut self) -> io::Result<()> { + println!( + "Обработчик {} создан для {}", + self.id, + self.client_addr + ); + + let mut buffer = [0_u8; 1024]; + + loop { + let bytes_read = self.stream.read(&mut buffer).await?; + + if bytes_read == 0 { + println!( + "Обработчик {}: клиент {} отключился", + self.id, + self.client_addr + ); + + return Ok(()); + } + + self.message_count += 1; + + let received = + String::from_utf8_lossy(&buffer[..bytes_read]); + + println!( + "Обработчик {}: сообщение №{}: {:?}", + self.id, + self.message_count, + received + ); + + let response = format!( + "Обработчик {}: сообщение №{}: {}\n", + self.id, + self.message_count, + received + ); + + self.stream.write_all(response.as_bytes()).await?; + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 88739b9..a1f85df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,15 @@ -use std::io; -use std::net::SocketAddr; -use std::sync::atomic::{AtomicU64, Ordering}; +mod connection; +mod protocol; -use tokio::io::{AsyncReadExt, AsyncWriteExt}; -use tokio::net::{TcpListener, TcpStream}; +use tokio::net::{TcpListener}; +use tokio::io; +use std::sync::atomic::{AtomicU64, Ordering}; use local_ip_address::local_ip; use std::net::{IpAddr, Ipv4Addr}; + +use connection::Connection; + static NEXT_CONNECTION_ID: AtomicU64 = AtomicU64::new(1); #[tokio::main] @@ -38,69 +41,3 @@ async fn main() -> io::Result<()> { } } -struct Connection { - id: u64, - client_addr: SocketAddr, - stream: TcpStream, - message_count: u64, -} - -impl Connection { - fn new( - id: u64, - client_addr: SocketAddr, - stream: TcpStream, - ) -> Self { - Self { - id, - client_addr, - stream, - message_count: 0, - } - } - - async fn run(mut self) -> io::Result<()> { - println!( - "Обработчик {} создан для {}", - self.id, - self.client_addr - ); - - let mut buffer = [0_u8; 1024]; - - loop { - let bytes_read = self.stream.read(&mut buffer).await?; - - if bytes_read == 0 { - println!( - "Обработчик {}: клиент {} отключился", - self.id, - self.client_addr - ); - - return Ok(()); - } - - self.message_count += 1; - - let received = - String::from_utf8_lossy(&buffer[..bytes_read]); - - println!( - "Обработчик {}: сообщение №{}: {:?}", - self.id, - self.message_count, - received - ); - - let response = format!( - "Обработчик {}: сообщение №{}: {}\n", - self.id, - self.message_count, - received - ); - - self.stream.write_all(response.as_bytes()).await?; - } - } -} \ No newline at end of file diff --git a/src/protocol.rs b/src/protocol.rs new file mode 100644 index 0000000..e69de29