본문 바로가기
Network Study

소켓 프로그래밍(Socket Programming)

by xogns93 2024. 9. 26.

소켓 프로그래밍(Socket Programming)은 주로 클라이언트-서버 모델을 기반으로 통신을 처리합니다. 클라이언트와 서버는 서로 다른 역할을 수행하며, 레이어 4(전송 계층, TCP/UDP) 이상부터 이러한 클라이언트-서버 개념이 나타납니다. 서버와 서버 간의 통신이라는 개념은 존재하지 않으며, 서버-클라이언트 또는 클라이언트-서버 간의 통신이 이뤄집니다.

이유: 레이어 4에서의 클라이언트-서버 모델

OSI 모델의 레이어 4(전송 계층)부터는 클라이언트-서버 모델이라는 개념이 등장합니다. 이는 통신의 양쪽이 다르게 정의된다는 의미입니다.

  1. 서버: 클라이언트의 요청을 수신하고, 그 요청에 대한 응답을 처리하는 쪽을 서버라고 합니다. 서버는 주로 정적인 IP 주소포트를 가지고, 클라이언트로부터 오는 연결 요청을 항상 대기합니다.

  2. 클라이언트: 서버로 요청을 보내고, 서버로부터 응답을 받는 쪽이 클라이언트입니다. 클라이언트는 동적으로 IP 주소나 포트를 할당받는 경우가 많고, 필요한 순간에 서버에 연결을 시도합니다.

서버 간 통신은 존재하지 않는 이유:

서버와 서버 간의 통신소켓 프로그래밍의 개념에서는 존재하지 않습니다. 이유는 서버는 항상 클라이언트로부터의 요청을 기다리며, 스스로 다른 서버에 요청을 보내지 않기 때문입니다.

  • 클라이언트는 요청을 보냄: 통신을 시작하는 주체는 항상 클라이언트입니다.
  • 서버는 요청을 받음: 서버는 클라이언트로부터의 요청을 대기하고 처리하는 역할을 합니다.

소켓 프로그래밍에서 클라이언트-서버 모델:

  1. 서버는 특정 포트 번호를 열어 두고, 클라이언트로부터의 연결을 기다립니다. 서버는 소켓을 생성하고 bind()를 통해 특정 포트를 할당받습니다.
  2. 클라이언트는 서버의 IP 주소와 포트 번호를 알고 있으며, 서버에 소켓 연결 요청을 보냅니다. 클라이언트는 서버의 IP와 포트로 소켓을 연결하여 데이터를 전송합니다.
  3. 서버는 클라이언트로부터 요청을 받으면, 연결을 수락(accept())하고, 클라이언트와 데이터를 주고받습니다.

소켓 통신의 흐름 (클라이언트-서버 모델 예시):

  1. 서버 측:

    • 소켓 생성 → 포트 바인딩 → 연결 대기(리슨) → 클라이언트 연결 요청 수락(accept) → 데이터 처리
  2. 클라이언트 측:

    • 소켓 생성 → 서버에 연결 요청(connect) → 데이터 송수신

클라이언트-서버 모델 예시 (TCP 기반):

// 서버 코드 예시 (Java TCP 소켓)
import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345); // 12345 포트에서 연결 대기
        System.out.println("서버 대기 중...");

        Socket clientSocket = serverSocket.accept(); // 클라이언트 연결 수락
        System.out.println("클라이언트 연결됨!");

        // 데이터 송수신
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            System.out.println("받은 메시지: " + inputLine);
            out.println("서버 응답: " + inputLine);
        }

        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }
}

// 클라이언트 코드 예시 (Java TCP 소켓)
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 12345); // 서버에 연결 요청

        // 데이터 송수신
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        out.println("안녕하세요 서버!"); // 서버로 메시지 전송
        System.out.println("서버로부터 응답: " + in.readLine()); // 서버 응답 출력

        out.close();
        in.close();
        socket.close();
    }
}

통신 과정:

  1. 서버ServerSocket을 사용해 12345 포트에서 연결 요청을 대기합니다.
  2. 클라이언트Socket을 생성해 localhost와 포트 12345로 연결 요청을 보냅니다.
  3. 서버는 연결을 수락하고, 클라이언트와 데이터를 주고받습니다.

요약:

  • 클라이언트-서버 모델레이어 4에서 시작되며, 서버는 클라이언트의 요청을 대기하고 응답을 처리합니다.
  • 소켓 프로그래밍에서는 서버와 서버 간의 통신이라는 개념은 없으며, 항상 클라이언트-서버 모델로 이루어집니다.
  • 클라이언트는 서버에 요청을 보내고, 서버는 그 요청을 수락해 데이터를 처리하는 방식으로 통신이 이루어집니다.