ch20-00-final-project-a-web-server.md
commit c084bdd9ee328e7e774df19882ccc139532e53d8
这是一次漫长的旅途,不过我们到达了本书的结束。在本章中,我们将一同构建另一个项目,来展示最
后几章所学,同时复习更早的章节。
作为最后的项目,我们将要实现一个返回 ”hello” 的 web server,它在浏览器中看起来就如图例 20-1 所
示:
hello from rust
523
524 CHAPTER 20. 最后的项目: 构建多线程 WEB SERVER
图例 20-1: 我们最后将一起分享的项目
如下是我们将怎样构建此 web server 的计划:
- 学习一些 TCP 与 HTTP 知识
- 在套接字(socket)上监听 TCP 请求
- 解析少量的 HTTP 请求
- 创建一个合适的 HTTP 响应
- 通过线程池改善 server 的吞吐量
不过在开始之前,需要提到一点细节:这里使用的方法并不是使用 Rust 构建 web server 最好的方法。
crates.io 上有很多可用于生产环境的 crate,它们提供了比我们所要编写的更为完整的 web server 和线
程池实现。
然而,本章的目的在于学习,而不是走捷径。因为 Rust 是一个系统编程语言,我们能够选择处理什么
层次的抽象,并能够选择比其他语言可能或可用的层次更低的层次。因此我们将自己编写一个基础的
HTTP server 和线程池,以便学习将来可能用到的 crate 背后的通用理念和技术。
构建单线程 web server
ch20-01-single-threaded.md
commit 9c0fa2714859738ff73cbbb829592e4c037d7e46
首先让我们创建一个可运行的单线程 web server,不过在开始之前,我们将快速了解一下构建 web
server 所涉及到的协议。这些协议的细节超出了本书的范畴,不过一个简单的概括会提供我们所需的信
息。
web server 中涉及到的两个主要协议是 超文本传输协议(Hypertext Transfer Protocol,HTTP)和 传输
控制协议(Transmission Control Protocol,TCP)。这两者都是 请求-响应(request−response)协议,也
就是说,有 客户端(client)来初始化请求,并有 服务端(server)监听请求并向客户端提供响应。请求
与响应的内容由协议本身定义。
TCP 是一个底层协议,它描述了信息如何从一个 server 到另一个的细节,不过其并不指定信息是什么。
HTTP 构建于 TCP 之上,它定义了请求和响应的内容。为此,技术上讲可将 HTTP 用于其他协议之上,不
过对于绝大部分情况,HTTP 通过 TCP 传输。我们将要做的就是处理 TCP 和 HTTP 请求与响应的原始字
节数据。