use tokio::spawn as go;
use tokio::io::BufReader;
use tokio::io::AsyncBufReadExt;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpListener;
use tokio::net::TcpStream;
#[tokio::main]
async fn main(){
let ln = TcpListener::bind("0.0.0.0:8080").await.unwrap();
println!("listening on {:?}", ln.local_addr().unwrap());
for client_id in 0.. {
if let Ok((stream, addr)) = ln.accept().await {
println!("client[{}] connected from {:?}", client_id, addr);
go(echo(stream, client_id));
}
}
}
async fn echo(stream : TcpStream, client_id: u32){
let (rd, mut wr) = stream.into_split();
let mut scanner = BufReader::new(rd).lines();
loop {
let line = scanner.next_line().await;
match line {
Ok(Some(line)) => {
if let Err(e) = wr.write_all(format!("{}\n", line).as_bytes()).await {
println!("client[{}] disconnected: write: {}", client_id, e);
break;
};
println!("client[{}]: {}", client_id, line);
},
Err(e) => {
println!("client[{}] disconnected: read: {:?}", client_id, e);
break;
},
Ok(None) => {
println!("client[{}] disconnected: read: EOF", client_id);
break;
},
};
}
}