자바 소켓 통신

ksngh·2024년 4월 19일

자바

목록 보기
1/3

소켓은 컴퓨터 네트워크에서 통신을 위한 인터페이스를 제공하는 소프트웨어 모듈입니다.
프로세스 간의 통신을 가능하게 하며, 클라이언트와 서버 간의 통신에 사용됩니다.

소켓은 IP 주소와 포트 번호로 식별됩니다.
IP는 네트워크 위치를 나타내고, 포트 번호는 프로세스를 식별합니다.
클라이언트는 특정 서버의 IP주소와 포트 번호에 소켓을 열어서 연결을 시도하고,
서버는 해당 소켓에 대한 요청을 수락하거나 거부합니다.

예제코드 한 줄씩 뜯어보면서 파헤치기

  • 'ServerSocket'는 서버 측에서 클라이언트의 연결을 받아들이는 데 사용되는 클래스 입니다.

  • listener. accept() : 서버 소켓에서 클라이언트의 연결을 대기합니다. 클라이언트가 연결 요청을 하면 소켓 객체를 반환합니다. 일반적으로 무한 루프 안에서 호출되어 연결을 지속적으로 수락하고 통신을 처리합니다.

  • socket.getOutputstream() : 소켓 객체에서 출력 스트림을 얻습니다. 이 출력 스트림을 통해 데이터를 소켓으로 보낼 수 있습니다.

  • new OutputStreamWriter() : 소켓의 출력 스트림을 문자 출력 스트림으로 변환합니다. JAVA의 IO 클래스들은 바이트 단위로 데이터를 다루지만, 우리는 보통 문자열로 데이터를 다루므로 문자 출력 스트림을 사용합니다. OutputStreamWriter는 바이트 출력 스트림을 문자 출력 스트림으로 변환하는 역할을 합니다.

  • new BufferedWriter() : 버퍼는 데이터를 모아서 한 번에 전송함으로써 데이터를 효율적으로 전송할 수 있도록 돕습니다.

BufferedWriter bufferedWriter = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())
            );

결국 다음과 같은 함수는 소켓의 출력 스트림을 문자 스트림으로 변환 후 버퍼에 저장하는 함수입니다.
BufferedReader은 반대로 소켓으로부터 데이터를 읽는 함수겠죠?!

다음 while문 안에서는 inputMsg에 소켓에서부터 받은 메시지를 받고, 출력합니다. bufferedWriter.write()는 출력 메시지를 소켓에쓰고, flush 메서드를 호출하여 버퍼에 있는 데이터를 강제로 소켓에 전송합니다. 예제코드는 이 과정을 반복하는 코드입니다.

서버가 있으면 클라이언트도 있어야겠죠?! 다음은 클라이언트 예제 코드입니다.

socket = new Socket() 에는 호스트IP와 포트 번호가 들어갑니다.
위의 코드는 "192.XXX.XXX.XXX"라는 서버의 IP 주소와 9988이라는 포트 번호에 연결하는 클라이언트 소켓을 생성하는 것입니다. 해당 서버가 포트 9988에서 실행 중이고 네트워크에 접근 가능하다면, 이 코드는 클라이언트 소켓을 생성하고 해당 서버에 연결합니다.

연결이 되었다면 서버에서 설명하였던과 마찬가지로, bufferedWriter과 bufferedReader를 통해 소켓에서 데이터를 주고 받습니다. 예제코드의 입출력은 클라이언트에서 입력한 값이 서버에서 출력으로, 서버에서 입력한 값이 클라이언트에서 출력 값으로 나오게 됩니다.

profile
백엔드 개발자입니다.

0개의 댓글