12-1. サーバーの並列化
TCP 接続でのサーバープログラム
TCP には次のプリミティヴがあります。
- LISTEN
- CONNECT
- SEND
- RECEIVE
- DISCONNECT
サーバーを作るには、ポートをLISTENし、クライアントが接続してき たところで、クライアントと通信を開始します。 ここで、クライアントが接続してきた時にプロセスを作成して、クライア ントとのやりとりをまかせ、ふたたびLISTENすることで、複数のクライア ントの処理ができるようになります。 なお、この場合も排他処理は必要ですが、読み込みのみなら競合しません。
サーバの動作
- 特定のポートを LISTEN する(接続待ち状態)
- 接続要求を受けたら、サービスを開始するため、サービス用のポートを用 意する
- 別ポートを使用するサービスプロセスを起動する
- 1 へ戻る
Java の例
エラー処理は考えてません。
import java.net.*;
...
try{
ServerSocket serv = new ServerSocket(ポート番号); // LISTEN
for(;;){ // 無限ループ
Socket sock = serv.accept(); // 要求を受付け、新たなポートへのソ
// ケットを用意する
サービススレッド sth = new サービススレッド(sock);
sth.start(); // 実際のサービス開始
}
}
class サービススレッド extends java.lang.Thread {
private Socket sock;
サービススレッド(Socket _sock){ //コンストラクタ
sock = _sock;
}
public void run(){
// 実際のサービス
sock.close();
}
}
12-2. HTTP
Hyper Text Transfer Protocol(HTTP)はWorld Wide Web(WWW)のプロトコルです。 WWWは開発、利用されながら発展していったため、発表当時からプロトコルが 固定されていたわけではなく、様々な試行錯誤を繰り返しながら仕様が定 められていきました。 1996年にそれまで使用されていたデファクトスタンダードなプロトコルを まとめたHTTP1.0が規定され、さらに 1997年にHTTP1.1が定められ、長年使われてきました。 近年、Googleなどの開発によりHTTP2が定められました(2015)。
HTTP1.1以降は高速通信のための様々な仕組みのため、ステートフルです が、HTTP1.0はステートレスで、「GET URL HTTP/1.0」を送るだけで情報 を引き出すことができます。
12-3. 演習
演習12-1
git://edu.net.c.dendai.ac.jp/git/spro/12/1 からプログラムを取得し、http.HTTPクラスをJava Applicationとして 実行することで、Webサーバとなる。 ブラウザで http://localhost:8080/test.txt にアクセスして Hello World が表示されることを確認しなさい。
演習12-2
git://edu.net.c.dendai.ac.jp/git/spro/12/2 からプログラムを取得し、bench.BenchクラスをJava Applicationとして 実行することで、Webサーバの負荷実験ができる。 但し、Run Configurations の引数で、URLと読み込み回数を指定する必要 がある。 http://localhost:8080/test.txt 10000 を指定し、動作時間を測定しな さい。
演習12-3
http を並列化し、benchで動作時間を測定しなさい。