1. EchoClient
- EchoClient는 자신이 보낸 데이터를 다시 자신이 받는 프로그램.
- 가장 기초적인 서버 프로그래밍을 보여준다.
- 에코서비스는 사용자가 입력한 문자를 서버가 받아 그대로 사용자에게 돌려주는 기본적인 프로그램이다.
- EchoClient 프로그램은 사용자로 부터 입력 받은 문자열을 서버로 보낸다.
- 서버가 보낸 문자열을 화면 상에 출력해준다.
<EchoClient의 소스코드>
1) Socket sock = new Socket("127.0.0.1", 10001); // 클라이언트 소켓 인스텀스 생성. ip 주소와 소켓 넘버를 입력한다.
2) BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
// 콘솔상에서 사용자가 입력한 데이터를 읽어들이는 스트림 생성!
3) OutputStream out = sock.getOutputStream(); //서버로 데이터를 보내는 출력 스트림 생성!
4) InputStream in = sock.getInputStream(); // 서버로 부터 데이터를 읽어들이는 입력스트림 생성!
5) PrintWriter pw = new PrintWriter(new OutputStreamWriter(out)); //문자열을 출력 할 수 있는 필터스트림 장착!
6) BufferedReader br = new BufferedReader(new InputStreamReader(in)); //문자를 빠르게 받아올 수 있는 버퍼필터스트림 장착!
7) while((line = keyboard.readLine()) != null) //사용자의 입력을 받아들인다.
8) if(line.equals("quit")) break; // 만약 사용자가 quit를 반환 할때 while문을 빠져 나온다.
9) pw.println(line); // 사용자가 입력한 문자열을 서버에 전달한다.
10) pw.flush(); // 버버를 비운다.
11) String echo = br.readLine(); //서버가 전달한 문자를 읽어온다.
12) System.out.println("서버에서 읽은 문자열 :" + echo);// 서버로부터 읽어온 문자열을 출력한다.
13) pw.close(); //스트림 종료
br.close(); //스트림 종료
sock.close();//소켓 종료
2. EchoServer
- EchoClient가 보낸 문자열을 받아 다시 EchoClient에게 보내준다.
- 하나의 EchoClient가 EchoServer를 차지하면 다른 클라이언트들은 이 서버를 사용할 수 없다.
<EchoServer의 소스코드>
1) ServerSocket server = new ServerSocket(10001); // 10001 소켓 넘버를 가진 서버소켓 인스턴스 생성
2) Socket sock = server.accept(); // 클라인언트의 접속을 기다린다.
3) InetAddress inetaddr = sock.getInetAddress(); //클라이언트의 ip주소를 가져온다.
4) OutputStream out = sock.getOutputStream(); //클라이언트에 데이터를 전달해줄 출력스트림 생성!
5) InputStream in = sock.getInputStream(); // 클라이언트에 데이터를 전달해줄 수 있는 입력스트림 생성.
6) PrintWriter pw = new PrintWriter(new OutputStreamWriter(out)); // 문자열을 출력해 줄수 있는 필터스트림 장착!
7) BufferedReader br = new BufferedReader(new InputStreamReader(in)); // 문자열을 빠르게 읽어들일 수 있는 버터 필터스트림 장착!
8) while((line = br.readLine()) != null){ // 클라이언트로 부터 문자열을 읽어 온다.
9) System.out.println(" 클라이언트가 보낸 문자열 : " + line);
10) pw.println(line); //다시 클라이언트로 문자열을 보낸다.
11) pw.close(); // 스트림 종료
br.close(); // 스트림 종료
sock.close(); // 소켓 종료
3. EchoThreadServer
- 기존 EchoServer와는 다르게 EchoTreadServer는 Thread를 생성하는 서버이다.
- 쓰레드를 클라이언트가 접속 할 때마다 생성하여, 메인 서버는 오직 클라이언트의 접속을 받아주고,
각각의 클라이언트에 스레드를 할당 해주는 역할을 한다.
- 때문에 쓰레드를 이용하여 많은 클라이언트의 접속을 허용한다.
<EchoThreadServer의 소스코드(1) >
<<메인 메소드에서의 실행을 보여주고자 한다.>>
1) ServerSocket server = new ServerSocket(10001); // 서버 소켓 인스턴스 생성.
2) Socket sock = server.accept(); //클라이언트의 접속을 기다린다.
3) EchoThread echothread = new EchoThread(sock);
// 클라이언트가 접속 했다면, 스래드를 생성하고 소켓의 참조변수를 전달한다.
4) echothread.start(); //쓰레드 실행!!
<EchoThread 소스코드 (2)>
1) InetAddress inetaddr = sock.getInetAddress(); // 클라이언트의 주소값을 반환한다.
2) OutputStream out = sock.getOutputStream(); //클라이언트로 데이터를 보낼 수 있는 출력스트림 생성.
3) InputStream in = sock.getInputStream(); // 클라이언트로부터 데이터를 읽어올 수 있는 입력스트림 생성
4) PrintWriter pw = new PrintWriter(new OutputStreamWriter(out)); // 문자열을 출력할 수 있는 필터스트림 장착!
5) BufferedReader br = new BufferedReader(new InputStreamReader(in));
// 빠르게 문자열을 읽어올수있는 버퍼필터스트림 장착!
6) while((line = br.readLine()) != null) //클라이언트로부터 문자열을 읽어 온다.
7) pw.println(line); // 읽어온 문자열을 다시 클라이언트로 보낸다! echo!!
4. EchoServer와 EchoThreadServer의 차이점
/* 가장 큰 차이점은 역시 쓰레드의 존재 유무이다. EchoServer의 경우는 클라이언트가 접속하면, 다른 클라이언트는 접속이 불가능. 해당 서버를 그 클라이언트가 차지하고 있기 때문. EchoThreadServer의 메인 서버는 단순히 클라이언트를 맞이하는 용도로만 쓰이고, 메인 서버가 쓰레드를 클라이언트에게 각각 할당해주어 여러 클라이언트가 동시에 해당 서버를 이용할 수 있게 한다.
*/
'IT Trend' 카테고리의 다른 글
EchoServer 분석소스 (0) | 2016.12.12 |
---|---|
EchoClient 분석소스 (0) | 2016.12.12 |
Chat 서비스 분석 (0) | 2016.12.12 |
객체란 무엇인가? (0) | 2016.10.10 |
객체지향으로 무인시스템 설계하기 (0) | 2016.10.10 |