🐡
[Rust] 簡単なWebサーバを構築してみる
なぜやってみたの?
最近流行りのプログラミング言語の筆頭にRustが挙げられるかと思います。
そんなRust言語を学習したいと思い、現在Rustの各種機能を勉強しています。
その中で、今回はRustを使って簡単なサーバを作ってみましたので、そのトライした内容をチュートリアル的にまとめてみました。
環境情報
- Rust 1.56.1
手順
-
Webサーバ用のプロジェクトを作成する
$ cargo new web-server $ cd web-server && ls -al total 16 drwxr-xr-x 6 root staff 192 Nov 25 23:05 . drwxr-xr-x 6 root staff 192 Nov 25 23:02 .. -rw-r--r-- 1 root staff 155 Nov 25 23:05 Cargo.lock -rw-r--r-- 1 root staff 180 Nov 25 23:02 Cargo.toml drwxr-xr-x 3 root staff 96 Nov 25 23:02 src drwxr-xr-x@ 6 root staff 192 Nov 25 23:09 target
-
HTTPをリッスンするコードを作成する
web-server/src/main.rs をエディタで開き、以下のようにファイルを編集します。use std::io::prelude::*; use std::net::TcpListener; use std::net::TcpStream; fn main() { let listener = TcpListener::bind("127.0.0.1:8080").unwrap(); for stream in listener.incoming() { let stream = stream.unwrap(); println!("Connection established!"); handle_connection(stream); } } fn handle_connection(mut stream: TcpStream) { let mut buffer = [0; 1024]; stream.read(&mut buffer).unwrap(); println!("Request: {}", String::from_utf8_lossy(&buffer[..])); }
-
作成したコードを実行する
作成したコードの確認のため、web-serverディレクトにて以下のコマンドを実行します。$ cargo run Compiling rust-server v0.1.0 (/Users/xxxx/work/web-server) Finished dev [unoptimized + debuginfo] target(s) in 0.91s Running `target/debug/rust-server` Connection established!
正常に実行されると、上記のような出力がターミナル上に表示されます。
Connection established!
はmain関数のfor文内部で実行しているprintln!に該当しています。 -
ターミナルから動作確認してみる
実行しているWebサーバに対して、アクセスをし動作確認をしてみましょう。
現在立ち上げているターミナルとは別にウィンドウを立ち上げ以下のコマンドを実行しします。$ curl localhost:8080 curl: (52) Empty reply from server
Empty reply という応答が返ってきていますが、ここでサーバ側のターミナルを確認してみましょ。
Connection established! Request: GET / HTTP/1.1 Host: localhost:8080 User-Agent: curl/7.64.1 Accept: */*
サーバ側のターミナルにて上記のような出力が確認できるかと思います。
現状では、クライアントにメッセージを返す実装をしていませんが、サーバ自体は構築できました。
サーバからクライアントにレスポンスを返す実装は次回の記事、または本記事へ随時追記するかしたいと思います。
Discussion