当前位置:   article > 正文

The Rust Programming Language - 第20章 最后的项目:构建多线程web server - 20.1 构建单线程web server_最后的项目:构建多线程web server

最后的项目:构建多线程web server

20 最后的项目:构建多线程web server

本章我们将会练习一个项目,顺便复习一下前面几章的内容,这个项目会实现宇哥返回”Hello“的web server

如下是我们的计划:

1.学习一些TCP与HTTP知识

2.在套接字(socket)上监听TCP请求

3.解析少量的HTTP请求

4.创建一个合适的HTTP响应

5.通过线程池改善server的吞吐量

但是注意,我们本次实例并不是使用Rust构建web server最好的方法。crates.io上有很多可用于生产环境的crate。它们提供了比我们所要编写的更为完整的web server 和线程池的实现

所以本章的目的在于学习而不是实现,走捷径。因为Rust是一个系统编程语言,我们能够选择处理什么层次的抽象,,并能够选择比其它语言可能或可用的层次更低的层次,因此我们将自己编写一个基础的HTTP server和线程池,以便学习将来可能用到的crate背后的通用理念和技术

20.1 构建单线程web server

首先我们创建一个可以运行的单线程web server。在开始之前我们先来看几个相关的的协议

HTTP 超文本传输协议和传控制协议TCP 它们都是请求-响应协议,也就是说客户端初始化请求,服务端监听请求并向客户端提供响应。而请求与相应的内容由协议本身定义

TCP是一个底层协议,它描述了信息如如何从一个server到另一个细节,不过其并不指定信息是什么HTTP构建于TCP之上,它定义了请求和响应的内容。技术上,HTTP可以用于其他协议之上,但是对于绝大多数情况,HTTP通过TCP传输

我们将要做的就是处理TCP和HTTP请求与相应的原始字节数据

监听TCP连接

我们的web server 所要做的第一件事就是能够监听TCP连接,我们使用标准库提供的std::net模块处理这些功能

让我们一如既往的创建一个新项目

C:\Users\xxx>cargo new hello
     Created binary (application) `hello` package

C:\Usersxxx>cd hello
  • 1
  • 2
  • 3
  • 4
use std::net::TcpListener;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();

    for stream in listener.incoming() {
        let stream = stream.unwrap();

        println!("Connection established!");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上述代码会在地址127.0.0.1:7878上监听传入的TCP流,当获取到传入的流,它会打印出Connection established!

我们选择监听地址127.0.0.1:7878.冒号之前的部分是一个代表本机的IP地址(这个地址每个计算机都相同),而7878是端口。选择这个端口出于两个原因:通常HTTP接受这个端口而且7878在电话上打出来就是 rust

在这个场景中bind函数类似于new函数,在这里他返回一个新的TcpListener实例,这个函数叫做bind是因为,在网络领域,连接到监听端口被称为”绑定到一个端口“(bind to a port)

bind 函数返回一个Result<T,E>,这表明绑定可能会失败。如连接80端口需要管理员权限,非管理员只能监听大于1024的端口,另外,如果多个程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/702814
推荐阅读
相关标签
  

闽ICP备14008679号