TopPage > 演習課題 > 演習3-1-1

MyServer.java

MyServer.javaには,2つのclassがあります. 一つは,class ClientProcThreadで,もう一つはclass MyServerです.

(1)class ClientProcThread

ソースコード 9〜48行目

このクラスは,各クライアントに対するソケットを保持し,クライアントからデータが送られてくるのを聞いて(Listen)います.

プログラムは一つですが,接続してきたクライアント毎にこのクラスがスレッド*1として生成されます(重要).

内部のインスタンス変数として,number, incoming, ... , myNameなどがクライアント毎に保持されています.

  • number ... クライアントの番号
    接続されたクライアント毎に重複しない番号を割り当てて管理します.
  • myName ... クライアントの名前.

インスタンスは,MyServerからClientProcThreadが呼び出されて,設定されます. また,このクラスのインスタンスが生成されるとrun()メソッドが常時動いて,通信データをチェックして,データが届いたら,全員に配る処理をします.

(2)class MyServer

ソースコード 50〜112行目

  • main() メソッド(79〜111行目)
    起動時に呼び出される処理です.
    • 81〜86行目: 最初に,必要な通信用の配列を確保します.
    • 93行目: サーバとして,ポートを開きます.そして,94行目のwhile以降で,クライアントからの接続を待ち受けます(ServerSocket).
    • 95行目: プログラムは,クライアントの接続があるまで,95行目のserver.accept()で待ち続けています.
      クライアントからの接続があると,受け入れの処理(accept)を行います.
    • 99〜101行目:通信に必要な処理(inputとoutputのインスタンス生成)を行います.
    • 103〜104行目:上で説明したクライアント用のスレッドClientProcThreadを生成し,必要なパラメータを渡し,スレッドを非同期実行します.
  • SendAll()メソッド (62〜71行目)
    ClientProcThreadから呼び出されます.接続している全てのクライアントにデータを送る処理をします.
    ClientProcThreadは,一つのクライアント情報しか持っていないので,全員情報を持っているclass MyServerからデータを送っています.
  • SetFlag()メソッド (74〜76行目)
    ClientProcThreadから呼び出されます.もし,ClientProcThreadが終了したとき(通信が切断してしまったとき)は,flagfalseにします.
    flagがfalseだと,SendAllではそのソケットにデータを送りません.
  • スレッドについて
    ソースコード 9〜48行目 ソースコードのclass ClientProcThread extends Thread {
    というのがあります. これは,Thread(スレッド)という特殊なプログラムのことで,並列に実行されるプログラムのことです.
    つまり,メインのプログラムが動いている最中に,並列に動き続けるプログラムです.
    今回は,myClientProcThread = new ClientProcThread[maxConnection];
    というプログラムで,接続クライアント毎に,スレッドが作られます.
    各スレッドは並列に実行し続けます.
    スレッドは,実行後に「run」が自動的に実行されます.
    runの中身は,while (true) で無限ループをしています.
    今回は,無限ループにしていますが,本来は何かの条件で,終了するのが普通です.
    "BYE"のメッセージをおくると,終了するようにしています.
    thread.001.png
    図1. メインウィンドウ
  • try-catchについて
    ソースコードの中で,try-catch文がいくつか使われています.
    try-catch文は,「例外」(Exception)が発生する可能性がある処理に良く使われます.
    例外というのは,なにかエラーのことですが,あまり想定されていないエラーを指します.
    例えば,なにかのエラーでファイルに書き込めない,0で割り算するとかなどです.
    使い方としては,エラーが発生しそうなところを,tryブロックで囲みます.
    catchは,エラーがおこったときにそのエラーをつかまえる(catchする)ところです.
    エラーが起こったときの対応をcatchブロックには書きます.
    catchの中の引数は catch (IOException e)などは,エラーの種類がはいります.
    その値をみて,エラー処理の動きを変えます.
    try-catch.001.png
  • なぜtry-catchが存在するか?

課題

  1. MyServer.javaファイルをコピーして,MyServer2.javaを作成し,クラス名もMyServer2にしてください.

  2. 現在のMyServerプログラムでは,クライアントとサーバの接続が確立したときに
    Hello, client No.1 ! Enter 'Bye' to exit.
    と表示されていますが,これを,MyServer2では
    1
    が出力されるように変更してください.(クライアントの番号だけ出力するようにします.)

ヒント

クラス名変更は,プログラム中にあるすべてのMyServerという文字列を,MyServer2にする必要があります.

next.gif 次の演習(3-2)


*1 メインのプログラム(メソッド)とは非同期に動作するメソッド群.
通常,メインプログラムからメソッドAを呼び出すと,同期的=メソッドAが終わるまでメインプログラムは停止状態=に実行されますが,メソッドAをスレッド化して呼び出すと,メインプログラムとメソッドAは同時に実行されるようになります.


添付ファイル: filethread.001.png 132件 [詳細] filetry-catch.001.png 132件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新     最終更新のRSS
Last-modified: 2018-10-25 (木) 19:00:34 (2008d)