본문 바로가기

개발/소켓 프로그래밍

[1] 에코 서버 만들기

반응형

먼저 에코 서버를 만들어 봅시다

에코 서버의 동작 원리는 다음과 같습니다

1. 클라이언트가 서버에게 문자열을 전송한다

2. 서버는 전달받은 문자열을 그대로 클라이언트에게 리턴한다

 

서버를 구현하기 위해서는 아래와 같은 구현이 필요합니다

1. 서버는 항상 클라이언트의 요청을 대기한다

2. 요청이 확인되면 클라이언트에게 데이터를 반환한다

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket();
            [1] serverSocket.bind(new InetSocketAddress("localhost", 1234));
            Socket socket = null;
            [2] while ( (socket = serverSocket.accept()) != null) {
                InputStream inputStream = socket.getInputStream();
                OutputStream outputStream = socket.getOutputStream();
                byte[] data = new byte[1024];
                [3] int read = inputStream.read(data);
                [4] String s = new String(data, 0, read, "UTF-8");
                System.out.println(s+" from client");
                outputStream.write(data);
            }
        }
        catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}

요구사항을 그대로 구현한 코드 입니다

 

[1] : 서버가 감시할 특정 포트를 지정합니다

[2] : 요청이 올때까지 block 됩니다 요청이 오면 loop안에 진입하게 되게 요청 처리후 다시 무한 대기합니다

*소켓은 OS마다 구현이 다른데요 java는 모든 시스템에서 동작해야 합니다

따라서 소켓의 내부 구현을 따라 들어가보면 이를 서포트 하기 위한 로직이 있는데 이걸 가릴려고 엄청 감싸놨습니다

어렵게 말하면 이를 facade 패턴으로 구현되어있다고 합니다(같은 코드도 관점에 따라 적용된 패턴은 달라 보일 수 있습니다)

쉽게 말하면 "알 필요 없다"입니다...ㅋㅋ

[3] : 스트림에서 읽어온 데이터를 버퍼에 저장합니다

[4] : 읽어온 바이트를 스트링으로 변환합니다

3,4번 과정을 편하게 해줄 친구들이 있지만, 날 것 그대로 구현해보고 싶어 오프셋이랑 끝위치 다 지정했습니다!

 

다음으로 클라이언트 코드를 살펴보겠습니다

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket();
            socket.connect(new InetSocketAddress("localhost", 1234));
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();
            byte[] data = new byte[1024];
            String s = "hi";
            data =  s.getBytes("UTF-8");
            outputStream.write(data);
            inputStream.read(data);
            System.out.println(new String(data, "UTF-8")+" from server");
        } catch (IOException e) {
            System.out.println(e.toString());
        }
    }
}

서버와 다르게 요청 한번만 전송하고 종료되는 친구라 설명이 필요 없습니다! 아주 쉽습니다!!

반응형

'개발 > 소켓 프로그래밍' 카테고리의 다른 글

소켓 프로그래밍 시작 전 사전지식  (0) 2022.09.01
다중 채팅 서버 실습  (0) 2022.09.01