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;
|
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?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user