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

* MyServer.java [#m1348627]

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

** (1)class ClientProcThread [#ncc7425d]
&color(black,#cccccc){''ソースコード''}; 9〜48行目

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

プログラムは一つですが,接続してきたクライアント毎にこのクラスがスレッド((メインのプログラム(メソッド)とは非同期に動作するメソッド群.&br;通常,メインプログラムからメソッドAを呼び出すと,同期的=メソッドAが終わるまでメインプログラムは停止状態=に実行されますが,メソッドAをスレッド化して呼び出すと,メインプログラムとメソッドAは同時に実行されるようになります.))として生成されます(重要).

内部のインスタンス変数として,number, incoming, ... , myNameなどがクライアント毎に保持されています.
- number ... クライアントの番号&br;
接続されたクライアント毎に重複しない番号を割り当てて管理します.
- myName ... クライアントの名前.

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

**(2)class MyServer [#o10f3516]
&color(black,#cccccc){''ソースコード''}; 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ではそのソケットにデータを送りません.

- スレッドについて~
&color(black,#cccccc){''ソースコード''}; 9〜48行目
ソースコードのclass ClientProcThread extends Thread {&br;
というのがあります.
これは,Thread(スレッド)という特殊なプログラムのことで,並列に実行されるプログラムのことです.~
つまり,メインのプログラムが動いている最中に,並列に動き続けるプログラムです.~
今回は,myClientProcThread = new ClientProcThread[maxConnection];~
というプログラムで,接続クライアント毎に,スレッドが作られます.~
各スレッドは並列に実行し続けます.~
スレッドは,実行後に「run」が自動的に実行されます.~
runの中身は,while (true) で無限ループをしています.~
今回は,無限ループにしていますが,本来は何かの条件で,終了するのが普通です.~
"BYE"のメッセージをおくると,終了するようにしています.~

#ref(thread.001.png,nolink,center)~
CENTER:図1. メインウィンドウ
- try-catchについて~
ソースコードの中で,try-catch文がいくつか使われています.~
try-catch文は,「例外」(Exception)が発生する可能性がある処理に良く使われます.~
例外というのは,なにかエラーのことですが,あまり想定されていないエラーを指します.~
例えば,なにかのエラーでファイルに書き込めない,0で割り算するとかなどです.~
使い方としては,エラーが発生しそうなところを,tryブロックで囲みます.~
catchは,エラーがおこったときにそのエラーをつかまえる(catchする)ところです.~
エラーが起こったときの対応をcatchブロックには書きます.~
catchの中の引数は catch (IOException e)などは,エラーの種類がはいります.~
その値をみて,エラー処理の動きを変えます.~
#ref(try-catch.001.png,nolink,center)~

- なぜtry-catchが存在するか?


** 課題 [#wa29fa0d]

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


''ヒント'':&br;&br;
%%%クラス名変更%%%は,プログラム中にある&color(red){''すべての''};''MyServer''という文字列を,''MyServer2''にする必要があります.

&size(16){[[&ref(http://yoslab.net/netprog/next.gif,nolink); 次の演習(3-2)>演習3-2 ネットワーク対戦ゲームクライアント]]};


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新     最終更新のRSS