[JAVA] Socket으로 간단히 구현하는 클라이언트-서버 통신
오늘은 클라이언트와 서버에 대해 알아보겠습니다.
먼저 클라이언트와 서버의 관계에 대해 알아보아야 하는데요, 우리가 통신을 하기 위해서는 이 둘의 관계를 잘 알아야 합니다. 먼저 사진으로 간단하게 설명해보겠습니다.
클라이언트와 서버의 관계
클라이언트는 다양한 장치에서 존재할 수 있습니다. 예를 들어, 노트북, 핸드폰, 컴퓨터 등에서 클라이언트를 실행할 수 있습니다. 서버와 클라이언트는 네트워크 연결을 통해 소통합니다. 이때, 소켓을 통해 클라이언트와 서버가 연결되며 데이터를 주고받습니다.
1. 클라이언트
- 클라이언트는 네트워크에서 서버와 통신하는 역할을 하는 프로그램이나 장치입니다.
- 클라이언트는 서버에 연결하여 데이터를 요청하거나 서버로부터 데이터를 받아와 처리합니다.
- 클라이언트와 서버는 서로 다른 시스템(컴퓨터, 스마트폰, 서버, IOT 장치 등)에 존재할 수 있지만, 네트워크 연결을 통해 서로 소통합니다.
2. 서버
- 서버는 네트워크를 통해 다른 장치나 프로그램에게 서비스나 자원을 제공하는 컴퓨터 시스템 입니다.
- 서버는 클라이언트로부터 요청을 받아 처리하고, 그에 대한 응답을 돌려주는 역할을 합니다.
- 간단히 클라이언트가 필요로 하는 데이터를 제공하거나, 특정 작업을 수행하는 시스템이라고 생각하면 됩니다.
이제 JAVA 에서 어떻게 클라이언트와 서버가 통신이 되는지 알아보겠습니다.
* 소켓
- 소켓은 네트워크에서 데이터를 송수신 하는 데 필요한 프로세스 간의 연결 지점을 의미합니다. 클라이언트와 서버는 소켓을 이용해 서로 데이터를 주고 받습니다.
- 소켓은 클라이언트와 서버에서 사용하는 방식이 다른데, 먼저 클라이언트에 소켓에 대해 알아보겠습니다.
오늘 학원에서 서버와 클라이언트의 통신으로, 채팅을 통해 각자 연결을 해봤는데, 이 부분으로 설명해보겠습니다.
JAVA 애플리케이션이 실행되면, MAIN 메소드는 기본적으로 메인 쓰레드에서 실행됩니다.
MAIN 메소드는 프로그램의 시작점을 나타내며, 그 실행 흐름을 담당하는 메인 쓰레드 입니다.
해당 코드에서 main 메소드는 클라이언트 애플리케이션의 실행 흐름을 시작하는 부분으로 소켓을 열고, 서버와의 연결을 시도하며, 필요한 작업을 실행합니다.
오늘 학원에서는 쓰레드를 상속받는 다른 클래스를 만들어 코드를 작성했는데, 이 부분은 뒤에서 설명하겠습니다.
클라이언트에서 사용하는 socket 은 서버의 ip주소 값과 포트값이 필요합니다. 이 부분을 꼭 매개변수에 작성해주어야 합니다. 이후 채팅을 보내고 받는 클래스의 메소드를 가지고 와서 start 해줍니다.
이제 서버 부분 코드를 보겠습니다.
서버에서 사용하는 ServerSocket은 클라이언트에서 사용할 socket 과는 달리 포트 번호만 넣으면 됩니다.
그 이유는 클라이언트는 서버의 ip 주소가 있어야 서버에 원하는 소켓을 전송할 수 있기 때문입니다.
이후 클라이언트에서 보낸 소켓을 출력하고, 다시 클라이언트에 채팅을 보내야 하기 때문에 전송하는 메소드도 가지고 와 start 로 실행시키는 모습입니다.
어떻게 입 출력할까?
PrintWriter 과 BufferedReader 로 입출력 하면 됩니다.
서버는 PrintWriter 로 클라이언트에게 메시지를 보내고, 클라이언트는 BufferedReader 로 서버가 보낸 메시지를 읽고, 응답을 PrintWriter 로 서버에게 보냅니다.
- PrintWriter
- 출력 스트림 클래스이며, 데이터를 문자형식으로 서버나 클라이언트로 보낼 때 사용합니다.
- println() 메소드를 사용하여 데이터를 한줄씩 전송할 수 있습니다.
- BufferedReader
- 입력 스트림 클래스이며, 데이터를 문자 형식으로 읽어올 때 사용합니다.
- readLine() 메소드를 사용하여 한 줄씩 읽어옵니다.