# alicedog **Repository Path**: alanuu/alicedog ## Basic Information - **Project Name**: alicedog - **Description**: 从零手写的迷你 HTTP 服务器 / Servlet 容器,通过五个版本渐进式演进,从最基础的请求-响应服务器逐步成长为支持 Servlet 规范、XML 配置、线程池的完整容器。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-03 - **Last Updated**: 2026-07-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # alicedog 从零手写的迷你 HTTP 服务器 / Servlet 容器,通过五个版本渐进式演进,从最基础的请求-响应服务器逐步成长为支持 Servlet 规范、XML 配置、线程池的完整容器。 ## 演进路线 | 版本 | 功能 | 线程模型 | |------|------|----------| | **Bootstrap** | 固定字符串响应 | 单线程阻塞 | | **Bootstrap2** | 解析 HTTP 请求,提供静态资源服务 | 单线程阻塞 | | **Bootstrap3** | 解析 `web.xml`,Servlet 动态分发 | 单线程阻塞 | | **Bootstrap4** | 每个请求独立线程 | 多线程(无界) | | **Bootstrap5** | 线程池管理请求 | 线程池(核心10/最大50/队列50) | ## 项目结构 ``` alicedog/ ├── pom.xml └── src/main/ ├── java/ │ ├── server/ # 服务器启动入口 │ │ ├── Bootstrap.java # v1: 固定响应 │ │ ├── Bootstrap2.java # v2: 静态资源 │ │ ├── Bootstrap3.java # v3: Servlet 分发 │ │ ├── Bootstrap4.java # v4: 多线程 │ │ └── Bootstrap5.java # v5: 线程池 │ ├── servlet/ # Servlet 框架 │ │ ├── Servlet.java # 接口: init / destroy / service │ │ ├── HttpServlet.java # 抽象类: GET/POST 分发 │ │ └── WcfServlet.java # 示例 Servlet (GET 延迟10s演示阻塞) │ ├── entity/ # 请求与响应封装 │ │ ├── Request.java # HTTP 请求解析 (method + url) │ │ └── Response.java # HTTP 响应输出 (静态文件 / 404) │ ├── thread/ # 线程处理 │ │ └── RequestProcessor.java # 单次请求处理的 Runnable │ └── utils/ # 工具类 │ ├── HttpProtocolUtil.java # HTTP 200/404 响应头构造 │ └── StaticResourceUtil.java# 静态资源路径解析与流式输出 └── resources/ ├── web.xml # Servlet 配置 (WcfServlet → /wcf) └── index.html # 默认静态页面 ``` ## 各版本详解 ### v1 — Bootstrap:最小 HTTP 服务器 - 监听端口 **8090** - 对所有请求返回固定字符串 `Hello alicedog!` - 无请求解析、无静态文件、无 Servlet ### v2 — Bootstrap2:静态资源服务 - 解析 HTTP 请求行,提取请求方法和 URL - 根据 URL 提供静态 HTML 文件服务 - 文件不存在时返回 404 响应 - 仍然单线程阻塞 ### v3 — Bootstrap3:Servlet 容器 - 解析 `web.xml`,通过 dom4j + XPath 读取 `` 和 `` 配置 - 使用反射 `Class.forName().newInstance()` 实例化 Servlet - URL 匹配 Servlet 时走动态分发,否则走静态资源 - `/` 自动重映射到 `/index.html` - 仍然单线程阻塞 — `WcfServlet.doGet()` 中的 10 秒延迟会阻塞所有其他请求 ### v4 — Bootstrap4:多线程处理 - 每个请求创建独立 `Thread` 处理 - 主线程立即返回继续 accept 下一个连接 - 解决了慢 Servlet 阻塞其他请求的问题 - 缺点:无界线程创建,高并发下可能耗尽系统资源 ### v5 — Bootstrap5:线程池 - 使用 `ThreadPoolExecutor` 管理线程: - 核心线程数:10 - 最大线程数:50 - 空闲回收时间:100 秒 - 任务队列:`ArrayBlockingQueue(50)` - 拒绝策略:`AbortPolicy`(队列满时抛出异常) - 在并发能力和资源控制之间取得平衡 ## Servlet 框架 项目实现了一套迷你 Servlet 规范: ``` Servlet (接口) └── HttpServlet (抽象类,根据请求方法分发到 doGet/doPost) └── WcfServlet (具体实现,演示用) ``` `WcfServlet` 注册在 `/wcf` 路径: - **GET** 请求:休眠 10 秒后返回 `

WcfServlet get

`(用于演示单线程阻塞问题) - **POST** 请求:立即返回 `

WcfServlet post

` ## 技术栈 - Java 8 - dom4j 1.6.1 — XML 解析(Bootstrap3+) - jaxen 1.1.6 — XPath 引擎(dom4j 依赖) - Maven 构建 ## 快速开始 ```bash # 编译 mvn compile # 运行(选择一个版本) mvn exec:java -Dexec.mainClass="server.Bootstrap" mvn exec:java -Dexec.mainClass="server.Bootstrap2" mvn exec:java -Dexec.mainClass="server.Bootstrap3" mvn exec:java -Dexec.mainClass="server.Bootstrap4" mvn exec:java -Dexec.mainClass="server.Bootstrap5" ``` 服务器启动后监听 **8090** 端口,可访问: - `http://localhost:8090/` — 静态首页(Bootstrap2+) - `http://localhost:8090/wcf` — WcfServlet(Bootstrap3+) ## 许可证 MIT