에코(Echo) 서버와 클라이언트를 구현해보장~!!

안녕하세요

이번 시간에는 자바에서 에코 서버와 클라이언트를 구현해보는 시간을 가지겠습니다

에코 서버는 클라이언트가 보내주는 데이터에 대해 바로 답장해주는 서버로

실시간 채팅과는 좀 더 폐쇄적이고 수동적인 채팅 스타일 방식을 가졌다고 보면 됩니다.

자 어쨋든 예제 바로 들어갑니다


=========================================================

* [구현할 내용
 * Client가 Server에 접속하면
 * [1] 서버는 먼저 클라이언트에게 "안녕하세요? 클라이언트(ip)님~~" 메시지를 보낸다
 * [2] 클라이언트는 키보드 입력을 통해 서버에 응답 메시지를 보낸다.
 * [3] 서버는 클라이언트이 메시지를 듣고 메시지를 분석해서 3가지 유형의 답변을 보낸다.
 * (1) "안녕하세요" 또는 "하이" 란 메시지가 오면 => "반가워요~~"
 *  (2) "오늘 날짜는" 이란 메시지가 오면 => 오늘 날짜를 알려준다
 *  (3) 그 외 다른 메시지가 오면 => '~~님 어여 가!!" 란 메시지를 보내자
 *
 * */

// 순차적인 채팅. 메아리 채팅임

public class EchoServer {

public static void main(String[] args) throws IOException {

//ServerSocket, Socket
ServerSocket server=new ServerSocket(6666);
out.println("EchoServer Ready...");
Socket sock=server.accept();
String cip=sock.getInetAddress().getHostAddress(); // 클라이언트 IP 주소
out.println(cip+"님이 접속했어요");

//클라이언트가 접속하면 먼저 인사말을 건낸다
OutputStream os=sock.getOutputStream();
PrintWriter pout=new PrintWriter(os,true); // true값을 주면 auto flush
pout.println("안녕하세요? "+cip+"님~~");

// 클라이언트의 메시지를 듣는 스트림 얻기=> 필터링
InputStream is = sock.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));

// 반복문 돌면서 클라이언트이 메시지를 계속 듣고 그 메시지를 분석하여
// 메아리를 보낸다
//indexof 없으면 if(-1)

String cmsg="";
while((cmsg=br.readLine())!=null){
//cmsg를 분석하자
int i=cmsg.indexOf("안녕");
int j=cmsg.indexOf("하이");
int k=cmsg.indexOf("날짜");

if(i!=-1||j!=-1){
pout.println("반갑습니다");
}else if(k!=-1){
pout.println(new Date().toString());
}else{
pout.println(cip+"님 어여 가~~~");
}
}

br.close();
pout.close();
is.close();
os.close();
sock.close();
server.close();

}
}


=========================================================

현재 위의 소스는 에코서버쪽의 소스입니다.

자 다음은 에코 클라이언트의 소스입니다

=========================================================


public class EchoClient {

public static void main(String[] args) throws IOException {
//Socket생성=> 서버의 ip주소, port번호 필요
String ip=JOptionPane.showInputDialog("서버의 아이피 주소를 입력하세요");
int port=6666;

Socket sock=new Socket("ip주소",6666);
out.println("##서버와 접속됨");

//2) 서버에 접속하면 서버가 먼저 인사말을 건낸다.
//=> 클라이언트는 인사말을 듣고 콘솔에 출력하자
InputStream is=sock.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String serverMsg=br.readLine();
out.println("From Server>>"+serverMsg);

//3) 서버에 메시지를 보내기 위해 키보드 입력 스트림과 서버에 출력하는 스트림이 필요
//키보드 입력 스트림(System.in)
BufferedReader key=new BufferedReader(new InputStreamReader(System.in));

//4) 서버에 메시지를 보낼 출력스트림
PrintWriter pw=new PrintWriter(sock.getOutputStream(),true); // auto flush

String clientMsg="";

while((clientMsg=key.readLine())!=null){ // 키보드 입력
pw.println(clientMsg); // 5) 서버에 메시지를 전송
//6) 서버에서 보내오는 메시지를 듣는다
out.println("서버로부터 보낼 메시지를 입력하세요");
serverMsg=br.readLine();
out.println("From Server>>"+serverMsg);
}
}
}

=========================================================


자 이로써 두 개의 에코서버, 에코클라이언트 소스를 작성해봤습니다.

이 두 개의 소스코드의 실행결과는 아래와 같습니다(참고로 서버부터 먼저 실행해야합니다)



서버를 실행하면, 클라이언트의 접속을 무한정 기다립니다.




그리고 클라이언트를 실행하면 JOption 창이 뜨면서 서버의 아이피 주소를 입력하라고

나오게 됩니다.






접속이 되면 서버로부터 '안녕하세요' 라는 글귀가 나오고

서버에게 '날짜' 라는 키워드를 입력하면 서버가 날짜를 보내오고

안녕, 하이 라는 키워드를 입력하면 '반갑습니다' 라는 키워드를 보냅니다



댓글 없음:

댓글 쓰기