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


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服务器

八、读取文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值