OkayamaAi / CS0

ソフトウェア工学Ⅱのグループ課題の練習用に作成。昨年、発展プログラミング演習Ⅱの授業の最終課題で作成した『ChatServer』をグループで作成する。
0 stars 0 forks source link

クライアントの情報を保存する処理の追加。(複数のクライアントを管理) #5

Open OkayamaAi opened 9 years ago

OkayamaAi commented 9 years ago

複数クライアントからの接続を受け取るために、サーバが接続を受け取ったときクライアントごとに処理を担当するハンドラを作成するようにする。

《ChatServerクラス》 1. クライアントのハンドラをしまっておくリストを作成する。「clients(List型)」 import文も適宜追加。 2. クライアントごとに作成されるChatClientHandlerをリストに格納する。
リストはハンドラのオブジェクトを作成する際に、引数として与える。
3. クライアントの名前を取得し、「○○ connected.」とサーバに表示する。 4. 継承しているThreadクラスのstartメソッドを呼んでおく。これによってrunメソッドと並列処理を行う準備が完了する。

《ChatClientHandlerクラス》 1. ChatServerクラス同様、クライアントのリストを作成する。import文も適宜追加。 2. コンストラクタに引数「client(List型)」を追加する。 ※できたら 3. 初期の名前のつけ方を変更する。数字を増やしていく。 しかし、前の人がいなくなった場合はその番号を新しく入った人が使うようにする。

OkayamaAi commented 9 years ago

《ChatServer.java》 import java.net.; import java.io.; import java.util.*;

public class ChatServer{ /* フィールド / private ServerSocket server; private List clients = new ArrayList();//クライアント一覧を作成 /* メソッド  / private void listen(){ try{ server = new ServerSocket(18080);//ポート番号を引数にサーバをたてる

        System.out.println("Echoサーバをポート18080で起動しました。");

        while(true){
            Socket socket = server.accept();//クライアントの接続を待つ
            ChatClientHandler handler = new ChatClientHandler(socket,clients);
            clients.add(handler);//クライアントのListに追加
            System.out.println(handler.getClientName() + " connected.");

            handler.start();//
        }

    } catch (IOException e){
        e.printStackTrace();
    }

}

public static void main(String[] args){
ChatServer echo = new ChatServer();
echo.listen();    
}

}

OkayamaAi commented 9 years ago

《ChatClientHandler.java》 /*

プログラム名:チャットサーバ ファイル名:ChatClientHandler.java

/ import java.net.; import java.io.; import java.util.;

public class ChatClientHandler extends Thread{//Threadクラス←既存 /* フィールド  / private Socket socket;//クライアントを表すソケット private String name;//クライアントの名前 private List clients;//接続クライアント一覧

/** コンストラクタ  */
ChatClientHandler(Socket sock,List clients){
    this.socket = sock;
    this.clients = clients;
    setInitialName();
}

/**  メソッド  */
/* ゲッター (ユーザ名・ユーザ(object))*/
public String getClientName(){return name;}//クライアントの名前

public ChatClientHandler getHandler(){
    return this;//自身のハンドラを返す
}
/* セッター (ユーザ名・ユーザ名(自動)・所属グループ)*/
public void setClientName(String name){ this.name = name; }
public void setInitialName(){//名前をつける
String name = "undefined";
    int num = 1;

    for(int i = 0;i < clients.size(); i++){
        ChatClientHandler handler = (ChatClientHandler)clients.get(i);
        if(handler.getClientName().equals(name + num)){//同じ名前の人がいたら
            num ++;
        }   
    }
    this.name = name + num ;
}

/*  並列実行を行うときに実行されるメソッド */
public void run(){
}

}