백/Java

[Java] 자바(Java) 소켓 통신이란? 동작 원리와 코드

연지양갱 2023. 11. 23. 09:51
728x90
반응형
SMALL

자바를 공부하면서 가장 어려웠던 게 소켓 통신이었습니다...

대학교 수업 때에서도 과제로 나왔는데 확실히 알겠다!는 아니겠더라구요,, 머리가 안돌아가서 그런지,,

아무튼 소켓이 또 많이 중요하죠! 그래서 정리하겠습니다..

 

출처 : https://choo.oopy.io/6bd233ef-79fe-408c-b993-8cf8351460ec

 

소켓(Socket) 통신이란?

자바에서 소켓 통신은 두 컴퓨터 간의 네트워크 통신을 가능하게 하는 기술입니다. 

소켓은 한 컴퓨터에서 다른 컴퓨터로 데이터를 전송하는 통신 엔드포인트를 나타냅니다

자바의 java.net 패키지는 소켓 프로그래밍을 지원하며, TCP/IP 프로토콜을 기반으로 동작합니다.

소켓 통신은 보통 지속적으로 연결을 유지하면서 실시간으로 데이터를 주고받아야하는 경우에는 사용됩니다.

 

소켓은 클라이언트 소켓과 서버 소켓으로 구분되며, 소켓 간 통신을 위해서는 네트워크 상에서 클라이언트와 서버에 해당되는 컴퓨터를 식하기 위한 IP주소와 해당 컴퓨터 내에서 현재 통신에 사용되는 응용 프로그램을 식별하기 위한 포트 번호가 사용됩니다.

 

소켓 통신의 동작원리

1. 서버 소켓 생성

서버는 ServerSocket 객체를 생성하여 특정 포트에서 클라이언트의 연결 요청을 기다립니다.

ServerSocket의 accept()메소드는 클라이언트의 연결 요청이 들어올 때까지 대기하다가, 요청이 들어오면 Socket객체를 반환합니다.

ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();

 

2. 클라이언트 소켓 생성

클라이언트는 Socket 객체를 생성하여 서버에 연결합니다.

Socket 생성자는 서버의 IP 주소와 포트 번호를 인자로 받습니다.

Socket socket = new Socket(serverAddress, portNumber);

 

3. 데이터 교환

연결이 성립되면, 클라이언트와 서버는 소켓을 통해 데이터를 교환할 수 있습니다. 

데이터는 스트림을 통해 전송되며, Socket 객체의 getInputStream()과 getOutputStream() 메소드를 사용하여 입출력 스트림을 얻을 수 있습니다.

// 서버에서 스트림을 얻는 예
InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();

// 클라이언트에서 스트림을 얻는 예
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

 

4. 소켓 닫기

데이터 교환이 완료되면, Socket의 close() 메소드를 사용하여 소켓을 닫습니다.

이는 네트워크 자원을 해제하며, 더 이상 데이터를 전송할 수 없게 합니다.

// 서버에서 소켓을 닫는 예
clientSocket.close();
serverSocket.close();

// 클라이언트에서 소켓을 닫는 예
socket.close();

 

 

이렇게 해서 자바 소켓 통신을 이용하면, 다른 두 컴퓨터 간에 데이터를 직접 교환할 수 있습니다. 이를 활용하여 채팅 프로그램, 웹 서버, FTP 클라이언트 등 다양한 네트워크 애플리케이션을 개발할 수 있습니다.

반응형