用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?);
    }

    //成功返回空括号的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.mfbz.cn/a/112029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QMI8658A_QMC5883L(9轴)-EVB 评估板——索引博文

0.前言 【初见姿态传感器】 在做一个4轴飞行器的时候了解到有这样一个可以控制飞行器姿态的传感器&#xff0c;而后在哔哩哔哩看到利用姿态传感做很多很好玩的作品。目前在自己的本职工作中广泛会用姿态传感器IMU的应用。 1.博文索引 【基础内容】 【QMI8658 - 姿态传感器学习…

基于图神经网络的联邦学习跨企业推荐

Federated Learning-Based Cross-Enterprise Recommendation With Graph Neural Networks 论文试图解决什么问题 该论文试图解决跨企业推荐系统中存在的数据共享和用户隐私保护的问题。在许多小型和中型企业中&#xff0c;由于资源有限&#xff0c;无法提供足够的数据来进行大…

java基础之IO操作

用户进程发起请求&#xff0c;内核接收到请求后&#xff0c;从I/O设备中获取数据到buffer中&#xff0c;再将buffer中的数据copy到用户进程的地址空间&#xff0c;该用户进程获取到数据后再响应客户端。 数据输入到buffer需要时间&#xff0c;从buffer复制数据至进程也需要时间…

服务器遭受攻击如何处理(记录排查)

本文的重点是介绍如何鉴别安全事件以及保护现场的方法&#xff0c;以确保服务器负责人能够在第一时间对安全攻击做出反应&#xff0c;并在最短时间内抵御攻击或减少攻击所带来的影响。 在服务器遭遇疑似安全事件时&#xff0c;通常可以从账号、进程、网络和日志四个主要方面进…

onlyoffice 二次开发 连接器(connector) 表单填(Filling out the form) jsApi级别操作文档

阅读须知&#xff1a;本文针对有对word/excel进行js操作的需求 本次改造基于V7.3.3进行&#xff0c;已经更新进入docker。 小伙伴们须知&#xff1a;改造后的office docker需要付费&#xff08;875元&#xff09;&#xff0c;等于wps一个月费用 欢迎大家一起交流&#xff1a;V&…

面经(面试经验)第一步,从自我介绍开始说起

看到一位同学讲自己的面试步骤和过程&#xff0c;我心有所感&#xff0c;故此想整理下面试的准备工作。以便大家能顺利应对面试&#xff0c;通过面试... 求职应聘找工作&#xff0c;面试是必然的关卡&#xff0c;如今竞争激烈呀&#xff0c;想要得到自己喜欢的工作&#xff0c…

基于springboot实现学生考勤管理系统【项目源码+论文说明】

基于springboot实现学生考勤管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&am…

敲敲云零代码平台超实用表单设计技巧推荐,分分钟玩转零代码

敲敲云是一个APaaS零代码云平台&#xff0c;帮助企业快速搭建个性化业务应用。用户不需要编码就能够搭建出用户体验上佳的销售、运营、人事、采购等核心业务应用&#xff0c;打通企业内部数据。平台拥有完善的表单引擎、流程引擎、仪表盘等。 有时我们在添加明细表时&#xff0…

瑞数专题五

今日文案&#xff1a;焦虑&#xff0c;想象力过度发酵的产物。 网址&#xff1a;https://www.iyiou.com/ 专题五主要是分享瑞数6代。6代很少见&#xff0c;所以找理想哥要的&#xff0c;感谢感谢。 关于瑞数作者之前已经分享过4篇文章&#xff0c;全都收录在瑞数专栏中了&am…

LED显示屏的4种连接方式

全彩LED显示屏是由多块LED模组拼接起来的LED大屏幕&#xff0c;而显示屏模组是由许多的LED灯珠组装起来的。LED显示屏效果好不好&#xff0c;和LED显示屏组装有很大的关系。而显示屏的组装关键在连接方式上&#xff0c;如果连接不好将影响LED显示屏的画面质量&#xff0c;甚至会…

Rust-错误处理魔法

这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括&#xff1a;Rust&#xff0c;Javascript。关注我&#xff0c;我会通过这个项目的开发给大家带来相关实战技术的分享。 我们写的代码主要有两部分&am…

linux 安装 elasticsearch 全教程

一、去 elasticsearch官网找到Linux版本的下载链接 地址https://www.elastic.co/cn/downloads/elasticsearch 二、在linux 中用wget下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz三、下载成功后解压文件 tar -x…

Windows 开启 Kerberos 的火狐 Firefox 浏览器访问yarn、hdfs

背景&#xff1a;类型为IPA或者MIT KDC&#xff0c;windows目前只支持 firefoxMIT Kerberos客户端的形式&#xff0c;其他windows端浏览器IE、chrome、edge&#xff0c;没有办法去调用MIT Kerberos Windows客户端的GSSAPI验证方式&#xff0c;所以均无法使用 Windows 开启 Kerb…

驱动开发11-2 编写SPI驱动程序-点亮数码管

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h>int m74hc595_probe(struct spi_device *spi) {printk("%s:%d\n",__FILE__,__LINE__);char buf[]{0XF,0X6D};spi_write(spi,buf,sizeof(buf));return 0; …

基于51单片机的智能手机充电器设计

**单片机设计介绍&#xff0c;1660【毕设课设】基于51单片机和MAX1898的智能手机充电器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 51单片机智能手机充电器设计介绍 51单片机智能手机充电器是一种可以实现智能快速充电的…

OpenAI将推出ChatGPT Plus会员新功能,有用户反馈将支持上传文件和多模态

&#x1f989; AI新闻 &#x1f680; OpenAI将推出ChatGPT Plus会员新功能&#xff0c;有用户反馈将支持上传文件和多模态 摘要&#xff1a;OpenAI为ChatGPT Plus会员推出了一些新功能&#xff0c;包括上传文件、处理文件和多模态支持。用户不再需要手动选择模式&#xff0c;…

自动化测试mock模块使用详解介绍

mock简介 py3已将mock集成到unittest库中为的就是更好的进行单元测试简单理解&#xff0c;模拟接口返回参数通俗易懂&#xff0c;直接修改接口返回参数的值官方文档&#xff1a;unittest.mock --- 模拟对象库 — Python 3.11.3 文档 mock作用 解决依赖问题&#xff0c;达到解…

Mac/Linux类虚拟机_CrossOver虚拟机CrossOver 23.6正式发布2024全新功能解析

CodeWeivers 公司于今年 10 月发布了 CrossOver 23.6 测试版&#xff0c;重点添加了对 DirectX 12 支持&#xff0c;从而在 Mac 上更好地模拟运行 Windows 游戏。 该公司今天发布新闻稿&#xff0c;表示正式发布 CrossOver 23 稳定版&#xff0c;在诸多新增功能中&#xff0c;最…

urlPattern配置和request

urlPattern配置 Servlet类编写好后&#xff0c;想要被访问到&#xff0c;就需要配置其访问路径&#xff08;urlPattern&#xff09; 一个Servlet可以配置多个urlPattern&#xff1a; WebServlet&#xff08;urlPatterns{"/demo","/demo2"}) urlPattern配置…

UE5 Android下载zip文件并解压缩到指定位置

一、下载是使用市场的免费插件 二、解压缩是使用市场的免费插件 三、Android路径问题 windows平台下使用该插件没有问题&#xff0c;只是在Android平台下&#xff0c;只有使用绝对路径才能进行解压缩&#xff0c;所以如何获得Android下的绝对路径&#xff1f;增加C文件获得And…