basic chat server

This commit is contained in:
Ruidy 2021-09-01 14:52:32 +02:00
parent 870450c0e1
commit 80cb04fb71

View file

@ -1,12 +1,17 @@
use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
use tokio::net::TcpListener;
use tokio::sync::broadcast;
#[tokio::main]
async fn main() {
let listener = TcpListener::bind("localhost:8080").await.unwrap();
let (tx, _) = broadcast::channel::<String>(10);
loop {
let (mut socket, _addr) = listener.accept().await.unwrap();
let (mut socket, _) = listener.accept().await.unwrap();
let tx = tx.clone();
let mut rx = tx.subscribe();
tokio::spawn(async move {
let (reader, mut writer) = socket.split();
@ -15,12 +20,19 @@ async fn main() {
let mut line = String::new();
loop {
let bytes_read = reader.read_line(&mut line).await.unwrap();
if bytes_read == 0 {
break;
tokio::select! {
result = reader.read_line(&mut line) =>{
if result.unwrap() == 0 {
break;
}
tx.send(line.clone()).unwrap();
line.clear();
}
result = rx.recv() =>{
let message = result.unwrap();
writer.write_all(&message.as_bytes()).await.unwrap();
}
}
writer.write_all(&line.as_bytes()).await.unwrap();
line.clear();
}
});
}