PR

問題

問11 次のJavaプログラムの説明及びプログラムを読んで、設問1、2に答えよ。
(Javaプログラムで使用するAPIの説明は、この冊子の末尾を参照してください。)

[プログラムの説明]

 電子会議システムのプログラムである。

 電子会議は、サーバに接続しているクライアント間で行われ、一つのクライアントは、会議の参加者1人に対応する。会議に参加するときは、電子会議システムのサーバにログインする。参加者の発言はクライアントからのメッセージとしてサーバに送られる。サーバは受信したメッセージを、発信元クライアントを含む全クライアントに配信する。会議から退出するときは、ログアウトする。

 この電子会議システムのサーバを実装するために、次のクラスを定義する。

(1)クラスMessageQueueは、クライアントからのメッセージを格納するための待ち行列(メッセージキュー)である。メッセージは、先入れ先出しで管理される。メソッドputは、引数messageで与えられたメッセージをメッセージキューに追加する。メッセージキューに格納できるメッセージ数には制限があり、満杯のときは、空きができるまで待つ。メソッドtakeは、メッセージキューの先頭からメッセージを取り出す。メッセージキューが空のときは、メッセージが追加されるまで待つ。

(2)クラスConfServerは、サーバを定義する。クライアントとのログイン状態を管理し、メッセージの受信と配信を行う。ここでクライアントとは、(3)で説明する抽象クラスの型のインスタンスである。クラスConfServerは、クラスが初期化されるときにインスタンスが作成され、単独のスレッドとして動作する。メソッドrunは、メッセージキューからメッセージを取り出し、ログインしている全クライアントにそのメッセージを配信する。この操作を繰り返す。メソッドloginは、入れ子クラスConfServer.Sessionのインスタンスを生成し、それをキーとしてクライアントを管理テーブルに登録し、そのインスタンスを返す。クライアントが既に登録されている場合は、IllegalArgumentExceptionを投げる。クライアントが管理テーブルに登録されているとき、そのクライアントはサーバにログインしている状態であるとする。

(3)抽象クラスConfClientは、サーバが必要とするクライアントの機能を定義する。サーバは、メソッドdisplayMessageを呼び出してクライアントにメッセージを配信する。クライアントは、このクラスを実装しなければならない。クライアントがサーバにメッセージを送信するときは、ログイン時に返されたクラスConfServer.SessionのインスタンスのメソッドwriteMessageを呼び出す。クライアントがログアウトするときは、同じインスタンスのメソッドlogoutを呼び出す。

(4)サーバをテストするために、クラスTestClientを定義する。このクラスは、ConfClientで定義されたメソッドをテスト用に実装する。TestClientのインスタンスは、サーバに対してクライアントの役割をする。メソッドdisplayMessageは、メッセージを次の形式で出力する。

  発信クライアント名: メッセージ >受信クライアント名