簡易HTTPサーバーの実装
次に、HTTPプロトコルに従ったサーバーの実装を行います。 HTTPサーバーを実装することで、サーバーからのレスポンスをWebブラウザ等のHTTPクライアントで表示できるようになります。
HTTPレスポンスの送信
本来は、HTTPリクエストの内容を正しく解釈し、その内容に応じたレスポンスをサーバーが返さなければなりません。 まずは、処理を単純化して理解するために、リクエストの内容を無視して常に同じレスポンスを送信するHTTPサーバーを実装します。 Processingによる実装は以下のようになります。
import processing.net.*;
Server myServer;
void setup() {
myServer = new Server(this, 80);
}
void draw() {
Client client = myServer.available();
if (client != null) {
client.readString();
client.write("HTTP/1.1 200 OK\r\n");
client.write("\r\n");
client.write("<h1>hello</h1>\r\n");
client.stop();
}
}
最も単純なHTTPレスポンスメッセージは以下の3つの部分から構成されます。
- ステータス行
- 空行
- メッセージボディ
上記のプログラムでは、それらを1行ずつ送信しています。
Webブラウザによる動作確認
サーバープログラムを実行し、動作確認を行いましょう。 Webブラウザで http://localhost/ にアクセスします。 Webブラウザで以下のように「hello」というメッセージが表示されていたら成功です。
cURLによる動作確認
コマンドを利用したHTTP通信の確認方法としてcURLを利用できます。 cURLを利用すると、ヘッダーやメッセージボディの設定を柔軟にコマンドで行うことができます。 HTTPサーバーからメッセージボディを取得するには以下のようにコマンドを実行します。
$ curl http://localhost/
<h1>hello</h1>
ヘッダー情報を表示するためには -I
オプションを利用します。
$ curl -I http://localhost/
HTTP/1.1 200 OK
ファイルの送信
前述のプログラムでは、メッセージボディの内容をプログラム中の文字列で埋め込んでいました。 これでは、プログラムの柔軟性に欠けるので、HTML等のファイルを読み込んでレスポンスとして送信するようにしてみましょう。
まずはスケッチの data
ディレクトリ内に index.html
ファイルを作成し、以下の内容を保存しましょう。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>My Web Site</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
次に、サーバープログラムを以下のように修正します。
import java.util.Iterator;
import processing.net.*;
Server myServer;
void setup() {
myServer = new Server(this, 80);
}
void draw() {
Client client = myServer.available();
if (client != null) {
client.readString();
client.write("HTTP/1.1 200 OK\r\n");
client.write("\r\n");
byte[] file = loadBytes("index.html");
client.write(file);
client.stop();
}
}
サーバープログラムを実行し、WebブラウザやcURLを用いてサーバーにアクセスすると保存した index.html
の内容が送信されることが確認できるでしょう。