用rust写web服务器笔记(11/1)

news2024/11/26 20:45:15

文章目录

    • 一、创建一个具有监听链接功能web服务器
    • 二、读取请求内容
    • 三、编写web服务器返回网页(编写响应)
    • 四、编写web服务器有条件的返回网页
    • 五、编写多线程的web服务器
    • 六、用线程池实现web服务器
    • 七、实现线程池清除的web服务器
    • 八、读取文件

rust官网文档地址:https://doc.rust-lang.org/std

一、创建一个具有监听链接功能web服务器

①监听连接函数
在这里插入图片描述

use std::net::{TcpListener,TcpStream};

//接受tcp内容做处理
fn handle_client(_stream:TcpStream)
{
    println!("123455");
}

fn main()->std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;
    //问号表示如果bind成功则创建listener往下走,失败则返回

    //接受链接并处理
    for stream in listener.incoming()
    {
        handle_client(stream?);
    }

    //成功返回空括号的result
    Ok(())
}

  • 操作效果:
    在这里插入图片描述

二、读取请求内容

use std::net::{TcpListener,TcpStream};
use std::io::*;


//接受tcp内容做处理
fn handle_client(mut stream:TcpStream)
{
    //创建缓冲区来读
    let mut buffer=[0;512];
    stream.read(&mut buffer).unwrap();

    println!("Request:{}",String::from_utf8_lossy(&buffer[..]));
}

fn main()->std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;
    //问号表示如果bind成功则创建listener往下走,失败则返回

    //接受链接并处理
    for stream in listener.incoming()
    {
        handle_client(stream?);
    }

    //成功返回空括号的result
    Ok(())
}

在这里插入图片描述

三、编写web服务器返回网页(编写响应)

  • 编写响应
    1)返回一个响应行
    //返回响应
    let reponse = "HTTP/1.1 200 OK\r\n\r\n";
    stream.write(reponse.as_bytes()).unwrap();
    stream.flush().unwrap();

2)返回一个真正的网页
①创建一个简单的main.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Hello!</title>
    </head>
    <body>
        <hl>Hello</hl>
        <p>This is a response from a Rust Server</p>
    </body>
</html>

在这里插入图片描述

    //返回响应
    let content = fs::read_to_string("main.html").unwrap();
    //内容加载到响应行里面
    let reponse = format!("HTTP/1.1 200 OK\r\n\r\n{}",content);
    stream.write(reponse.as_bytes()).unwrap();
    stream.flush().unwrap();

在这里插入图片描述

  • Http简单介绍
    1)请求报文:
    ①请求行:Method 、 Request-URI 、HTTP-Version CRLF// 请求方式、协议版本等
    ②请求头:headers CRLF //包含若干个属性,格式为:“ 属性名:属性值”
    ③请求体:message-body //客户端想传给服务器的内容
    2)响应报文:
    ①响应行:HTTP-VERSION Status-Code Reason-Phrase CRLF//报文协议及版本,状态码及状态描述
    ②响应头:headers CRLF // 多个属性构成
    ③响应体:message-body // 真正响应的内容
use std::net::{TcpListener,TcpStream};
use std::io::{Read,Write};
use std::fs;


//接受tcp内容做处理
fn handle_client(mut stream:TcpStream)
{
    //创建缓冲区来读
    let mut buffer=[0;512];
    stream.read(&mut buffer).unwrap();

    //打印请求格式
    println!("Request:{}",String::from_utf8_lossy(&buffer[..]));



    //返回响应
    let content = fs::read_to_string("main.html").unwrap();
    //内容加载到响应行里面
    let reponse = format!("HTTP/1.1 200 OK\r\n\r\n{}",content);
    stream.write(reponse.as_bytes()).unwrap();
    stream.flush().unwrap();

}

fn main()->std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;
    //问号表示如果bind成功则创建listener往下走,失败则返回

    //接受链接并处理
    for stream in listener.incoming()
    {
        handle_client(stream?);
    }

    //成功返回空括号的result
    Ok(())
}

四、编写web服务器有条件的返回网页

1)404Erorr界面的html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Hello!</title>
    </head>
    <body>
        <hl>Oops</hl>
        <p>Sorry,error!</p>
    </body>
</html>

2)代码示例

use std::net::{TcpListener,TcpStream};
use std::io::{Read,Write};
use std::fs;


//接受tcp内容做处理
fn handle_client(mut stream:TcpStream)
{
    //创建缓冲区来读
    let mut buffer=[0;512];
    stream.read(&mut buffer).unwrap();

    //打印请求格式
    println!("Request:{}",String::from_utf8_lossy(&buffer[..]));


    //根据是不是get返回对应内容
    let get = b"Get / HTTP/1.1/r\n";
    if buffer.starts_with(get){
        //返回main.html
        //返回响应
        let content = fs::read_to_string("main.html").unwrap();
        //内容加载到响应行里面
        let reponse = format!("HTTP/1.1 200 OK\r\n\r\n{}",content);

    }else{
        //返回响应
        let content = fs::read_to_string("404.html").unwrap();
        //内容加载到响应行里面
        let reponse = format!("HTTP/1.1 404 NOT FOUND\r\n\r\n{}",content);

    }
    stream.write(reponse.as_bytes()).unwrap();
    stream.flush().unwrap();
}

fn main()->std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;
    //问号表示如果bind成功则创建listener往下走,失败则返回

    //接受链接并处理
    for stream in listener.incoming()
    {
        handle_client(stream?);
    }

    //成功返回空括号的result
    Ok(())
}

五、编写多线程的web服务器

六、用线程池实现web服务器

七、实现线程池清除的web服务器

八、读取文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1160830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传音影像团队图像超分辨领域的论文被国际计算机视觉顶级会议ICCV 2023录用

近日&#xff0c;国际计算机视觉大会 ICCV 2023&#xff08;International Conference on Computer Vision&#xff0c;简称ICCV&#xff09;在法国巴黎召开。传音影像团队与哈尔滨工业大学机器学习研究中心合作完成的图像超分辨领域的论文“MetaF2N: Blind Image Super-Resolu…

10个免费的设计素材网站分享,高效设计不是梦!

今天&#xff0c;我想和大家分享10个新的优秀设计资源网站&#xff0c;包括免费设计素材站、设计工具、字体等网站&#xff0c;特别是一些素材网站&#xff0c;都是免费下载的。而且相对来说&#xff0c;他们提供的设计素材的风格都是目前比较流行的&#xff0c;非常适合我们追…

Linux | 如何保持 SSH 会话处于活动状态

在远程服务器管理和安全数据传输中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是不可或缺的工具。然而&#xff0c;它的便利性和安全性有时会因常见的问题而受到损害&#xff1a;冻结 SSH 会话。 此外&#xff0c;session 的突然中断可能会导致工作丢失、项目延迟和无…

uniapp开发小程序无法上传图片的解决方法

登录小程序后台&#xff0c;第一步菜单栏 设置 第二步&#xff0c;用户隐私保护 更新 第三步 选2 第四步 勾选需要的接口&#xff0c;并说明 等审核通过后&#xff0c;一会就能正常上传图片。

深度学习之基于YoloV5火灾烟雾报警系统(GUI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、火灾烟雾报警系统四. 总结 一项目简介 YoloV5 是深度学习中用于目标检测的一种算法&#xff0c;可以对输入的图像进行识别&#xff0c;标识出…

nodejs+vue+elementui+python家电销售分析系统设计与实现-计算机毕业设计

系统按照用户的实际需求开发而来&#xff0c;贴近生活。从管理员通过正确的账号的密码进入系统&#xff0c;可以使用相关的系统应用。管理员总体负责整体系统的运行维护&#xff0c;统筹协调。 我们可以利用计算机技术来取代传统的管理模式&#xff0c;实现家电销售分析系统的…

Linux--jdk,tomca,mysql安装、后端项目搭建

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的&#xff0c;上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容&#xff1a; //java environment expo…

在pycharm中配置GPU训练环境(Anaconda)(yolov5)

目录 1. 具体的配置过程&#xff1a; 2. 在指定位置&#xff08;路径&#xff09;创建虚拟环境&#xff1a; 3. conda常用命令&#xff1a; 4: 在跑模型时候遇到的一些问题&#xff1a; 4.1: conda添加python解释器找不到对应的python.exe文件 4.2: 报错“OSError: [WinE…

VMware打开centos黑屏解决方法汇总以及解决出现的bug(Centos7系统网络异常等)

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…

【项目源码解析】某3C产品自动光学检测系统

解决方案源码解析思维导图 一、带有桁架机械手的自动光学检测系统介绍 二、关于机械手运动控制&#xff08;是否需要机器人学方面的知识&#xff09; 机械手的运动控制不需要深入了解机器人学方面的知识的情况包括&#xff1a; 预配置和任务单一性&#xff1a;如果机械手已经预…

交叉熵损失的“替代品”:基于最优传输思想设计的分类损失函数EMO

©PaperWeekly 原创 作者 | 苏剑林 单位 | 月之暗面 研究方向 | NLP、神经网络 众所周知&#xff0c;分类任务的标准损失是交叉熵&#xff08;Cross Entropy&#xff0c;等价于最大似然 MLE&#xff0c;即 Maximum Likelihood Estimation&#xff09;&#xff0c;它有着简…

为什么重写 redisTemplate

为什么重写 redisTemplate 1.安装 redis 上传 redis 的安装包tar -xvf redis-5.0.7.tar.gzyum -y install gcc-cmakemake PREFIX/soft/redis installcd /soft/redis/bin./redis-server redis.conf 2. 集成 redisTemplate maven 依赖 <dependency><groupId>org…

React基础源码解析

前言&#xff1a; 前端魔术师卡颂的react学习视频&#xff08;1 搭建项目架构_哔哩哔哩_bilibili&#xff09;中提到了Rodrigo Pombo的一篇react源码教程&#xff1a;Build your own React 本文档分组旨在翻译和记录这篇文章的学习心得&#xff0c;作为react源码学习入门。 …

MySQL笔记--Ubuntu安装MySQL并基于C++测试API

目录 1--安装MySQL 2--MySQL连接 3--代码案例 1--安装MySQL # 安装MySQL-Server sudo apt install mysql-server# 设置系统启动时自动开启 sudo systemctl start mysql # sudo systemctl enable mysql# 检查MySQL运行状态 sudo systemctl status mysql# 进入MySQL终端 sudo…

VR全景在医院的应用:缓和医患矛盾、提升医院形象

医患关系一直以来都是较为激烈的&#xff0c;包括制度的不完善、医疗资源紧张等问题也时有存在&#xff0c;为了缓解医患矛盾&#xff0c;不仅要提升患者以及家属对于医院的认知&#xff0c;还需要完善医疗制度&#xff0c;提高医疗资源的配置效率&#xff0c;提高服务质量。 因…

vue3的ref源码解析

ref的实现原理 一句话总结: ref本身是个函数&#xff0c;该函数返回一个createRef函数&#xff0c;createRef函数又返回一个“经过类RefImpl实例化”的对象。 详情介绍: ref函数接收我们传入的一个简单类型或复杂类型value&#xff0c;后又将value传递给createRef函数&#xf…

【K8S】二进制安装

常见的K8S安装部署方式 ●Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ●Kubeadm☆ Kubeadm也是一个工具&#xff0c;提…

利用Docker容器化构建可移植的分布式应用程序

目录 一、什么是Docker容器化 二、构建可移植的分布式应用程序的优势 三、构建可移植的分布式应用程序的步骤 四、推荐一款软件开发工具 随着云计算和容器化技术的快速发展&#xff0c;将应用程序容器化成为构建可移植的分布式应用程序的一种重要方式。Docker作为目前最为…

批量采集各类自媒体平台内容为word文档带图片软件【支持18家自媒体平台的爬取采集】

批量采集各类自媒体平台内容为word文档带图片软件介绍&#xff1a; 1、支持头条号、大鱼号、企鹅号、一点号、凤凰号、搜狐号、网易号、趣头条、东方号、时间号、惠头条、WiFi万能钥匙、新浪看点、简书、QQ看点、快传号、百家号、微信公众号的文章批量采集为docx文档并带图片。…

c++ Templates:The Complete Guide第二版英文版勘误

看到这里的时候觉得不对劲&#xff0c;一查&#xff0c;果然是写错了&#xff0c;Values应该改成Vs 12.4 Page 204, 12.4.2: s/Values is a nontype template parameter pack.../Vs is a nontype template parameter pack.../Page 204, 12.4.2: s/...provided for the templat…