OkayamaAi / CS0

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

クライアントとデータのやりとりをするための処理を追加。(接続を開く・閉じる、送信・受信) #6

Open OkayamaAi opened 9 years ago

OkayamaAi commented 9 years ago

作成したハンドラクラスとサーバでデータのやり取りを行うための処理を追加する。

《ChatClientHandlerクラス》

1. 入出力ストリームを開くopenメソッドを追加する。 →BufferedReader,BufferedWriterを使用 2. クライアントからデータを受け取るreceiveメソッドを追加する。 →開いた入力ストリームを使用 3. 文字列を受け取り、クライアントにデータを送信するsendメソッドを追加する。 →開いた出力ストリームを使用 4. クライアントとの接続を閉じるメソッドを追加する。 →入出力ストリーム、ソケットを閉じる

《 ChatServerクラス》

ChatClientHandlerクラスで作成したメソッドを用いて、接続を行っているクライアント以外のクライアント全員に接続を知らせる処理を追加する。

OkayamaAi commented 9 years ago

《ChatClientHandler.java》

・フィールドに追加
private BufferedReader in;// private BufferedWriter out;//

・runメソッドの中に追加 try{ open();

        while(true){
            String message = receive();//受け取ったメッセージをmassageに格納
            System.out.println(getClientName() + ": "+ message);
            send(getClientName() + ": "+ message);
        }
    }catch(IOException e){
        e.printStackTrace();

    }finally{
        close();
    }

・メソッドの追加 /+++++++++++++サーバの基本機能を実行するためのメソッド++++++++++++++/ /* クライアントとのデータのやり取りを行うストリームを開くメソッド */ public void open() throws IOException { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); }

/* クライアントからデータを受け取るメソッド */
String receive() throws IOException{
    String message = in.readLine();
    //System.out.println(message);
    return message;
}
/* クライアントにデータを送信するメソッド */
void send(String message) throws IOException{
    out.write(message);//messageの中身をバッファに書き込む
    out.write("\r\n");//(ネットワークの改行)
    out.flush();//バッファの文字をクライアント側に画面出力
}
/* クライアントとの接続を閉じるメソッド */
void close(){
    ChatClientHandler removeHandler = this;
    ChatClientHandler handler = null;

    clients.remove(removeHandler);//クライアントをリストから消去
    if(in != null){try{ in.close(); } catch(IOException e ){}}
    if(out != null){try{ out.close(); } catch(IOException e ){}}
    if(socket != null){try{ socket.close(); } catch(IOException e ){}}
    //closeメソッドが例外を投げるかもしれないので例外処理    

}
OkayamaAi commented 9 years ago

《ChatServer.java》※全文

/*

プログラム名:応答サーバ  ファイル名: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.");

            for(int i = 0;i < clients.size();i++){//自分以外のユーザに接続を知らせる
                ChatClientHandler otherHandler = (ChatClientHandler)clients.get(i);
                if(otherHandler != handler){//自分以外なら
                    otherHandler.send(handler.getClientName() + " connected.");
                }
            }

            handler.start();//handler.receive(),send()の代わりに呼び出す
        }

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

}

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

}