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

文章目录

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

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

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

①监听连接函数
用rust写web服务器笔记(11/1)_第1张图片

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(())
}

  • 操作效果:
    用rust写web服务器笔记(11/1)_第2张图片

二、读取请求内容

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(())
}

用rust写web服务器笔记(11/1)_第3张图片

三、编写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>Hellohl>
        <p>This is a response from a Rust Serverp>
    body>
html>

用rust写web服务器笔记(11/1)_第4张图片

    //返回响应
    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>Oopshl>
        <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服务器

八、读取文件

你可能感兴趣的:(rust,前端,服务器)