异步web服务器
use std::fs;
use async_std::net::TcpListener;
use async_std::net::TcpStream;
use futures::StreamExt;
use async_std::prelude::*;
use async_std::task::spawn;
#[async_std::main]
async fn main() {
let listener = TcpListener::bind("127.0.0.1:7878").await.unwrap();
listener.incoming().for_each_concurrent(None, |tcp_stream| async move {
let tcp_stream = tcp_stream.unwrap();
spawn(handle_connection(tcp_stream));
}).await;
}
async fn handle_connection(mut stream: TcpStream) {
let mut buffer = [0; 1024];
stream.read(&mut buffer).await.unwrap();
let get = b"GET / HTTP/1.1\r\n";
// 处理HTTP协议头,若不符合则返回404和对应的`html`文件
let (status_line, filename) = if buffer.starts_with(get) {
("HTTP/1.1 200 OK\r\n\r\n", "hello.html")
} else {
("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html")
};
let contents = fs::read_to_string(filename).unwrap();
let response = format!("{status_line}{contents}");
stream.write_all(response.as_bytes()).await.unwrap();
stream.flush().await.unwrap();
}