|
|
@ -57,7 +57,7 @@ Connection established!
|
|
|
|
|
|
|
|
|
|
|
|
无论浏览器怎么摆烂,我们的服务器还是成功打出了信息:TCP 连接已经成功建立。
|
|
|
|
无论浏览器怎么摆烂,我们的服务器还是成功打出了信息:TCP 连接已经成功建立。
|
|
|
|
|
|
|
|
|
|
|
|
可能大家会疑问,为啥在浏览器访问一次,可能会在终端打印出多次请求建立的信息,难道不是应该一一对应吗?原因在于当 `stream` 超出作用域时,回触发 `drop` 的扫尾工作,其中包含了关闭连接。但是,浏览器可能会存在自动重试的情况,因此还会重新建立连接,最终打印了多次。
|
|
|
|
可能大家会疑问,为啥在浏览器访问一次,可能会在终端打印出多次请求建立的信息,难道不是应该一一对应吗?原因在于当 `stream` 超出作用域时,会触发 `drop` 的扫尾工作,其中包含了关闭连接。但是,浏览器可能会存在自动重试的情况,因此还会重新建立连接,最终打印了多次。
|
|
|
|
|
|
|
|
|
|
|
|
由于 `listener.incoming` 会在当前阻塞式监听,也就是 `main` 线程会被阻塞,我们最后需要通过 `ctrl + c` 来结束程序进程。
|
|
|
|
由于 `listener.incoming` 会在当前阻塞式监听,也就是 `main` 线程会被阻塞,我们最后需要通过 `ctrl + c` 来结束程序进程。
|
|
|
|
|
|
|
|
|
|
|
@ -98,7 +98,7 @@ fn handle_connection(mut stream: TcpStream) {
|
|
|
|
- 引入 `std::io::prelude` 和 `std::io::BufReader` 是引入相应的特征和类型,帮助我们读取和写入数据
|
|
|
|
- 引入 `std::io::prelude` 和 `std::io::BufReader` 是引入相应的特征和类型,帮助我们读取和写入数据
|
|
|
|
- `BufReader` 可以实现缓冲区读取,底层其实是基于 `std::io::Read` 实现
|
|
|
|
- `BufReader` 可以实现缓冲区读取,底层其实是基于 `std::io::Read` 实现
|
|
|
|
- 可以使用 `lines` 方法来获取一个迭代器,可以对传输的内容流进行按行迭代读取,要使用该方法,必须先引入 `std::io::BufRead`
|
|
|
|
- 可以使用 `lines` 方法来获取一个迭代器,可以对传输的内容流进行按行迭代读取,要使用该方法,必须先引入 `std::io::BufRead`
|
|
|
|
- 最后使用 `collecto` 消费掉迭代器,最终客户端发来的请求数据被存到 `http_request` 这个动态数组中
|
|
|
|
- 最后使用 `collect` 消费掉迭代器,最终客户端发来的请求数据被存到 `http_request` 这个动态数组中
|
|
|
|
|
|
|
|
|
|
|
|
大家可能会比较好奇,该如何判断客户端发来的 HTTP 数据是否读取完成,答案就在于客户端会在请求数据的结尾附上两个换行符,当我们检测到某一行字符串为空时,就意味着请求数据已经传输完毕,可以 `collect` 了。
|
|
|
|
大家可能会比较好奇,该如何判断客户端发来的 HTTP 数据是否读取完成,答案就在于客户端会在请求数据的结尾附上两个换行符,当我们检测到某一行字符串为空时,就意味着请求数据已经传输完毕,可以 `collect` 了。
|
|
|
|
|
|
|
|
|
|
|
|