使用 Rust std 标准库编写一个简单的 Web 服务

1.

// 写一个简单网页服务器,直接返回一个字符串给请求的浏览器

use std::net::TcpListener;
use std::net::TcpStream;
use std::io::prelude::*;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    for stream in listener.incoming() {
        let stream = stream.unwrap();
        handle_connection(stream);
    }
}

fn handle_connection(mut stream: TcpStream) {
    let mut buffer = [0; 512];
    stream.read(&mut buffer).unwrap();
    println!("Request: {}", String::from_utf8_lossy(&buffer[..]));
}

2.

use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};

fn main() {
    let listener = TcpListener::bind("127.0.0.1:8080").expect("Could not bind to 127.0.0.1:8080");
    println!("Server listening on http://localhost:8080");

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                handle_client(stream);
            }
            Err(e) => {
                eprintln!("Error: {}", e);
            }
        }
    }
}

fn handle_client(mut stream: TcpStream) {
    let mut buffer = [0; 512];
    stream.read(&mut buffer).unwrap();

    println!("Request: {}", String::from_utf8_lossy(&buffer[..]));

    let response = "HTTP/1.1 200 OK\r\n\r\nHello, world!";
    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

3.

use std::io::{prelude::*, BufReader};
use std::net::{TcpListener, TcpStream};

fn handle_client(mut stream: TcpStream) {
    let mut reader = BufReader::new(&stream);
    let mut buffer = String::new();

    // 读取请求头
    reader.read_line(&mut buffer).unwrap();
    println!("Request header: {}", buffer);

    // 响应 HTTP 头
    let response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 13\r\n\r\nHello, World!";
    stream.write_all(response.as_bytes()).unwrap();
}

fn main() {
    let listener = TcpListener::bind("127.0.0.1:3000").unwrap();
    println!("Listening on http://127.0.0.1:3000");

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => handle_client(stream),
            Err(e) => eprintln!("Error: {}", e),
        }
    }
}

4.

use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};

fn main() {
    // Create a new TCP listener on port 3000
    let listener = TcpListener::bind("127.0.0.1:3000").expect("Failed to bind");

    println!("Listening on http://localhost:3000");

    for stream in listener.incoming() {
        match stream {
            Ok(mut stream) => {
                handle_client(&mut stream);
            }
            Err(e) => {
                eprintln!("Error: {}", e);
            }
        }
    }
}

fn handle_client(stream: &mut TcpStream) {
    let mut buffer = [0 as u8; 1024]; // Buffer to store incoming data

    match stream.read(&mut buffer) {
        Ok(size) => {
            // Parse HTTP request
            if !buffer.starts_with(b"GET / HTTP/1.1\r\n") {
                write!(stream, "HTTP/1.1 404 Not Found\r\nContent-Length: 9\r\n\r\nNot Found").unwrap();
            } else {
                // Construct an HTTP response
                let response = "HTTP/1.1 200 OK\r\n\
                                Content-Type: text/html; charset=utf-8\r\n\
                                Content-Length: 13\r\n\
                                \r\n\
                                Hello World!";
                stream.write(response.as_bytes()).unwrap();
            }
        }
        Err(e) => {
            eprintln!("Failed to read from stream: {}", e);
        }
    }

    // Ensure the buffer is clear for new connections
    stream.flush().unwrap();
}

5.

   use std::net::{TcpListener, TcpStream};
   use std::io::{Read, Write};
   use std::thread;

   fn handle_client(mut stream: TcpStream) {
       let mut buffer = [0 as u8; 512];
       stream.read(&mut buffer).expect("Failed to read from stream");

       println!("Request: {}", String::from_utf8_lossy(&buffer[..]));

       let response = "HTTP/1.1 200 OK\r\n\r\nHello, World!";
       stream.write(response.as_bytes()).unwrap();
       stream.flush().unwrap();
   }

   fn main() {
       let listener = TcpListener::bind("127.0.0.1:8080").expect("Failed to bind");

       println!("Server running at http://127.0.0.1:8080/");

       for stream in listener.incoming() {
           match stream {
               Ok(stream) => {
                   thread::spawn(move || {
                       handle_client(stream)
                   });
               }
               Err(e) => {
                   eprintln!("Error: {}", e);
               }
           }
       }
   }

6.

use std::net::TcpListener;
use std::thread;
use std::io::prelude::*;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
    println!("Listening on http://127.0.0.1:8080");

    for stream in listener.incoming() {
        let stream = stream.unwrap();

        thread::spawn(move || {
            handle_connection(stream);
        });
    }
}

