Java : 簡易ウェブサーバ (jwebserver) の使い方
JDKツールの1つとして、JDK 18 から Java Simple Web Server (jwebserver) が追加されました。
ウェブページのちょっとした確認などに便利です。
本記事では、jwebserver の基本的な使い方をご紹介します。
概要
jwebserverツールは、プロトタイプ、テストおよびデバッグに使用される最小限のHTTPサーバーを提供します。
Java Simple Web Server (jwebserver) は、JDKツールの1つとして提供されています。
機能は必要最低限で、静的なページやファイルのみを扱えます。
jwebserver はコンソールアプリケーションです。
Windows では PowerShell、Linux では Terminal などから起動できます。
※本記事では Windows の PowerShell で実行しています。
jwebserver は、java や javac といったツールと同じ場所にあります。
具体的には JAVA_HOME の bin ディレクトリにあります。
事前に Path をとおしておくと便利かもしれません。
使い方の基本
それでは、実際に jwebserver を使ってみましょう。
まず、作業ディレクトリに index.html を用意します。
内容は "Java Simple Web Server!" と表示する html です。
PS R:\java-work> cat .\index.html
<html>
<body>
Java Simple Web Server!
</body>
</html>
次に jwebserver を起動します。
とりあえずオプションはなしです。
PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
デフォルトでは、
- アドレス : 127.0.0.1
- ポート : 8000
で待ち受けます。
次に、ウェブブラウザで http://127.0.0.1:8000/ にアクセスしてみましょう。
無事、ウェブページを表示することができました。
jwebserver 側でも、GET 要求があり 200 OK を返したことが分かります。
PS R:\java-work> jwebserver.exe
...
127.0.0.1 - - [10/Jul/2024:14:49:44 +0900] "GET / HTTP/1.1" 200 -
最後に Ctrl + C で jwebserver を停止します。
PS R:\java-work>
jwebserver が終了して、PowerShell のコマンド受け付け状態に戻りました。
オプション
ヘルプ
日本語ドキュメントの下記ページもご参照ください。
PS R:\java-work> jwebserver.exe -h
Usage: jwebserver [-b bind address] [-p port] [-d directory]
[-o none|info|verbose] [-h to show options]
[-version to show version information]
Options:
-b, --bind-address - Address to bind to. Default: 127.0.0.1 (loopback).
For all interfaces use "-b 0.0.0.0" or "-b ::".
-d, --directory - Directory to serve. Default: current directory.
-o, --output - Output format. none|info|verbose. Default: info.
-p, --port - Port to listen on. Default: 8000.
-h, -?, --help - Prints this help message and exits.
-version, --version - Prints version information and exits.
To stop the server, press Ctrl + C.
バージョン
PS R:\java-work> jwebserver.exe -version
jwebserver 21.0.1
待ち受けアドレス
Options:
-b, --bind-address - Address to bind to. Default: 127.0.0.1 (loopback).
For all interfaces use "-b 0.0.0.0" or "-b ::".
デフォルトは 127.0.0.1 です。
待ち受けアドレスを、プライベートIPアドレス(192.168.1.100) に変更する例です。
PS R:\java-work> jwebserver.exe -b 192.168.1.100
Serving R:\java-work and subdirectories on 192.168.1.100 port 8000
URL http://192.168.1.100:8000/
Java から HTTP要求する例です。
final var uri = URI.create("http://192.168.1.100:8000/");
final var request = HttpRequest.newBuilder(uri).build();
System.out.println(request); // http://192.168.1.100:8000/ GET
try (final var client = HttpClient.newHttpClient()) {
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response); // (GET http://192.168.1.100:8000/) 200
}
ポート
Options:
-p, --port - Port to listen on. Default: 8000.
デフォルトは 8000 です。
待ち受けポートを 8888 に変更する例です。
PS R:\java-work> jwebserver.exe -p 8888
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8888
URL http://127.0.0.1:8888/
Java から HTTP要求する例です。
final var uri = URI.create("http://127.0.0.1:8888/");
final var request = HttpRequest.newBuilder(uri).build();
System.out.println(request); // http://127.0.0.1:8888/ GET
try (final var client = HttpClient.newHttpClient()) {
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response); // (GET http://127.0.0.1:8888/) 200
}
出力情報
Options:
-o, --output - Output format. none|info|verbose. Default: info.
デフォルトは info です。
verbose にすると、より詳細な情報が出力されます。
PS R:\java-work> jwebserver.exe -o verbose
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
Java から HTTP要求する例です。
final var uri = URI.create("http://127.0.0.1:8000/");
final var request = HttpRequest.newBuilder(uri).build();
System.out.println(request); // http://127.0.0.1:8000/ GET
try (final var client = HttpClient.newHttpClient()) {
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response); // (GET http://127.0.0.1:8000/) 200
}
結果の出力です。
PS R:\java-work> jwebserver.exe -o verbose
...
127.0.0.1 - - [10/Jul/2024:14:58:32 +0900] "GET / HTTP/1.1" 200 -
Resource requested: R:\java-work
> Connection: Upgrade, HTTP2-Settings
> Http2-settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
> Host: 127.0.0.1:8000
> User-agent: Java-http-client/21.0.1
> Upgrade: h2c
>
< Date: Wed, 10 Jul 2024 05:58:32 GMT
< Last-modified: Wed, 10 Jul 2024 05:40:38 GMT
< Content-type: text/html
< Content-length: 58
<
ディレクトリ指定
Options:
-d, --directory - Directory to serve. Default: current directory.
例として a-dir と b-dir の2つのディレクトリを作成します。
それぞれのディレクトリには index.html ファイルを用意して、"AAA!" と "BBB!" という内容にします。
PS R:\java-work> cat .\a-dir\index.html
AAA!
PS R:\java-work> cat .\b-dir\index.html
BBB!
まずは a-dir をカレントディレクトリとして jwebserver を起動してみましょう。
PS R:\java-work> jwebserver.exe -d R:\java-work\a-dir
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work\a-dir and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
ウェブブラウザから http://127.0.0.1:8000/ にアクセスします。
次に b-dir をカレントディレクトリとして jwebserver を起動してみます。
PS R:\java-work> jwebserver.exe -d R:\java-work\b-dir
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work\b-dir and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
無事、カレントディレクトリを切り替えることができました。
できないこと
POST, DELETE
HTTPメソッドとしては、GET と HEAD がサポートされています。
POST や DELETE には対応していません。
POSTを要求して、405 (Not Allowed) が返ってくる例です。
PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
127.0.0.1 - - [10/Jul/2024:15:03:56 +0900] "POST / HTTP/1.1" 405 -
final var uri = URI.create("http://127.0.0.1:8000/");
final var request = HttpRequest.newBuilder(uri)
.POST(HttpRequest.BodyPublishers.ofString("xyz"))
.build();
System.out.println(request); // http://127.0.0.1:8000/ POST
try (final var client = HttpClient.newHttpClient()) {
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response); // (POST http://127.0.0.1:8000/) 405
}
HTTPS
プロトコルは HTTP のみに対応しています。
HTTPS には対応していません。
HTTPS で接続しようとしてタイムアウトする例です。
PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
final var uri = URI.create("https://127.0.0.1:8000/");
final var request = HttpRequest.newBuilder(uri)
.timeout(Duration.ofSeconds(5))
.build();
try (final var client = HttpClient.newHttpClient()) {
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (HttpTimeoutException e) {
System.out.println("HttpTimeoutException!");
}
// Result
// ↓
//HttpTimeoutException!
HTTP/2
HTTP/1.1のみがサポートされています。
HTTP/2 には対応していません。
HTTP/2 で要求しても、HTTP/1.1 で応答される例です。
PS R:\java-work> jwebserver.exe
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving R:\java-work and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/
127.0.0.1 - - [10/Jul/2024:15:11:02 +0900] "GET / HTTP/1.1" 200 -
final var uri = URI.create("http://127.0.0.1:8000/");
final var request = HttpRequest.newBuilder(uri).build();
try (final var client = HttpClient.newHttpClient()) {
System.out.println(client.version()); // HTTP_2
final var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response); // (GET http://127.0.0.1:8000/) 200
System.out.println(response.version()); // HTTP_1_1
}
まとめ
jwebserver の基本的な使い方についてご紹介しました。
ローカルでちょっとした確認をしたいときに便利ですね。