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