🐡

[Rust] 簡単なWebサーバを構築してみる

2021/11/26に公開

なぜやってみたの?


最近流行りのプログラミング言語の筆頭にRustが挙げられるかと思います。
そんなRust言語を学習したいと思い、現在Rustの各種機能を勉強しています。

その中で、今回はRustを使って簡単なサーバを作ってみましたので、そのトライした内容をチュートリアル的にまとめてみました。

環境情報


  • Rust 1.56.1

手順


  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
    
  2. 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[..]));
    }
    
  3. 作成したコードを実行する
    作成したコードの確認のため、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!に該当しています。

  4. ターミナルから動作確認してみる
    実行している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