課題5:JavaによるHTTPサーバ・クライアントプログラミング

課題4においてCで作成したものと同機能のHTTPサーバとHTTPクライアントをJava で実装せよ.この時,クライアントにおいては,以下の仕様を満たすBrowseクラスを作成・利用して,サーバからダウンロードしたhtmlファイル内の リンクを自由に辿れるようにせよ.クライアントの実行例は以下の通りである (プロンプトやリストの表示などのUIは自由に工夫すること).

   % java Client
   > http://www.fos.kuis.kyoto-u.ac.jp/le2soft/index.html (URLを入力)

   ...(実験2のページのindex.htmlの内容が表示される)...

   [list of links]
   1. http://www.fos.kuis.kyoto-u.ac.jp/le2soft/faq.html
   2. http://www.fos.kuis.kyoto-u.ac.jp/le2soft/basic.html
   ...(index.html内のリンク先URL一覧)...
   > 1    (リンクの番号を入力)

   ...(faq.htmlのソースとリンク一覧が表示される)...
   >

外部仕様
Browseクラスの内部仕様
現在閲覧しているページのURLやコンテ ンツの情報を保持するインスタンス変数群と,その内容を更新する メソッド群を実装すること.

インスタンス変数の例:

メソッドの例:

実装例
以下はBrowseクラスの実装の一例である.実装の方法はこ の他にも色々考えられる.例えば,以下ではlinks Stringの配列として実装しているが,リストを利用して List<String>型のインスタンス変数として実装することもできる. また,相対パスに対応するために,基準となるパスをインスタンス 変数として保持することも考えられる.この例では,コンストラク タは初期値を固定しているが,引数として初期値を受け取るように 実装することもできる.どのようなインスタンス変数とメソッドを 用意しどのように実装するのがよいか,自分なりに工夫すること.
   class Browse {
     // instance variables
     public String url, contents;
     public String[] links;
     ....

     // constructor
     public Browse() {
       url = "";
       links = new String[0];
       contents = "";
     }

     // methods
     public void collectLinks() {
       // contents中のリンクを抽出し,linksを更新
     }

     public void printLinks() {
       // linksの内容をナンバリングしながら表示
     }

     public String getLink(int n) {
       // links中のn番目のURLを返す
     }
     ...
   }
ClientクラスではBrowseクラスのオブジェクトを生成 (例えばbrowseとする)しておき,入力されたURLや,選択さ れたリンク番号に応じて,browseの内容を更新したり, browseの情報を取得したりしながら,サーバに接続したり,コンテ ンツを表示したりすればよい.以下は一例である.
   class Client {
     public static void main(String[] args) {
       Browse browse = new Browse("", new String[0], "");
       ...

       // 最初のURL入力を受けつけ,browseを更新

       while(true) {
         // browseの「現在閲覧中のURL」を解析
         // サーバに接続し,リクエストを送信
         // 受信したコンテンツを表示し,browseを更新
         // コンテンツ中のリンクを収集し,browseを更新
         // リンク一覧を表示
         // 入力された番号に応じてbrowseを更新
       }
     }

     // main中で利用されるメソッド群
   }
クラス毎の役割についても,URLの解析やリンクの番号選択の処理を どこで行なうか?など,設計の仕方は様々である.正しく動作しさ えすれば「必ずこのように実装しなければいけない」という絶対的 な正解はないので,各自でどのように実装すればよいかを考えるこ と.

NAKAZAWA Koji
2014-09-30