当前位置: 首页 > backend >正文

十七、单线程 Web 服务器

本文将详细介绍如何使用 Rust 开发功能完善的单线程 Web 服务器。

1. 创建项目

cargo new single-threaded-web
cd single-threaded-web

2. 项目结构

single-threaded-web/
├── Cargo.toml
├── src/
│   ├── main.rs      # 服务器入口
│   ├── lib.rs       # 核心实现
│   └── http/        # HTTP协议相关
│       ├── mod.rs   # 模块定义
│       ├── request.rs # 请求解析
│       └── response.rs # 响应构建
├── static/          # 静态文件
│   ├── index.html   # 示例页面
│   └── 404.html     # 404页面

3. 编辑Cargo.toml

[package]
name = "single-threaded-web"
version = "0.1.0"
edition = "2024"[dependencies]
thiserror = "1.0"    # 错误处理
bytes = "1.0"        # 字节处理
httparse = "1.8"     # HTTP解析
log = "0.4"          # 日志
env_logger = "0.10"  # 日志实现

4. 实现HTTP模块 (src/http/mod.rs)

mod request;
mod response;// 导出所有公共类型
pub use request::{Request, Method};
pub use response::{Response, StatusCode};/// HTTP相关错误
#[derive(Debug, thiserror::Error)]
pub enum Error {#[error("Invalid HTTP request")]InvalidRequest,#[error("I/O error: {0}")]Io(#[from] std::io::Error),#[error("Unsupported HTTP method")]UnsupportedMethod,#[error("Invalid HTTP header")]InvalidHeader,#[error("HTTP parse error: {0}")]Parse(#[from] httparse::Error),
}

5. 实现请求解析 (src/http/request.rs)

use std::collections::HashMap;
use std::str::FromStr;
use crate::http::Error;/// HTTP请求方法
#[derive(Debug, PartialEq)]
pub enum Method {GET,POST,
}impl std::fmt::Display for Method {fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {match self {Method::GET => write!(f, "GET"),Method::POST => write!(f, "POST"),}}
}impl FromStr for Method {type Err = Error;fn from_str(s: &str) -> Result<Self, Self::Err> {match s {"GET" => Ok(Method::GET),"POST" => Ok(Method::POST),_ => Err(Error::UnsupportedMethod),}}
}/// HTTP请求
#[derive(Debug)]
pub struct Request {pub method: Method,pub path: String,pub headers: HashMap<String, String>,pub body: Vec<u8>,
}impl Request {/// 从字节流解析HTTP请求pub fn parse(buffer: &[u8]) -> Result<Self, Error> {let mut headers = [httparse::EMPTY_HEADER; 16];let mut req = httparse::Request::new(&mut headers);let status = req.parse(buffer).map_err(Error::from)?;if status.is_partial() {return Err(Error::InvalidRequest);}
http://www.xdnf.cn/news/19922.html

相关文章:

  • (自用)PowerShell常用命令自查文档
  • AI重构出海营销:HeadAI如何用“滴滴模式”破解红人营销效率困局?
  • Flink 网络消息队列 PrioritizedDeque
  • C52单片机独立按键模块,中断系统,定时器计数器以及蜂鸣器
  • OpenLayers常用控件 -- 章节三:鼠标位置坐标显示控件教程
  • 多线程入门到精通系列: 从操作系统到 Java 线程模型
  • 快鹭云业财一体化系统技术解析:低代码+AI如何破解数据孤岛难题
  • 飞算JavaAI开发在线图书借阅平台全记录:从0到1的实践指南
  • 【C++】详解形参和实参:别再傻傻分不清
  • Android adb shell命令分析应用内存占用
  • 2025全国大学生数学建模C题保姆级思路模型(持续更新):NIPT 的时点选择与胎儿的异常判定
  • Trae + MCP : 一键生成专业封面——从概念到落地的全链路实战
  • java对接物联网设备(一)——使用okhttp网络工具框架对接标准API接口
  • SVN和Git两种版本管理系统对比
  • Hunyuan-MT-7B模型介绍
  • 使用Vue.js和WebSocket打造实时库存仪表盘
  • window使用ffmep工具,加自定义脚本执行视频转码成h264(运营人员使用)
  • P13929 [蓝桥杯 2022 省 Java B] 山 题解
  • 第三方网站测评:【WEB应用文件包含漏洞(LFI/RFI)的测试步骤】
  • 神经网络模型介绍
  • LeetCode 3132.找出与数组相加的整数2
  • 机器学习算法在Backtrader策略稳定性中的作用分析
  • pytorch可视化工具(训练评估:Tensorboard、swanlab)
  • c#编写的应用程序调用不在同一文件夹下的DLL
  • OpenLayers 入门篇教程 -- 章节三 :掌控地图的视野和交互
  • 下一代自动驾驶汽车系统XIL验证方法
  • 【Doris入门】Doris数据表模型使用指南:核心注意事项与实践
  • select, poll, epoll
  • PyTorch 损失函数与优化器全面指南:从理论到实践
  • 论文理解:Reflexion: Language Agents with Verbal Reinforcement Learning