用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();
}

代码说明:

  1. 主要组件:

    • TcpListener:监听TCP连接
    • 多线程处理并发请求
    • 简单的HTTP请求解析
  2. 功能特性:

    • 响应根路径 / 返回 “Hello, World!”
    • 响应 /sleep 路径模拟慢请求(5秒延迟)
    • 其他路径返回404错误
    • 基本的HTTP响应格式
  3. 运行方式:

    cargo run
    

    然后在浏览器访问 http://127.0.0.1:8080

  4. 注意事项:

    • 这是最简单的实现,生产环境应考虑使用成熟的Web框架
    • 当前实现没有错误处理和连接管理
    • 线程池版本会更高效(避免频繁创建线程)

这个示例展示了Rust处理网络请求的基本模式,实际项目中推荐使用hyperactix-webwarp等成熟的Web框架。

回到顶部