12-1. サーバーの並列化

TCP 接続でのサーバープログラム

TCP には次のプリミティヴがあります。

  1. LISTEN
  2. CONNECT
  3. SEND
  4. RECEIVE
  5. DISCONNECT

サーバーを作るには、ポートをLISTENし、クライアントが接続してき たところで、クライアントと通信を開始します。 ここで、クライアントが接続してきた時にプロセスを作成して、クライア ントとのやりとりをまかせ、ふたたびLISTENすることで、複数のクライア ントの処理ができるようになります。 なお、この場合も排他処理は必要ですが、読み込みのみなら競合しません。

サーバの動作

  1. 特定のポートを LISTEN する(接続待ち状態)
  2. 接続要求を受けたら、サービスを開始するため、サービス用のポートを用 意する
  3. 別ポートを使用するサービスプロセスを起動する
  4. 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で動作時間を測定しなさい。