Created
April 26, 2022 20:10
-
-
Save arjunsk/28a6f02aca7cd53564ab1ac11649c4c7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![warn(rust_2018_idioms)] | |
use tokio::io::{AsyncReadExt, AsyncWriteExt}; | |
use tokio::net::TcpListener; | |
use std::env; | |
use std::error::Error; | |
#[tokio::main] | |
async fn main() -> Result<(), Box<dyn Error>> { | |
// Allow passing an address to listen on as the first argument of this | |
// program, but otherwise we'll just set up our TCP listener on | |
// 127.0.0.1:8080 for connections. | |
let addr = env::args() | |
.nth(1) | |
.unwrap_or_else(|| "127.0.0.1:8080".to_string()); | |
// Next up we create a TCP listener which will listen for incoming | |
// connections. This TCP listener is bound to the address we determined | |
// above and must be associated with an event loop. | |
let listener = TcpListener::bind(&addr).await?; | |
println!("Listening on: {}", addr); | |
loop { | |
// Asynchronously wait for an inbound socket. | |
let (mut socket, _) = listener.accept().await?; | |
// And this is where much of the magic of this server happens. We | |
// crucially want all clients to make progress concurrently, rather than | |
// blocking one on completion of another. To achieve this we use the | |
// `tokio::spawn` function to execute the work in the background. | |
// | |
// Essentially here we're executing a new task to run concurrently, | |
// which will allow all of our clients to be processed concurrently. | |
tokio::spawn(async move { | |
let mut buf = vec![0; 1024]; | |
// In a loop, read data from the socket and write the data back. | |
loop { | |
let n = socket | |
.read(&mut buf) | |
.await | |
.expect("failed to read data from socket"); | |
if n == 0 { | |
return; | |
} | |
socket | |
.write_all(&buf[0..n]) | |
.await | |
.expect("failed to write data to socket"); | |
} | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment