Serverは,マルチクライアント対応のサーバである.第一引数に接続を受 けるポート番号,第二引数に送信間隔(ミリ秒)を取って起動する. Clientは,第一引数にサーバのホスト名,第二引数にポート番号を取って起動 する.接続が確立すると,サーバは指定された送信間隔で乱数を10回送信し,ク ライアントは受信した乱数を順次表示する.
サーバ起動例:
% javac server.java % java Server 30001 500 (接続待ちに入る.接続が確立すると,New connection.と表示される.) (クライアントからのリクエストメッセージが来れば,それを表示する.)
クライアント起動例:
% javac client.java % java Client localhost 30001 0.2425523772474496 0.932094495806451 ... 0.2663380226295512 %
これらのサーバ,クライアントは,Cのサーバ,クライアントのサンプルと の間でも正常に通信が可能である.これを確認せよ.
Socket s = new Socket(args[0], Integer.parseInt(args[1]));で,Socketクラスのインスタンスを生成している.コンストラクタに渡し ている一つ目の引数args[0]が接続先のホスト名,二つ目の引数がポート番 号である(文字列として受け取った引数を整数化して渡している).このインス タンス生成は,Cの時のsocketシステムコールのようにソケットを開 くだけではなく,指定したホストとポートに接続するところまで行なう.接続に 失敗した場合は,原因に応じてUnknownHostExceptionなどの例外を発生す るのでこれをtry ... catchで処理している.
次に,ソケットsを通じてデータ送受信を行なうために,BufferedReaderのインスタンスin(受信用)とPrintWriterのインス
タンスout(送信用)を用意し,outを通じてリクエストを送信した
後,inを通じて受信したデータを表示している.
readLineはストリームから1行を読み込むメソッドである.
ServerSocket serverS = new ServerSocket(Integer.parseInt(args[0]));によって,ServerSocketクラスのインスタンスとして生成している.コン ストラクタの引数はポート番号である.この段階でCのときの listenシステムコールを行なったのと同様,接続待ち状態になり,クライアント からの接続が行なわれればserverS.accept()によって確立される.このと き,
new ServerThread(serverS.accept(), Integer.parseInt(args[1])).start();によってServerThreadクラスのインスタンスを生成することにより,新た なスレッド上で一つのサーバを実行する(Cの時にforkによってプロ セスを分岐させたのと似ている).生成されたServerThreadインスタンス のstart()メソッドを実行することにより,新スレッドのサーバを動かし, もとのスレッドではNew connectionのメッセージを表示した後,次のクラ イアントからの接続を待つ状態に戻る.
Threadクラスを継承したServerThreadクラスは,インスタンス変数 clientSとsleepTime,コンストラクタ,および,runメソッド からなる.runメソッドには,startメソッドによって開始される処 理を記述する.ここでは,接続が確立したソケットclientSを 通じて送受信を行なう,PrintStreamとBufferedReader のインスタンスを用意して,クライアントと同様にデータのやりと りを行なっている.
NAKAZAWA Koji