refactor: decompose connection logic into a separate file
This commit is contained in:
@@ -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
@@ -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?;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user