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が終了したとき(通信が切断してしまったとき)は,flagをfalseにします.
flagがfalseだと,SendAllではそのソケットにデータを送りません.
- スレッドについて
ソースコード 9〜48行目
ソースコードのclass ClientProcThread extends Thread {
というのがあります.
これは,Thread(スレッド)という特殊なプログラムのことで,並列に実行されるプログラムのことです.
つまり,メインのプログラムが動いている最中に,並列に動き続けるプログラムです.
今回は,myClientProcThread = new ClientProcThread[maxConnection];
というプログラムで,接続クライアント毎に,スレッドが作られます.
各スレッドは並列に実行し続けます.
スレッドは,実行後に「run」が自動的に実行されます.
runの中身は,while (true) で無限ループをしています.
今回は,無限ループにしていますが,本来は何かの条件で,終了するのが普通です.
"BYE"のメッセージをおくると,終了するようにしています.
図1. メインウィンドウ
- try-catchについて
ソースコードの中で,try-catch文がいくつか使われています.
try-catch文は,「例外」(Exception)が発生する可能性がある処理に良く使われます.
例外というのは,なにかエラーのことですが,あまり想定されていないエラーを指します.
例えば,なにかのエラーでファイルに書き込めない,0で割り算するとかなどです.
使い方としては,エラーが発生しそうなところを,tryブロックで囲みます.
catchは,エラーがおこったときにそのエラーをつかまえる(catchする)ところです.
エラーが起こったときの対応をcatchブロックには書きます.
catchの中の引数は catch (IOException e)などは,エラーの種類がはいります.
その値をみて,エラー処理の動きを変えます.
課題 †
- MyServer.javaファイルをコピーして,MyServer2.javaを作成し,クラス名もMyServer2にしてください.
- 現在のMyServerプログラムでは,クライアントとサーバの接続が確立したときに
Hello, client No.1 ! Enter 'Bye' to exit.
と表示されていますが,これを,MyServer2では
1
が出力されるように変更してください.(クライアントの番号だけ出力するようにします.)
ヒント:
クラス名変更は,プログラム中にあるすべてのMyServerという文字列を,MyServer2にする必要があります.
次の演習(3-2)