[java] 자바 소켓 프로그래밍을 위한 기본 개념

자바 소켓 프로그래밍은 네트워크 통신을 위해 사용되는 기술입니다. 이를 통해 클라이언트와 서버 간의 데이터를 주고받을 수 있습니다. 소켓 프로그래밍은 네트워크 소켓을 생성하고 관리하는 방식으로 작동합니다.

소켓(Socket)이란?

소켓은 네트워크 연결을 나타내는 개념으로, 소켓을 통해 데이터를 주고받습니다. 소켓은 클라이언트와 서버를 연결하고 데이터를 전송하는 역할을 합니다. 소켓에는 IP 주소와 포트 번호가 할당되어 있으며, 데이터는 이를 통해 목적지로 전송됩니다.

서버와 클라이언트

소켓 프로그래밍에서 서버는 클라이언트의 연결을 수락하고, 클라이언트로부터 데이터를 받아 처리하는 역할을 합니다. 서버는 일반적으로 항상 실행되며, 클라이언트의 연결을 기다리고 있는 상태입니다.

클라이언트는 서버와 연결하여 데이터를 보내고 받습니다. 클라이언트는 서버에 요청을 보내고, 서버의 응답을 받아 처리하는 역할을 합니다.

소켓 프로그래밍 기초 예제

다음은 자바 소켓 프로그래밍을 위한 기본적인 예제입니다. 이 예제는 서버와 클라이언트 간의 간단한 텍스트 메시지를 주고받는 내용을 다루고 있습니다.

서버 측 코드:

import java.net.*;
import java.io.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        Socket clientSocket = null;

        try {
            serverSocket = new ServerSocket(1234); // 포트 번호 1234로 서버 소켓 생성
            clientSocket = serverSocket.accept(); // 클라이언트로부터 연결 요청 대기

            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            String inputLine, outputLine;

            // 클라이언트로부터의 메시지를 읽고, 메시지를 처리한 후 응답 생성
            while ((inputLine = in.readLine()) != null) {
                outputLine = "서버에서 받은 메시지: " + inputLine;
                out.println(outputLine);
            }
        } finally {
            if (serverSocket != null)
                serverSocket.close();
            if (clientSocket != null)
                clientSocket.close();
        }
    }
}

클라이언트 측 코드:

import java.net.*;
import java.io.*;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket clientSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            clientSocket = new Socket("localhost", 1234); // 서버에 연결
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("호스트를 찾을 수 없습니다: localhost");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("입출력 오류입니다.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;

        // 키보드 입력을 받아 서버로 전송 후, 서버의 응답을 받음
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("서버에서 받은 메시지: " + in.readLine());
        }

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

이 예제는 서버와 클라이언트 사이에서 간단한 텍스트 메시지를 주고받습니다. 서버는 클라이언트의 연결 요청을 수락하고, 클라이언트로부터의 메시지를 받아 처리한 후 응답을 반환합니다. 클라이언트는 서버에 연결하여 키보드 입력을 받아 서버로 전송하고, 서버의 응답을 받아 출력합니다.

이를 통해 자바 소켓 프로그래밍의 기본 개념과 예제 코드에 대해 알아보았습니다. 소켓 프로그래밍은 네트워크 통신을 위한 강력한 도구로, 다양한 응용 프로그램에서 사용될 수 있습니다.

참고 자료: