Java : 簡易ウェブサーバ (jwebserver) の使い方
JDKツールの1つとして、JDK 18 から Java Simple Web Server (jwebserver) が追加されました。
ウェブページのちょっとした確認などに便利です。
本記事では、jwebserver の基本的な使い方をご紹介します。
概要
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 の基本的な使い方についてご紹介しました。
ローカルでちょっとした確認をしたいときに便利ですね。