Creating a simple echo server

2023. 2. 14. 17:19자바

서버가 요청하는 애플리케이션과 소통하려면

특수 소프트웨어를 사용하여 메시지를 주고 받습니다.

 

이 소프트웨어를 소켓이라고 합니다.

하나의 소켓은 클라이언트 측에 있습니다.

다른 소켓은 서버쪽에 있습니다.

 

그들끼리 연결하여 통신할 수 있습니다!

 

소켓의 종류에는 여러가지가 있습니다.

  • datagram sockets
  • stream sockets (TCP를 자주 사용하는)
  • raw sockets(일반적으로 IP 수준에서 쓰이는)

 

우리는 우리의 클라이언트/서버용 TCP sockets에 초점을 맞출 것입니다.

간단한 에코서버를 만들어보겠습니다.

 

이 서버는 클라이언트로부터 텍스트 메시지를 받고, 즉시 해당 클라이언트로 다시 보냅니다.

단순합니다.

 

SimpleEchoServer class의 정의부터 해보겠습니다.

초기 서버 메시지가 표시됩니다.

public class SimpleEchoServer {
    public static void main(String[] args) {
        System.out.println("Simple Echo Server");
 ...
    }
}

 

메서드 본문의 나머지부분은 예외를 처리하는 일련의 try 블록으로 구성됩니다.

첫번째 try 블록에서 ServerSocket 인스턴스는 매개변수로 6000을 사용하여 생성됩니다.

 

try (ServerSocket serverSocket = new ServerSocket(6000)){
        System.out.println("Waiting for connection.....");
        Socket clientSocket = serverSocket.accept();
        System.out.println("Connected to client");
    ...
    } 
catch (IOException ex) {
    // Handle exceptions
    }

 

ServerSocket class는 클라이언트의 요청을 받기 위해 서버에서 사용하는 특수 소켓입니다.

이것의 인수는 port number입니다.

 

아, 6000이 port number을 의미하는 거였군요.

 

다시, 서버 IP 주소를 가진 컴퓨터에 설치됩니다.

 

운영 체제가 컴퓨터에서 서비스를 요청받았을 때, port number라는 것을 받게 됩니다.

이 port number는 요청을 전달해야하는 서버를 식별해주는 역할을 합니다.

 

따라서 서버는 IP주소와 port number의 조합으로 식별됩니다.

 

서버가 위치한 컴퓨터의 IP가 반드시 서버에 중점을 두는 것은 아니지만,

클라이언트는 궁극적으로 이 IP 주소를 알아야만 합니다.

 

다음 코드에서, ServerSocket class의 인스턴스는 생성되고 accept 메서드가 호출됩니다.

 

ServerSocket은  클라이언트로부터 요청을 받을 때까지

accept 메서드의 호출을 Blocking합니다.

Blocking이란 메서드가 리턴될 때까지 프로그램을 중단함을 의미합니다.

 

클라이언트로부터 요청을 받으면,

accept 메서드는 해당 클라이언트와 서버간의 연결을 나타내는 Socket class 인스턴스를  리턴합니다.

 

이 client socket이 만들어진 후에, 클라이언트는 서버로 메세지를 전달할 수 있습니다.

 

    try (BufferedReader br = new BufferedReader( new InputStreamReader( clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter( clientSocket.getOutputStream(), true)) {
        ...
        }
}

서버 <= 클라이언트

우리는 클라이언트로부터 온 메세지를 읽기 위해서 BufferedReader 인스턴스를 사용할 것입니다. 

BufferedReader 인스턴스client socket의 getInputStream 메서드를 사용하여 만들어집니다.

 

서버 => 클라이언트

우리는 PrintWriter 인스턴스를 사용하여 클라이언트에 응답합니다. 

이는 client socket의 getOutputStream 메서드를 사용하여 만들어집니다.

 

PrintWriter constructor의 두번째 인자는 true로 설정됩니다.

 

즉, out 객체를 사용하여 보낸 텍스트는 사용 후 자동으로 flush 된다는 의미입니다.

텍스트가 소켓에 기록이 되면, 버퍼가 가득 차거나 플러시 메서드가 호출될 때까지 버퍼에 남아있습니다.

 

위처럼 자동 플러시를 수행하면 버퍼 플러시를 기억할 필요없어 편리하지만,

과도하게 플러시가 발생할 수 있습니다.

 

 

 

다음 코드 세그먼트는 서버를 완성합니다.

readline 메서드는 클라이언트에서 한 번에 한 줄씩 라인을 읽습니다.

이 텍스트가 표시되고 그 다음 out 객체를 사용하여 클라이언트에게로 다시 전송됩니다.

 

String inputLine;
while ((inputLine = br.readLine()) != null) {
     System.out.println("Server: " + inputLine);
     out.println(inputLine);
     }

 

 

'자바' 카테고리의 다른 글

Creating a simple echo client  (0) 2023.02.14
The client/server architecture  (0) 2023.02.14
Using the URLConnection class withbuffers and channels  (0) 2023.02.14
Using the URLConnection class  (0) 2023.02.14
NIO support  (0) 2023.02.14