用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.hqwc.cn/news/157776.html

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

相关文章

学习笔记|两独立样本秩和检验|曼-惠特尼 U数据分布图|规范表达|《小白爱上SPSS》课程:SPSS第十二讲 | 两独立样本秩和检验如何做?

目录 学习目的软件版本原始文档两独立样本秩和检验一、实战案例二、统计策略三、SPSS操作1、正态性检验2、两样本秩和检验 四、结果解读疑问&#xff1a;曼-惠特尼 U数据分布图如何绘制&#xff1f; 五、规范报告1、规范表格2、规范文字 六、划重点 学习目的 SPSS第十二讲 | 两…

频谱仪超外差和零中频架构

文章目录 超外差结构零中频结构接收机结构发射机结构 优缺点对比附录相关词汇多次变频的形象解释 参考文献 频谱仪的本质就是一个超宽带、超宽调谐范围、高动态范围的通信接收机&#xff0c; 频谱仪的原理即通信接收机的原理。 遇到高频率高带宽谐波成分复杂的通信信号的话&am…

关于idea使用的一些操作设置

关于idea使用的一些操作设置 1. 常用的一下设置1.1 快捷键相关1.2 配置自动生成注释&#xff08;类、方法等&#xff09;1.3 maven项目相关1.4 常见其他的一些操作设置 2. IntelliJ IDEA 取消param注释中参数报错提示3. idea同时打开多个文件&#xff0c;导航栏不隐藏、自动换行…

AI时代新宠,向量数据库

随着生成式人工智能&#xff08;GAI&#xff09;应用以及大语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;一种新型数据库也获得了市场和资本的重点关注&#xff0c;它就是向量数据库&#xff08;Vector Database&#xff09;。 向量数据库简介 向量数据库是一种…

微信小程序自定义弹窗阻止滑动冒泡catchtouchmove之后弹窗内部内容无法滑动

自定义弹窗 如图所示&#xff1a; 自定义弹窗内部有带滚动条的盒子区域 问题&#xff1a; 在盒子上滑动&#xff0c;页面如果超出一屏的话&#xff0c;也会跟着一起上下滚动 解决方案&#xff1a;给自定义弹窗 添加 catchtouchmove 事件&#xff0c;阻止冒泡即可 网上不少…

【C++】C++11【上】列表初始化|声明|新容器|右值引用|完美转发|新的类功能

目录 1、 C11简介 2、 统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 2.2 std::initializer_list 3、声明 3.1 auto和范围for 3.1decltype 3.3 nullptr 4、新容器 5、 右值引用 5.1左值引用和右值引用 5.2 左值引用与右值引用比较 5.3 左值和右值引用使用场景及意义 6…

2023年【低压电工】考试及低压电工模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工考试根据新低压电工考试大纲要求&#xff0c;安全生产模拟考试一点通将低压电工模拟考试试题进行汇编&#xff0c;组成一套低压电工全真模拟考试试题&#xff0c;学员可通过低压电工模拟考试题全真模拟&#…

2023/10/29总结

总结 踩坑记录 写代码的时候遇到了一个错误大概是这样的 io.jsonwebtoken.security.WeakKeyException: The signing keys size is 48 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used…

pycharm使用ssh连接远程jupyter

1. 安装jupyter pip install jupyter2. 生成jupyter_notebook_config.py文件 jupyter notebook --generate-config3. 设置命令参数 jupyter notebook --no-browser --allow-root --port 8900配置Jupyter服务器 将上面的代码复制到命令行实参中&#xff1a;

管理类联考——数学——汇总篇——知识点突破——代数——函数、方程——记忆

文章目录 考点记忆/考点汇总——按大纲 整体局部 本篇思路&#xff1a;根据各方的资料&#xff0c;比如名师的资料&#xff0c;按大纲或者其他方式&#xff0c;收集/汇总考点&#xff0c;即需记忆点&#xff0c;在通过整体的记忆法&#xff0c;比如整体信息很多&#xff0c;通常…

Day17力扣打卡

打卡记录 参加会议的最多员工数&#xff08;拓扑排序 分类讨论&#xff09; 链接 计算内向基环树的最大基环&#xff0c;基环树基环为2的情况分类讨论。 class Solution { public:int maximumInvitations(vector<int> &favorite) {int n favorite.size();vector…

动作捕捉系统进行坐标系转换

动作捕捉系统在机器人等应用中常出现被测物与动捕坐标系不一致的问题。这时就需要进行坐标系的转换。在NOKOV度量动作捕捉系统软件中&#xff0c;可以对被测物的坐标系原点偏移量进行设置&#xff0c;实现被测物坐标系与大地坐标系的重合。 一、坐标系偏移操作 在形影动捕软件…