refactor: decompose connection logic into a separate file

This commit is contained in:
Stanislav N Mikhailov
2026-07-17 19:53:37 +03:00
parent af507127bf
commit e4e0bf33f0
3 changed files with 80 additions and 71 deletions
+72
View File
@@ -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?;
}
}
}
+8 -71
View File
@@ -1,12 +1,15 @@
use std::io; mod connection;
use std::net::SocketAddr; mod protocol;
use std::sync::atomic::{AtomicU64, Ordering};
use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::{TcpListener};
use tokio::net::{TcpListener, TcpStream}; use tokio::io;
use std::sync::atomic::{AtomicU64, Ordering};
use local_ip_address::local_ip; use local_ip_address::local_ip;
use std::net::{IpAddr, Ipv4Addr}; use std::net::{IpAddr, Ipv4Addr};
use connection::Connection;
static NEXT_CONNECTION_ID: AtomicU64 = AtomicU64::new(1); static NEXT_CONNECTION_ID: AtomicU64 = AtomicU64::new(1);
#[tokio::main] #[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?;
}
}
}
View File