rust实践 - 使用tcp链接监听web请求,进行http解析

本文介绍了如何使用Rust构建一个单线程处理HTTP请求的Web服务器,涵盖TCP监听、HTTP协议解析以及返回HTML资源。通过cargo创建项目,使用net库监听TCP连接,读取请求,解析HTTP协议,最后返回带有Content-Length的HTML响应。文中还讨论了HTTP请求的结构,包括Method、Request-URI和Status-Code,并展示了如何根据请求内容返回不同响应。
摘要由CSDN通过智能技术生成

目标

使用rust构建一个单线程处理http请求的web服务器。

  1. 学习有关TCP和HTTP两个协议的知识。
  2. 侦听套接字上的TCP连接。
  3. 掌握http协议

动手

cargo 构建项目

我们不希望只构建一个小玩具的rs代码,而是采用生产方式来构建我们的任何rs项目,这需要我们用到之前讲述过的cargo工具。执行一下指令构建本次实践的项目

cargo new webBean

在这里插入图片描述
回顾之前文章讲过的内容:
1、Cargo.toml是项目描述信息
2、src是源代码放置的目录

使用net网路库监听tcp链接

  • 补充知识:

Web服务器中涉及的两个主要协议是超文本传输​​协议 (HTTP)和传输控制协议 (TCP)。两种协议都是请求-响应协议,这意味着客户端发起请求,服务器监听请求并向客户端提供响应。

  • 概述:
  1. tcp是传输层协议,用来实现端到端的数据传输。
  2. http是应用层协议,当服务器端接收到请求端的数据时,用户应用层通过解析数据识别是什么应用请求(http,icmp,ftp)等再进行业务处理,应用层协议实际上也是一种逻辑业务:比如nginx解析http进行转发,或者通常使用的http 框架(比如go的beego、java的spring mvc等)都进行了封装,用户只需要处理“真正的业务”请求。

创建服务器,监听tcp链接:

use std::net::TcpListener;

fn main() {
   
    let listener = TcpListener::bind("localhost:9999").unwrap();

    for stream in listener.incoming(){
   
        let stream = stream.unwrap();
        println!("connection established!");
    }
}

核心知识点:

  1. 使用use 引入rust提供的net包,使用TcpListener的bind函数来请求分配一个监听会话,该bind函数返回一个Result<T, E>,指示绑定可能失败。正常来说,返回失败时,我们服务器应该是无效的,需要退出。那么常见的失败原因有端口被占用、或者非管理员端口申请(比如80等)。
  2. unwrap是rust语言中,主要用于Option或Result的打开其包装的结果,在生产中通常处理Result而不是直接使用unwrap,在这里只是演示,不做深入解析。
  3. 使用let 将 TcpListener监听的返回值绑定到"变量" listener,这个绑定是不可变的,所以实际上又是一个常量。注意第7行的 let stream,这里的stream虽然与循坏的stream重名了,但实际上是通过let绑定了一个新值,是一个新的"变量"。
  4. 服务器建立监听后,可以通过Incoming函数来接收客户端链接的请求流,for循环将依次处理每个连接并产生一系列流供我们处理。
  5. 我们对每个流进行unwrap处理,如果有错误即终止程序,生产环境中我们还是通过对Result进行错误处理,而不是直接终止程序。

读取请求

  • 我们编写函数handle_connection来处理服务器接收到请求流:
    重写后
use std::net::TcpStream;
use std::net::TcpListener;
use std::io::prelude::*;

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

    for stream in listener.incoming(){
   
        let stream = stream.unwrap();
        // println!("connection established!");
        handle_connection(stream);
    }
}

fn handle_connection(mut stream: TcpStream) {
   
    let mut buffer = [0; 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Mac Rust io-uring是一种在Mac操作系统上使用Rust语言进行开发的io-uring库。 io-uring是Linux内核中的一个新特性,它为应用程序提供了一种高性能、高效率的异步I/O操作方式。它通过使用事件驱动和无锁技术,实现了在高并发环境下进行文件操作的优化。io-uring提供了更低的系统开销和更高的吞吐量,特别适用于需要大量I/O操作的应用程序。 虽然io-uring最初是为Linux内核设计的,但由于其高性能的特性,一些开发者试图将其移植到其他操作系统上。其中,Mac Rust io-uring就是一个在Mac操作系统上使用Rust语言实现io-uring的库。 使用Mac Rust io-uring,开发者可以在Mac环境下利用io-uring的特性来提高文件操作的性能。这对于需要进行大量I/O操作的应用程序来说,是一个很有价值的工具。例如,对于数据库、Web服务器或文件传输等应用,通过使用Mac Rust io-uring,可以显著提高其性能和吞吐量。 Mac Rust io-uring不仅提供了对io-uring的封装,还提供了一些更高级别的功能和接口,以方便开发者使用。开发者可以使用Mac Rust io-uring来实现一些高级的文件操作,例如批量读取或写入文件,提高数据处理的效率。 总之,Mac Rust io-uring是一个在Mac操作系统上使用Rust语言开发的io-uring库,它能够为开发者提供高性能的异步I/O操作方式,从而提高应用程序的性能和吞吐量。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值