Rust開發實現基本的入門練習——HTTP服務器

環境:rust + IDEA

main.rs

//引入外部文件
mod mod_hello;
mod mod_http;
pub use self::mod_hello::*;
pub use self::mod_http::*;
//
use std::io;


#[derive(Debug)]
struct User {
    username: String,
    age: i32
}

fn main() {
    println!("Hello, world!");
    println!("{:X} {1} {0}", 10, 11);

    let zhang = User {
        username: String::from("zhangsan"),
        age: 28
    };
    println!("{:#?} \n{:p}", zhang, &zhang);

    //元祖
    let x = (345,"hhhh");
    let y:(i32,&str) = (123,"hello");
    println!("{} {}", x.1, y.0);

    //String::new()
    //#[warn(unused_mut)]
    let mut guess= String::from("hello rust");
    print!("{}\n", guess);

    //讀取命令行
    //#[warn(unused_imports)]
    //io::stdin().read_line(&mut guess).expect("failed to read line");
    //println!("{}", guess);

    //引用外部函數
    hello();
    //當前模塊路徑
    println!(module_path!());

    //創建http server
    http_main();
}

mod_http.rs

//引用系統包
use std::io::prelude::*;
use std::net::TcpListener;
use std::net::TcpStream;
use std::fs::File;
use std::thread;
use std::alloc::handle_alloc_error;

pub fn http_main() {
    let listener = TcpListener::bind("127.0.0.1:8080").unwrap();

    for stream in listener.incoming() {
        let stream = stream.unwrap();
        thread::spawn(||{
            handle_connection(stream);
        });
    }
}

fn handle_connection(mut stream: TcpStream) {
    let mut buffer = [0; 512];
    stream.read(&mut buffer).unwrap();
    let get = b"GET / HTTP/1.1\r\n";
    //邏輯處理
    let (status_line,filename) = if buffer.starts_with(get) {
        ("HTTP/1.1 200 OK\r\n\r\n", "index.html")
    } else {
        ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html")
    };

    //創建Body
    let mut file = File::open(filename).unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();
    let response = format!("{}{}", status_line, contents);
    //流寫入Body
    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

//參考:https://www.jianshu.com/p/143fe4134615

mod_hello.rs


//引用mod上的結構體
use super::User;

//外部可以使用
pub fn hello() {
    println!("hello in file demo");
    let lisi = User {
        username: String::from("Lisi"),
        age: 30
    };
    println!("{:#?}", lisi);
}

運行結果:

加油,繼續研究!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章