クライアント・サーバプログラム

Javaでのネットワークプログラミングは,C言語に比べて,より抽象化された機 能として提供されており,プログラムを書くことも理解することも容易である.

演習 7   ダウンロードしたサンプル[*]のうち,sample/java-csディ レクトリ中のclient.javaserver.java をコンパイルして実行せ よ.

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のサーバ,クライアントのサンプルと の間でも正常に通信が可能である.これを確認せよ.

client.javaの概要
コマンドに対する引数はmainへの引数argsで文字列の配列として受 け取っている.配列の内容はCの場合と異なり,一つ目の引数がargs[0]に入ることに注意.次に,
   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行を読み込むメソッドである[*]

server.javaの概要
サーバプログラム側では,サーバ用のソケットを
   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クラスは,インスタンス変数 clientSsleepTime,コンストラクタ,および,runメソッド からなる.runメソッドには,startメソッドによって開始される処 理を記述する.ここでは,接続が確立したソケットclientSを 通じて送受信を行なう,PrintStreamBufferedReader のインスタンスを用意して,クライアントと同様にデータのやりと りを行なっている.

NAKAZAWA Koji
2014-09-30