Add initial server implementation

This adventure is going to be epic, be ready.
This commit is contained in:
2023-02-16 20:00:14 +01:00
parent 8943d1d898
commit 831a5003c3
6 changed files with 85 additions and 0 deletions

42
board-server/src/main.rs Normal file
View File

@@ -0,0 +1,42 @@
use anyhow::Result;
use futures::StreamExt;
use smol::Async;
use std::net::{SocketAddr, TcpListener, TcpStream};
use std::{env, io};
use tungstenite::Message as WebsocketMessage;
async fn handle_connection(raw_stream: Async<TcpStream>, addr: SocketAddr) -> Result<()> {
println!("[{addr}] Incoming TCP connection");
let mut ws_stream = async_tungstenite::accept_async(raw_stream).await?;
println!("[{addr}] WebSocket connection established");
while let Some(Ok(WebsocketMessage::Text(text))) = ws_stream.next().await {
println!("[{addr}] Received message: {text}");
}
println!("[{addr}] Dropping connection");
Ok(())
}
fn main() -> Result<(), io::Error> {
let addr = env::args()
.nth(1)
.unwrap_or_else(|| "0.0.0.0:8080".to_string())
.parse::<SocketAddr>()
.expect("Invalid address");
smol::block_on(async {
println!("Listening on: {addr}");
let listener = Async::<TcpListener>::bind(addr).expect("Could not create listener");
while let Ok((stream, addr)) = listener.accept().await {
smol::spawn(async move {
if let Err(e) = handle_connection(stream, addr).await {
eprintln!("Failed to handle connection from {addr}: {e}");
}
})
.detach();
}
});
Ok(())
}