概要

HTTP サーバー自作連載のまとめとして、ここまで扱ってきた要素を一つの学習用サーバーに並べて見直します。最小ルーティング、POST フォーム、TODO の CSV 永続化、静的ファイル配信、Cookie ベースの状態管理を一度つなげてみると、HTTP サーバーの内側で何が起きているかを通しで見やすくなります。ここでの完成版は実運用向けの完成品ではなく、連載全体の振り返り用です。

使いどころ

連載全体を通して HTTP サーバー自作の全体像を振り返りたい

学習用サンプルとして、各要素がどうつながるかを見直したい

既製の基盤に進む前に、ここまでの理解を一度まとめたい

コード例

LearningHttpServerOverview.java
import java.io.IOException;
import java.net.ServerSocket;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class LearningHttpServerOverview {

    static final int PORT = 8086;

    public static void main(String[] args) throws IOException {
        var sessions = new ConcurrentHashMap<String, String>();
        ExecutorService executor = Executors.newFixedThreadPool(10);

        try (var serverSocket = new ServerSocket(PORT)) {
            while (true) {
                var client = serverSocket.accept();
                executor.submit(() -> {
                    try {
                        // 1. リクエスト行とヘッダーを読む
                        // 2. ルーティングする
                        // 3. TODO は CSV に保存する
                        // 4. 静的ファイルは static/ から配信する
                        // 5. Cookie を読み、sessions で状態管理する
                        client.close();
                    } catch (IOException ignored) {
                    }
                });
            }
        }
    }
}

Java 8 / 17 / 21 の完全なサンプルコードは GitHub リポジトリ で確認できます。

Version Coverage

record、テキストブロック、`var` により、学習用のまとめコードでも読みやすさを保ちやすい。

Java 17
record SessionUser(String name) {}
var sessions = new ConcurrentHashMap<String, SessionUser>();

Library Comparison

学習用完成版(標準 API)連載全体の要素を一つにまとめて振り返りたいとき。理解には向くが、実務の構成や責務分離の見本にはならない。
com.sun.net.httpserver.HttpServer + 補助クラス低レイヤを少し省いて、学習用のまとめを簡潔にしたいとき。Socket レベルの理解は薄くなる。
Spring Boot / Play / Jakarta EE / Tomcat などの既製基盤学習後に実際のアプリケーション構成へ進むとき。抽象化は増えるが、運用と安全性の面で現実的になる。

注意点

完成版でも認証、アップロード、監査など実務で必要になる要素はかなり省いている

一つのサンプルにまとめる構成は学習には向くが、責務分離の見本として使うものではない

CSV 永続化とメモリセッションは、再起動や複数台構成を前提にしていない

静的配信と動的処理を一つの学習用サーバーに載せているのは、理解しやすさを優先しているためである

FAQ

この完成版をそのままアプリの土台にしてよいですか。

勧めません。完成版は連載全体を振り返るための学習用まとめであり、実アプリの土台として使う前提ではありません。

完成版コードをそのまま GitHub に公開してよいですか。

学習用サンプルとして公開するのは問題ありませんが、公開時には学習用であることを README などで明示しておくと誤解が少なくなります。

完成版でもなぜ DB を使わないのですか。

連載の主眼が HTTP の仕組み理解だからです。永続化を DB に置き換えると、今度は DB 側の理解が主題になりやすくなります。

次に学ぶべきは何ですか。

Spring Boot、Play、Jakarta EE などのフレームワーク実装に進み、認証・バリデーション・ログ・例外処理をどう基盤側に任せるかを見るのが自然です。

関連書籍

この記事のテーマをさらに深く学びたい方へ。

※ Amazon アソシエイトリンクを含みます