fn handle_connection(mut stream: std::net::TcpStream) {
    let mut buffer = [0; 1024];
    stream.read(&mut buffer).unwrap();

    let response = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n<!DOCTYPE html>\n<html lang=\"en\">\n<head><title>Simple Web 
Server</title></head>\n<body><h1>Hello, world!</h1></body>\n</html>";
    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

7.

use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};
use std::thread;

fn handle_connection(mut stream: TcpStream) {
    let mut buffer = [0; 1024];
    stream.read(&mut buffer).unwrap();

    let get = b"GET / HTTP/1.1\r\n";

    let (status_line, contents) = if buffer.starts_with(get) {
        ("HTTP/1.1 200 OK\r\n\r\n", "Hello, world!")
    } else {
        ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "Not Found")
    };

    let response = format!("{}{}", status_line, contents);
    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

fn main() {
    let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
    println!("Listening on http://127.0.0.1:8080");

    for stream in listener.incoming() {
        let stream = stream.unwrap();

        thread::spawn(move || {
            handle_connection(stream);
        });
    }
}

8.

use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};

fn handle_client(mut stream: TcpStream) {
    let mut buffer = [0; 512];

    // Read data from the client
    match stream.read(&mut buffer) {
        Ok(size) => {
            // Convert bytes to string and check for "GET / HTTP/1.1"
            if String::from_utf8_lossy(&buffer[..size]).starts_with("GET / HTTP/1.1") {
                let response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n\r\nHello, World!";

                // Write the response to the client
                stream.write_all(response.as_bytes()).unwrap();
            } else {
                let response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 9\r\n\r\nNot Found";

                // Write the response to the client
                stream.write_all(response.as_bytes()).unwrap();
            }
        },
        Err(_) => (),
    }
}

fn main() {
    // Create a TCP listener on port 8080
    let listener = TcpListener::bind("127.0.0.1:8080").expect("Failed to bind");

    println!("Listening on http://127.0.0.1:8080");

    // Accept connections in a loop
    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                handle_client(stream);
            }
            Err(_) => continue,
        }
    }
}

9.

use std::{
    io::{prelude::*, BufReader},
    net::{TcpListener, TcpStream},
};

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    println!("Server is running on http://127.0.0.1:7878");

    for stream in listener.incoming() {
        let stream = stream.unwrap();
        handle_connection(stream);
    }
}

fn handle_connection(mut stream: TcpStream) {
    let buf_reader = BufReader::new(&mut stream);
    let http_request: Vec<_> = buf_reader
        .lines()
        .map(|result| result.unwrap())
        .take_while(|line| !line.is_empty())
        .collect();

    println!("Request: {http_request:#?}");

    // Send HTTP response
    let response = b"\
        HTTP/1.1 200 OK\r\n\
        Content-Type: text/html\r\n\
        \r\n\
        <html>\
            <head>\
                <title>Hello Rust</title>\
            </head>\
            <body>\
                <h1>Hello Rust Web Server!</h1>\
            </body>\
        </html>\
        ";
    stream.write(response).unwrap();
        stream.flush().unwrap();
}

10.

use std::{
    io::{Read, Write},
    net::{TcpListener, TcpStream},
    thread,
};

fn main() {
    // 绑定到本地端口 8080
    let listener = TcpListener::bind("127.0.0.1:8080").expect("Failed to bind to port 8080");
    println!("Server running at http://127.0.0.1:8080/");

    // 监听连接
    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                // 为每个连接创建新线程
                thread::spawn(move || {
                    handle_client(stream);
                });
            }
            Err(e) => {
                eprintln!("Failed to accept connection: {}", e);
            }
        }
    }
}

fn handle_client(mut stream: TcpStream) {
    let mut buffer: [u8; 1024] = [0; 1024];

    // 读取客户端请求
    match stream.read(&mut buffer) {
        Ok(size) => {
            // 解析请求路径
            let request = String::from_utf8_lossy(&buffer[..size]);
            let response = if request.starts_with("GET / HTTP/1.1") {
                // 返回 200 OK 响应
                "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 13\r\n\r\nHello, World!"
            } else {
                // 返回 404 Not Found 响应
                "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 9\r\n\r\nNot Found"
            };

            // 发送响应
            if let Err(e) = stream.write_all(response.as_bytes()) {
                eprintln!("Failed to send response: {}", e);
            }
        }
        Err(e) => {
            eprintln!("Failed to read from stream: {}", e);
        }
    }

    // 刷新流
    if let Err(e) = stream.flush() {
        eprintln!("Failed to flush stream: {}", e);
    }
}