用Rust实现一个简单的Web服务器实例
想用Rust实现一个简单的Web服务器,但不知道如何开始。有没有完整的代码示例可以参考?需要处理基本的HTTP请求和响应,最好能支持静态文件服务。请问应该使用哪些crate(比如hyper还是actix-web)比较合适?能否提供一个最简单的实现步骤?
2 回复
使用Rust的actix-web库实现简单Web服务器:
use actix_web::{get, App, HttpResponse, HttpServer, Responder};
#[get("/")]
async fn hello() -> impl Responder {
HttpResponse::Ok().body("Hello World!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(hello)
})
.bind("127.0.0.1:8080")?
.run()
.await
}
在Cargo.toml中添加依赖:
[dependencies]
actix-web = "4.0"
运行后访问http://127.0.0.1:8080即可看到"Hello World!"。
我将用Rust实现一个简单的Web服务器,使用标准库的std::net模块来处理TCP连接。
use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};
use std::thread;
use std::time::Duration;
fn main() {
// 绑定到本地8080端口
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
println!("服务器运行在 http://127.0.0.1:8080");
// 处理传入的连接
for stream in listener.incoming() {
let stream = stream.unwrap();
// 为每个连接创建新线程
thread::spawn(|| {
handle_connection(stream);
});
}
}
fn handle_connection(mut stream: TcpStream) {
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let get = b"GET / HTTP/1.1\r\n";
let sleep = b"GET /sleep HTTP/1.1\r\n";
let (status_line, contents) = if buffer.starts_with(get) {
("HTTP/1.1 200 OK", "Hello, World!")
} else if buffer.starts_with(sleep) {
// 模拟慢请求
thread::sleep(Duration::from_secs(5));
("HTTP/1.1 200 OK", "Slept for 5 seconds")
} else {
("HTTP/1.1 404 NOT FOUND", "Page not found")
};
let response = format!(
"{}\r\nContent-Length: {}\r\n\r\n{}",
status_line,
contents.len(),
contents
);
stream.write(response.as_bytes()).unwrap();
stream.flush().unwrap();
}
代码说明:
-
主要组件:
TcpListener:监听TCP连接- 多线程处理并发请求
- 简单的HTTP请求解析
-
功能特性:
- 响应根路径
/返回 “Hello, World!” - 响应
/sleep路径模拟慢请求(5秒延迟) - 其他路径返回404错误
- 基本的HTTP响应格式
- 响应根路径
-
运行方式:
cargo run然后在浏览器访问
http://127.0.0.1:8080 -
注意事项:
- 这是最简单的实现,生产环境应考虑使用成熟的Web框架
- 当前实现没有错误处理和连接管理
- 线程池版本会更高效(避免频繁创建线程)
这个示例展示了Rust处理网络请求的基本模式,实际项目中推荐使用hyper、actix-web或warp等成熟的Web框架。

