FIF's 코딩팩토리

[Java]소켓(Socket)을 이용한 에코서버(Echo Server) 구현 본문

Back-End/Java(자바)

[Java]소켓(Socket)을 이용한 에코서버(Echo Server) 구현

FIF 2019. 12. 23. 13:38
반응형

에코란 메아리다.

 

에코 서버란, 클라이언트가 전송해 주는 데이터를 그대로 되돌려 전송해 주는 기능의 서버를 의미한다.

클라이언트가 서버로 데이터를 전송하면 서버는 그 데이터를 받았다가 그대로 다시 되돌려 보내준다.
에코 클라이언트와 서버 모델의 특징은 클라이언트가 서버로부터 몇 바이트의 데이터를 수신할 것인지 예상할 수 있다는 것이다.
왜냐하면 전송한 데이터 만큼 되돌려 받기 때문이다.

 

다음은 에코 클라이언트 측에서 문자열 데이터를 보내면 에코 서버측에서 수신후그 데이터를 다시 에코 클라이언트에 재전송 하는 프로그램이다.

 

데이터 흐름은 아래와 같다.

에코 클라이언트 -> 에코 서버 -> 에코 클라이언트

 

socketEchoServer

package socketecho;

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

public class socketServer {
	private ServerSocket serverSocket; // 서버 소켓
	private BufferedReader br; // 클라이언트로부터 전달받은 메시지를 읽어드릴 버퍼 메모리
	private PrintWriter pw; // 클라이언트로 메시지를 보냄
	private Socket clientSocket; // 클라이언트 소켓

	public static void main(String[] args) {
		new socketServer();
	}

	public socketServer() {
		init();
	}

	public void init() {
		try {
			serverSocket = new ServerSocket(8981); // 현재 아이피로 8981포트를 사용하여 서버 오픈
			System.out.println("Server is ready");
			System.out.println("connect clinet...");

			clientSocket = serverSocket.accept(); //
			System.out.println("Client has accepted");

			br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // 클라이언트로 부터 데이터를 읽어올 준비
			pw = new PrintWriter(clientSocket.getOutputStream());// 클라이언트로 부터 데이터를 보낼 준비

			String readData = ""; // 클라이언트로 부터 읽어온 데이터를 저장할 공간

			while (!(readData = br.readLine()).equals(null)) {
				System.out.println("from Client>" + readData);
				pw.println(readData);// 읽은 메시지를 그대로 클라이언트에 다시 보냄
				pw.flush();// 프린트 라이터 메모리를 초기화 시켜야 데이터가 보내짐
			}
			clientSocket.close();
		} catch (Exception e) {

			e.printStackTrace();
		}
	}
}

 

 

socketEchoClient

package socketecho;

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

public class socketClient {
	private Socket clientSocket; // 클라이언트 소켓
	private BufferedReader br; // 클라이언트로부터 전달받은 메시지를 읽어드릴 버퍼 메모리
	private PrintWriter pw; // 클라이언트로 메시지를 보냄
	private Scanner sc; // 데이터 입력

	public static void main(String[] args) {
		new socketClient();
	}

	public socketClient() {
		init();
	}

	public void init() {
		try {
			clientSocket = new Socket("localhost", 8981);
			System.out.println("Server Connect");

			br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));// 서버로 부터 데이터를 받아올 준비
			pw = new PrintWriter(clientSocket.getOutputStream());// 서버로 데이터를 보낼 준비

			sc = new Scanner(System.in);//입력한 데이터를 읽을 준비

			//System.out.println("");
			String inputData = "";//입력한 데이터를 저장할 공간

			while(!inputData.equals("exit")) {
				System.out.print("to Server: ");
				pw.println(sc.next());//보낼 내용을 읽어와서 서버로 보낸다
				pw.flush();//프린터 라이터 메모리를 초기화 시켜서 내부에 있던 데이터를 서버로 전송한다

				System.out.println("from Server: " + br.readLine()); //서버에서 받은 데이터를 표기한다.
			}
			clientSocket.close();//연결 종료하면 소켓을 닫는다.
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

서버 실행 화면

 

 

클라이언트측 에서 데이터를 전송하면 서버는 받은 데이터를 다시 그대로 클라이언트로 보내준다.

"exit" 를 입력하면 프로그램은 종료된다.

반응형

'Back-End > Java(자바)' 카테고리의 다른 글

[Java] 필드(field)  (0) 2020.02.18
[Java] http를 이용한 에코서버 (Echo Server)구현  (0) 2019.12.23
[Java] String format 예제  (0) 2019.11.26
[Java] Set  (0) 2019.11.07
[Java] 제네릭(Generic) 사용 예  (0) 2019.11.07
Comments