본문 바로가기
JAVA SE/Code

CODE [20.08.04/Day_19] Java SE / Network 네트워크 | 메아리 서버, 클라이언트 프로그램 구현

by 파프리카_ 2020. 8. 4.
728x90
반응형

step3 메아리 서버, 클라이언트 구성

 

서버는 클라이언트가 보낸 메세지를 입력받아 자신의 콘솔에 출력하고,

다시 그 메세지를 클라이언트로 보내는 역할을 지속적으로 한다.

클라이언트는 스캐너로 콘솔에서 서버에 보낼 메세지를 입력받아 서버로 출력하고,

서버가 보낸 메세지를 다시 입력받아 자신의 콘솔에 출력하는 작업을 지속적으로 한다.

 

실행 예)

Client Program 

서버에 보낼 메세지 : 안녕 메아리 서버 (→enter)

서버에서 온 메세지 : 안녕 메아리 서버 *server*

 

Server Program

12192.168.0.115 님이 입장하셨습니다.

12192.168.0.115 님 메세지 : 안녕 메아리 서버

 

 

Client Program 

: 스캐너로 입력받아 서버로 출력, 서버에서 보낸 메세지를 입력받아 콘솔에 출력
 두 작업을 지속적으로 진행한다.

 

/EchoClient.java

package step3.inst;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import common.IP;

public class EchoClient{
	public void go() throws UnknownHostException, IOException {
		Socket socket = null; //서버와 통신할 소캣
		Scanner scanner = null; //콘솔에서 입력받을 객체
		PrintWriter pw = null; //콘솔에서 입력받은 메세지를 서버에 출력하는 스트림
		BufferedReader br = null; //서버에서 (메세지 *server*)를 입력 받을 스트림
		
		try {
			socket = new Socket(IP.LOCAL, 5432);
			System.out.println("**Echo Client가 서버에 접속**");
			
			scanner = new Scanner(System.in);
			
			// 서버에 메세지 보내기
			pw = new PrintWriter(socket.getOutputStream(), true); //autoflush option
			
			// 서버로부터 온 메세지 읽기
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
			/*콘솔에서 입력받아 서버에 출력하고,
			 * 서버에서 입력받아 콘솔에 출력하는 일을
			 * 반복
			 */
			while(true) 
			{	
				String message = scanner.nextLine();
				if (message.equals("quit")) {
					pw.println("quit");
					System.out.println("**Echo Client 종료**");
					break;
				}
				
				else {
				//서버에 메세지를 보냄
				System.out.print("서버에 보낼 메세지: ");
				pw.println(message);
				
				//서버에서 메세지를 받음
				String result = br.readLine();
				System.out.println("서버에서 입력받은 메세지: " + result);
				}
			}
			
			
			
			
		} finally {
			if (scanner != null)
				scanner.close();
			if (socket != null)
				socket.close(); //socket을 닫아주면, br과 pw는 자동으로 끊어진다
		}//fin
		
	} //go method
	
	public static void main(String[] args) {
		try {
			new EchoClient().go();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

 

Server Program

: 1 대 1 서버, 클라이언트 프로그램
서버는 클라이언트의 메세지를 입력받아 자신의 콘솔에 출력하고 (ip + 메세지),
 그 메세지를 다시 클라이언트로 출력(+*server*)하는 작업을 지속적으로 수행한다

 

/EchoServer.java

package step3.inst;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
	public void go() throws IOException {
		ServerSocket serverSocket = null;
		Socket socket = null;
		BufferedReader br = null; //클라이언트 정보 입력받는 Stream
		PrintWriter pw = null; //클라이언트에 출력하는 Stream
		
		try {
			serverSocket = new ServerSocket(5432);
			System.out.println("**EchoServer 실행중**");
			
			//socket <- 대기하다가 클라이언트 접속하면 실행
			// Socket 반환
			socket = serverSocket.accept();
			
			//user <- 접속한 Client의 IP를 반환받음
			String user = socket.getInetAddress().toString();
			
			// br <- Client로 받은 메세지 객체
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
			// pw <- Client에 보낼 메세지 객체
			pw = new PrintWriter(socket.getOutputStream(), true); //auto flush
			
			while (true) {
				String message = br.readLine(); 
				
				if (message.equals("quit")) {
					System.out.println("**EchoServer 종료**");
					break;
				}
				else {
				// message <- Client에서 받은 메세지 내용
				System.out.println(user + " 님의 메세지: "+ message);
				// Client로 메세지를 출력
				pw.println(message + " *server*");
				}
			}
			
			
		} finally {
			if (socket != null)
				socket.close();
			if (serverSocket != null)
				serverSocket.close();
		}
	}
	
	
	public static void main(String[] args) {
		try{
			new EchoServer().go();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}
728x90
반응형