From 80cb04fb71d46e5ccb9e67779c577cdc7250f6ff Mon Sep 17 00:00:00 2001 From: Ruidy Date: Wed, 1 Sep 2021 14:52:32 +0200 Subject: [PATCH] basic chat server --- src/main.rs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index cb009bf..eac84b6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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::(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(); } }); }