RUST

[ RUST ] 웹 서버 만들기 ( 기초 )

Suil_bear 2023. 10. 1. 00:20
728x90
use std::fs::File;
use std::io::prelude::*;
use std::net::TcpListener;
use std::net::TcpStream;
use std::path::Path;

표준 라이브러리 모듈을 가지고 온다.

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();

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

        handle_connection(stream);
    }
}

7878포트에 들어오는 TCP 연결을 수락하고, 수락된 handle_connection 함수를 호출 해준다.

 

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

    let response: String;
    if let Ok(contents) = read_file("hello.html") {
        let headers = format!(
            "HTTP/1.1 200 OK\r\nContent-Length: {}\r\n\r\n",
            contents.len()
        );
        response = headers + &contents;
    } else {
        response = "HTTP/1.1 404 NOT FOUND\r\n\r\n404 Not Found".to_string();
    }

    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

이 함수는 TCP 스트림에서 데이터를 읽어들이고, "hello.html" 파일을 익어들어 HTTP 응답을 생성하여 클라이언트에게 전송합니다. 파일 읽기 또는 네트워크 통신 중에 오류가 발생할 경우 404 응답을 생성해 줍니다.

 

fn read_file(filename: &str) -> std::io::Result<String> {
    let path = Path::new(filename);
    let mut file = File::open(path)?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

이 함수는 주어진 파일을 열어서 파일의 내용을 문자열로 읽어옵니다.

파일이 없거나 읽을 수 없는 경우 std::io::Result를 반환합니다.

 

실행을 하면 http://127.0.0.1:7878에 접속하면 "hello.html" 파일의 내용을 보실 수 있습니다.

 

통합 코드

use std::fs::File;
use std::io::prelude::*;
use std::net::TcpListener;
use std::net::TcpStream;
use std::path::Path;

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

    let response: String;
    if let Ok(contents) = read_file("hell.html") {
        let headers = format!(
            "HTTP/1.1 200 OK\r\nContent-Length: {}\r\n\r\n",
            contents.len()
        );
        response = headers + &contents;
    } else {
        response = "HTTP/1.1 404 NOT FOUND\r\n\r\n404 Not Found".to_string();
    }

    stream.write(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

fn read_file(filename: &str) -> std::io::Result<String> {
    let path = Path::new(filename);
    let mut file = File::open(path)?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}