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ではそのソケットにデータを送りません.
- MyServer.javaファイルをコピーして,MyServer2.javaを作成し,クラス名もMyServer2にしてください.
- 現在のMyServerプログラムでは,クライアントとサーバの接続が確立したときに
Hello, client No.1 ! Enter 'Bye' to exit.
と表示されていますが,これを,
1
に変更してください.(番号だけ出力するようにします.)
ヒント:
クラス名変更は,プログラム中にあるすべてのMyServerという文字列を,MyServer2にする必要があります.
次の演習(3-2)