Skip to content

Instantly share code, notes, and snippets.

@OliverBrotchie
Last active August 12, 2022 21:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OliverBrotchie/811ad1caa672c26a813ebee6c85c9d17 to your computer and use it in GitHub Desktop.
Save OliverBrotchie/811ad1caa672c26a813ebee6c85c9d17 to your computer and use it in GitHub Desktop.
Super simple chat server.
[package]
name = "chat-server"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
tokio = { version = "1.20.1", features = ["full"] }
use tokio::{
io::{AsyncBufReadExt, AsyncWriteExt, BufReader},
net::TcpListener,
sync::broadcast,
};
const PORT: i32 = 8080;
#[tokio::main]
async fn main() {
let listener = TcpListener::bind(format!("localhost:{}", PORT))
.await
.expect("Port was occupied!");
println!("Running chat server on port: {} 🚀", PORT);
let (sender, _) = broadcast::channel(20);
loop {
let (mut socket, addr) = listener
.accept()
.await
.expect("Could not accept new incomming connection.");
let sender = sender.clone();
let mut reciever = sender.subscribe();
tokio::spawn(async move {
let (read_half, mut writer) = socket.split();
let mut reader = BufReader::new(read_half);
let mut line = String::new();
loop {
tokio::select! {
result = reader.read_line(&mut line) => {
if let Ok(0) = result {
break;
}
sender.send((line.clone(), addr)).unwrap();
line.clear();
}
result = reciever.recv() => {
let (msg, new_addr) = result.unwrap();
if addr != new_addr {
writer.write_all(msg.as_bytes()).await.unwrap();
}
}
}
}
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment