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

文章目录

    • 一、创建一个具有监听链接功能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?);}//成功返回空括号的resultOk(())
}
  • 操作效果:
    在这里插入图片描述

二、读取请求内容

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?);}//成功返回空括号的resultOk(())
}

在这里插入图片描述

三、编写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?);}//成功返回空括号的resultOk(())
}

四、编写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?);}//成功返回空括号的resultOk(())
}

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

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

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

八、读取文件

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows10下Node.js安装教程

文章目录 windows10下Node.js安装教程下载安装包执行安装检查环境变量测试 windows10下Node.js安装教程 下载安装包 官网 执行安装 检查环境变量 系统已经为Node.js添加了相应的系统环境变量 测试 打开命令窗口 使用命令&#xff1a; END

从小白到大牛:Linux嵌入式系统开发的完整指南

Linux嵌入式系统开发一直是一个激动人心的领域&#xff0c;吸引着越来越多的开发者。无论你是初学者还是已经有一些经验的开发者&#xff0c;本文将为你提供从小白到大牛的完整指南&#xff0c;帮助你掌握Linux嵌入式系统开发的关键概念和技能。我们将深入探讨Linux内核、设备驱…

知识图谱与大模型结合方法概述

《Unifying Large Language Models and Knowledge Graphs: A Roadmap》总结了大语言模型和知识图谱融合的三种路线&#xff1a;1&#xff09;KG增强的LLM&#xff0c;可在LLMs的预训练和推理阶段引入KGs&#xff1b;2&#xff09;LLM增强KG&#xff0c;LLM可用于KG构建、KG emb…

【干货】分享几个免费下载音乐mp3的网站实测可用

简述 本文仅用于学习交流,不做任何声明。 分享几个免费下载音乐mp3的网站、免费音乐、 大家有找不到资源的,可以留言评论下,帮忙代下载~~ 一说 文本由PUSDN强力驱动! 有账号的朋友,可以点个赞或者评论两句哦,评论后会获得积分奖励~ wandhi【实测可用】 评价:比…

java数据机构.冒泡排序,选择排序 插入排序 递归算法,递归求阶乘,快速排序

排序算法 冒泡排序选择排序插入排序递归算法递归求1~100的和递归求阶乘 快速排序总结 冒泡排序 相邻两个元素比较,大的放右边,小的放左边 第一轮循环结束最大值已经找到,在数组最右边(归为算法) 第二轮在剩余的元素比较找到次大值,第二轮可以少循环一次 如果有n个数据,总共我们…

基于联合表示学习、用户聚类和模型自适应的个性化联合推荐

[Personalized Federated Recommendation via Joint Representation Learning, User Clustering, and Model Adaptation] (https://dl.acm.org/doi/abs/10.1145/3511808.3557668) CIKM2022(CCF-B) 论文精读 文章主要创新点(消融实验分析的三个点)&#xff1a; 联合表示学习 …

【C++】set和multiset

文章目录 关联式容器键值对一、set介绍二、set的使用multiset 关联式容器 STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元…

社交善行:TikTok如何引领慈善浪潮

在当今数字时代&#xff0c;社交媒体平台已成为人们互动、分享和传播信息的主要渠道。然而&#xff0c;这些平台不仅仅是用来社交和娱乐的工具&#xff0c;它们还可以成为慈善事业的有力支持者。 其中&#xff0c;TikTok以其独特的社交性质和广泛的用户群体&#xff0c;成为引…

jsoncpp fatal error C1083: 无法打开编译器生成的文件

使用jsoncpp库的时候&#xff0c;在Debug模式下正常&#xff0c;但是release却报错&#xff0c;开始以为是开发项目设置问题&#xff0c;于是网络搜索&#xff0c;发现是jsoncpp的编译选项问题。 修改生成静态库文件的工程的属性&#xff1a;路径为&#xff1a;菜单&#xff0…

react-hook-form。 useFieldArray Controller 必填,报错自动获取较多疑问记录

背景 动态多个数据Controller包裹时候&#xff0c;原生html标签input可以add时候自动获取焦点&#xff0c;聚焦到最近不符合要求的元素上面 matiral的TextField同样可以可是x-date-pickers/DatePicker不可以❌ 是什么原因呢&#xff0c;内部提供foucs&#xff1f;&#xff1f;属…

数据出境安全评估:重要性和实施策略

数据出境安全评估是确保数据安全和合规的重要环节。随着全球化的加速和信息技术的快速发展&#xff0c;企业和个人需要处理大量的数据&#xff0c;其中许多数据涉及个人隐私和企业机密。因此&#xff0c;数据出境安全评估对于保护数据安全和隐私权至关重要。 一、数据出境安全评…

列式数据库ClickHouse,大宽表聚合、报表一下全搞定

一、前言 现在数据库的种类也是特别的多&#xff0c;大致的类别包括&#xff1a; 关系型数据库&#xff08; MySQL、Oracle、PostgreSQL&#xff09;非关系型数据库&#xff08;Redis、MongoDB、Cassandra、Neo4j&#xff09;全文搜索引擎和分布式文档存储系统&#xff08;El…

kafka入门教程,介绍全面

1、官网下载最新版本的kafka&#xff0c;里面已经集成zookeeper。直接解压到D盘 2、配置文件修改&#xff0c;config目录下面的zookeeper.properties. 设置zookeeper数据目录 dataDirD:/kafka_2.12-3.6.0/tmp/zookeeper 3、修改kafka的配置文件server.properties. 主要修…

了解千兆光模块和万兆光模块的优势与劣势

光模块是现代通信网络中核心的传输设备之一。千兆光模块和万兆光模块作为其中的重要代表&#xff0c;广泛应用于数据中心和云计算等领域。它们采用光纤作为传输介质&#xff0c;具有高速、高带宽等优势。本文将从千兆光模块和万兆光模块的性能和应用范围入手&#xff0c;详述了…

LLM - 训练与推理过程中的 GPU 算力评估

目录 一.引言 二.FLOPs 和 TFLOPs ◆ FLOPs [Floating point Opearation Per Second] ◆ TFLOPs [Tera Floating point Opearation Per Second] 三.训练阶段的 GPU 消耗 ◆ 影响训练的因素 ◆ GPT-3 训练统计 ◆ 自定义训练 GPU 评估 四.推理阶段的 GPU 消耗 ◆ 影响…

[推荐]SpringBoot,邮件发送附件含Excel文件(含源码)。

在阅读本文前&#xff0c;可以先阅读我的上一篇文章&#xff1a; SpringBoot&#xff0c;使用JavaMailSender发送邮件(含源码)。 &#xff0c;本文使用的代码案例涉及到的 jar包、application.properties配置与它相同。 先看一下效果。 图一 图二 在下方代码案例中&#xff0c;…

速卖通卖家如何通过自己搭建测评补单系统,提高产品权重和排名?

速卖通卖家如何给店铺增加权重和排名&#xff1f; 在竞争激烈的速卖通平台上&#xff0c;为自己的店铺增加权重是吸引更多买家和提升销售的关键。店铺的权重决定着在搜索排名、推荐位和广告展示方面的优先级。今天珑哥为您介绍一些有效的策略&#xff0c;帮助您提升速卖通店铺…

Apache Shiro 越权访问漏洞 CVE-2020-1957 漏洞复现

一、漏洞描述 Apache Shiro 是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 CVE-2020-1957&#xff0c;Spring Boot中使用 Apache Shiro 进行身份验证、权限控制时&#xff0c;可以精心构造…

五款好用的数据备份软件推荐!

在当今信息时代&#xff0c;数据备份的重要性不言而喻。选择一款可靠的、功能强大的免费备份软件&#xff0c;不仅能确保数据的安全存储&#xff0c;还能为用户节省宝贵的时间和精力。针对这一需求&#xff0c;精心挑选了几款备受推荐的免费数据备份软件&#xff0c;它们不仅操…

污水一体处理设备工艺有哪些

污水一体处理设备工艺主要包括以下几种&#xff1a; AO工艺&#xff1a;AO工艺是增加好氧池缺氧池形成硝化-反硝化系统&#xff0c;处理污水中氮含量效率提升。SBR工艺&#xff1a;SBR工艺是按间歇曝气方式运行的活性污泥处理技术&#xff0c;厌氧、好氧、缺氧处于交替状态&am…