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ではそのソケットにデータを送りません.

課題

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

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

ヒント

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

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


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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新     最終更新のRSS
Last-modified: 2015-11-05 (木) 15:51:52 (3093d)