|
|
|
@ -41,7 +41,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
`unwrap` 的使用是因为 `bind` 返回 `Result<T,E>`,毕竟监听是有可能报错的,例如:如果要监听 `80` 端口往往需要管理员权限;监听了同样的端口,等等。
|
|
|
|
|
|
|
|
|
|
`incoming` 会返回一个迭代器,它每一次迭代都会返回一个新的连接 `steam`(客户端发起,web服务器监听接收),因此,接下来要做的就是从 `steam` 中读取数据,然后返回处理后的结果。
|
|
|
|
|
`incoming` 会返回一个迭代器,它每一次迭代都会返回一个新的连接 `stream`(客户端发起,web服务器监听接收),因此,接下来要做的就是从 `stream` 中读取数据,然后返回处理后的结果。
|
|
|
|
|
|
|
|
|
|
细心的同学可能会注意到,代码中对 `stream` 还进行了一次 `unwrap` 处理,原因在于我们并不是在迭代一个一个连接,而是在迭代处理一个一个请求建立连接的尝试,而这种尝试可能会失败!例如,操作系统的最大连接数限制。
|
|
|
|
|
|
|
|
|
@ -98,7 +98,7 @@ fn handle_connection(mut stream: TcpStream) {
|
|
|
|
|
- 引入 `std::io::prelude` 和 `std::io::BufReader` 是引入相应的特征和类型,帮助我们读取和写入数据
|
|
|
|
|
- `BufReader` 可以实现缓冲区读取,底层其实是基于 `std::io::Read` 实现
|
|
|
|
|
- 可以使用 `lines` 方法来获取一个迭代器,可以对传输的内容流进行按行迭代读取,要使用该方法,必须先引入 `std::io::BufRead`
|
|
|
|
|
- 最后使用 `collecto` 消费掉迭代器,最终客户端发来的请求数据被存到 `http_request` 这个动态数组中
|
|
|
|
|
- 最后使用 `collect` 消费掉迭代器,最终客户端发来的请求数据被存到 `http_request` 这个动态数组中
|
|
|
|
|
|
|
|
|
|
大家可能会比较好奇,该如何判断客户端发来的 HTTP 数据是否读取完成,答案就在于客户端会在请求数据的结尾附上两个换行符,当我们检测到某一行字符串为空时,就意味着请求数据已经传输完毕,可以 `collect` 了。
|
|
|
|
|
|
|
|
|
|