소켓 통신(Socket Communication): 네트워크 프로그래밍
소켓 통신은 네트워크를 통해 데이터 전송을 가능하게 하는 기술로, 클라이언트와 서버 간의 양방향 통신을 지원합니다.
소켓은 운영체제에서 제공하는 API로, 네트워크 프로그래밍에서 데이터 전송을 위한 엔드포인트 역할을 합니다.
인터넷이나 로컬 네트워크를 통해 데이터를 전송하는 데 널리 사용되며, 웹 서버, 채팅 애플리케이션, 게임 서버 등 다양한 분야에서 활용됩니다.
사용 이유
- 실시간 통신: 소켓은 클라이언트와 서버 간의 실시간 데이터 전송을 지원합니다.
이는 채팅 애플리케이션, 온라인 게임 등에서 주로 사용되는 요소입니다. - 양방향 통신: 소켓은 클라이언트와 서버 간의 양방향 통신을 가능하게 합니다.
즉, 클라이언트가 데이터를 전송하면 서버가 응답할 수 있으며, 반대로도 가능합니다. - 유연성: 소켓 통신은 TCP/IP 프로토콜을 기반으로 하여 다양한 네트워크 환경에서 사용할 수 있습니다.
이는 전송 계층에서의 유연성을 제공합니다. - 비용 효율성: 소켓 통신을 사용하면 별도의 메시징 시스템이나 프로토콜을 구축할 필요가 없으므로, 개발 비용을 절감할 수 있습니다.
소켓 통신의 기본 원리
#1 소켓 생성: 클라이언트와 서버는 각각 소켓을 생성
#2 서버 바인딩: 서버는 특정 포트 번호와 IP 주소에 소켓을 바인딩하여 클라이언트의 요청을 수신할 준비
#3 클라이언트 연결: 클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 서버에 연결 요청
#4 데이터 전송: 연결이 성공하면 클라이언트와 서버는 데이터를 양방향으로 통신
#5 연결 종료: 데이터 전송이 완료되면 소켓을 닫아 연결 종료
예제 코드
클라이언트가 서버에 메시지를 전송하고, 서버가 해당 메시지를 다시 클라이언트에게 반환하는 예제
#1 서버 측 코드
import java.io.*;
import java.net.*;
public class SimpleServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("Server Start. Port: 12345");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("Client Connect");
// 클라이언트와의 통신 스레드 생성
new Thread(() -> handleClient(clientSocket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void handleClient(Socket clientSocket) {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
String message;
while ((message = in.readLine()) != null) {
System.out.println("Client Message: " + message);
out.println("Server Response: " + message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ServerSocket을 사용하여 포트 12345에서 클라이언트의 연결을 기다립니다.
클라이언트가 연결되면 새로운 스레드를 생성하여 handleClient 메서드에서 클라이언트와의 통신을 처리합니다.
클라이언트로부터 메시지를 받아서 이를 출력하고, 동일한 메시지를 클라이언트에게 응답합니다.
#2 클라이언트 측 코드
import java.io.*;
import java.net.*;
public class SimpleClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 12345);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
out.println("Hi, Server!");
String response = in.readLine();
System.out.println("Server Response: " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
서버에 연결하고, 메시지를 전송한 후 서버의 응답을 출력한 후 "Hi, Server!"라는 메시지를 서버에 보냅니다.
마무리
소켓 통신은 네트워크 프로그래밍에서 필수적인 기술로, 클라이언트와 서버 간의 실시간 데이터 전송을 가능하게 합니다.
Socket 통신은 실시간 커뮤니케이션을 구현하는 데 필수적인 도구입니다.
소켓 통신의 기본 원리를 이해하고, 이를 활용한 간단한 예제 코드를 통해 실제 환경에서 어떻게 적용되는지를 살펴보았습니다. 소켓 통신을 통해 보다 유연한 네트워크 애플리케이션을 구축할 수 있습니다.
'IT · 인터넷' 카테고리의 다른 글
[Java] ClassCastException: 잘못된 타입으로 객체 캐스팅 (1) | 2025.01.26 |
---|---|
[Java] 인터셉터 (Interceptor): 요청과 응답을 가로채는 기술 (2) | 2025.01.25 |
엑셀에서 알아두면 유용한 함수 10가지 (0) | 2025.01.22 |
엑셀 맞춤법 검사 기능 사용방법 및 끄는 방법 (0) | 2025.01.21 |
[Java] NullPointerException: "Cannot invoke 'java.util.List.add(Object)' because '...' is null" (2) | 2025.01.15 |