반응형
Rust 언어에 익숙해지기 위해 가장 보편적 작업이 필요한 "웹 서버 구축"을 해보도록 하겠습니다. 걍 rust 에서 제공되는 library로 http listener background process 띄우기.
먼저, 새 프로젝트를 생성합니다. (https://seowoozzang.tistory.com/50 참고)
% cargo new testserver --bin
Created binary (application) `testserver` package
% code -r ./testserver
우리는 바이너리 프로그램을 만들기 때문에 --bin을 입력한다. 만약 우리가 라이브러리를 만들고 있다면 --lib을 입력했을 것이다.
이제 src/main.rs 에 코드를 작성하자. 이 코드는 127.0.0.1:7878 주소로 TCP 연결 요청에 대해 수신 대기할 것이다. 만약 요청이 들어온다면, main()의 for문 내부로 들어올 것이다.
use std::io::prelude::*;
use std::net::TcpStream;
use std::net::TcpListener;
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[..]));
}
브라우저 주소창에 http://127.0.0.1:7878 입력 시 아래와 같이 페이지를 열수 없다고 나오지만 요청 내용이 터미널에 출력됨.
이제는 웹서비스답게 아래 내용의 파일 형태로 응답을 주어 html 페이지가 나타날 수 있게 하려 한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Hello!</title>
</head>
<body>
<h1>Hello!</h1>
<p>Hi from Rust</p>
</body>
</html>
아래와 같이 프로젝트의 root 경로에 위 내용의 hello.html 파일을 생성한다.
이제 src/main.rs 에 코드를 작성하자.
use std::io::prelude::*;
use std::net::TcpStream;
use std::net::TcpListener;
use std::fs::File; // 추가됨.
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 mut file = File::open("hello.html").unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
let response = format!(
"HTTP/1.1 200 OK\r\nContent-Length: {}\r\n\r\n{}",
contents.len(),
contents
);
stream.write(response.as_bytes()).unwrap();
stream.flush().unwrap();
}
반응형
'Rust' 카테고리의 다른 글
[Rust] Mac에서 "Rust" 개발 환경 구성 (3) - VS Code 환경 구축 (0) | 2022.08.21 |
---|---|
[Rust] Mac에서 "Rust" 개발 환경 구성 (2) - Hello World! (0) | 2022.08.17 |
Rust - 개념 및 C/C++과의 차이 (0) | 2022.08.15 |
[Rust] Mac에서 "Rust" 개발 환경 구성 (1) - 설치 (0) | 2022.08.15 |