개발/JAVA

Java로 배우는 간단한 TCP 소켓 프로그래밍 예제

예니03 2025. 1. 27. 10:27
반응형

안녕하세요! 오늘은 Java로 간단한 TCP 소켓 프로그래밍을 배워보겠습니다. TCP 소켓 프로그래밍은 서버와 클라이언트 간에 데이터를 주고받는 기초적인 네트워크 프로그래밍입니다. 이를 배우면 네트워크 통신의 기본 원리를 쉽게 이해할 수 있답니다. 😊

TCP 소켓 프로그래밍이란?

TCP 소켓은 서버와 클라이언트가 연결을 맺고 데이터를 주고받을 수 있도록 도와주는 도구입니다.

  • 서버: 클라이언트의 요청을 기다리고 응답을 처리합니다.
  • 클라이언트: 서버에 연결 요청을 보내고 데이터를 주고받습니다.

이번 예제에서는 서버와 클라이언트를 구현하고 간단히 통신해보겠습니다.

 

전체 흐름

  1. 서버(Server): 연결 요청을 기다리고, 클라이언트가 접속하면 환영 메시지를 출력합니다.
  2. 클라이언트(Client): 서버에 연결 요청을 보내고, 연결되면 성공 메시지를 출력합니다.

 

코드 살펴보기

1️⃣ 서버 코드: Server.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) {
        ServerSocket serverSocket = null; // 서버 소켓 생성

        try {
            serverSocket = new ServerSocket(); // 서버 소켓 인스턴스 생성
            InetSocketAddress local = new InetSocketAddress("127.0.0.1", 10000); // 서버 IP와 포트 설정
            serverSocket.bind(local); // 소켓 바인딩
            
            System.out.println("<서버가 시작되었습니다.>");
            System.out.println("[연결을 기다립니다.]");

            // 클라이언트 연결 대기
            Socket socket = serverSocket.accept(); // 클라이언트 연결 요청 수락

            // 클라이언트 접속 정보 출력
            InetSocketAddress socketAddress = (InetSocketAddress) socket.getRemoteSocketAddress();
            System.out.println("[클라이언트가 연결되었습니다.]");
            System.out.println(socketAddress.getAddress() + ":" + socketAddress.getPort());

            System.out.println("===============");
            System.out.println("<서버 종료>");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                serverSocket.close(); // 서버 소켓 닫기
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

🟢 설명

  1. ServerSocket: 클라이언트의 요청을 기다리기 위한 소켓입니다.
  2. bind(): 서버가 사용할 IP와 포트를 지정합니다.
  3. accept(): 클라이언트의 연결 요청을 수락합니다.
  4. 클라이언트 정보 출력: 접속한 클라이언트의 IP와 포트를 확인합니다.

 

2️⃣ 클라이언트 코드: Client.java

import java.io.IOException;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {

    public static void main(String[] args) {
        Socket socket = null; // 클라이언트 소켓 생성

        try {
            socket = new Socket(); // 소켓 인스턴스 생성
            System.out.println("<클라이언트 시작>");
            System.out.println("[연결을 요청합니다.]");

            InetSocketAddress remote = new InetSocketAddress("127.0.0.1", 10000); // 서버 주소와 포트 설정
            socket.connect(remote); // 서버에 연결 시도
            
            System.out.println("[서버에 연결되었습니다.]");
            System.out.println("<클라이언트 종료>");
        } catch (ConnectException e) {
            System.err.println("접속이 거부되었습니다."); // 서버가 실행 중이 아닐 경우
        } catch (IOException e) {
            e.printStackTrace(); // 예외 발생 시 출력
        } finally {
            try {
                socket.close(); // 소켓 닫기
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

🟢 설명

  1. Socket: 서버와 연결하기 위한 클라이언트 소켓입니다.
  2. connect(): 서버와 연결을 시도합니다.
  3. 연결 성공 메시지 출력: 연결이 성공하면 확인 메시지를 출력합니다.

 

3️⃣ 추가 예제: Client2.java

Client2.java는 Client.java와 같은 동작을 하지만, 초보자가 이해하기 쉽게 주석을 더 추가했습니다.

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client2 {
    public static void main(String[] args) {
        Socket socket = null; // 소켓 생성

        try {
            socket = new Socket(); // 새로운 소켓 객체 생성
            System.out.println("<클라이언트가 시작되었습니다.>");
            System.out.println("[서버 연결을 시도합니다.]");

            InetSocketAddress remote = new InetSocketAddress("127.0.0.1", 10000); // 서버 주소와 포트 설정
            socket.connect(remote); // 서버 연결

            System.out.println("[서버와 연결되었습니다.]");
            System.out.println("<클라이언트 종료>");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close(); // 소켓 닫기
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

실행 방법

1️⃣ 서버 실행

  1. 먼저 Server.java를 실행하세요.
  2. 서버가 시작되고 클라이언트의 연결 요청을 기다립니다:
    <서버가 시작되었습니다.>
    [연결을 기다립니다.]
    

2️⃣ 클라이언트 실행

  1. 다음으로 Client.java 또는 Client2.java를 실행하세요.
  2. 클라이언트가 서버에 연결 요청을 보냅니다:
    <클라이언트 시작>
    [연결을 요청합니다.]
    [서버에 연결되었습니다.]
    <클라이언트 종료>
    

3️⃣ 서버 로그 확인

클라이언트가 연결되면 서버에서 다음과 같은 로그를 확인할 수 있습니다:

[클라이언트가 연결되었습니다.]
127.0.0.1:50000
===============
<서버 종료>

 

실행 결과 요약

  • 서버는 클라이언트의 요청을 기다리고, 연결이 되면 클라이언트 정보를 출력합니다.
  • 클라이언트는 서버에 연결 성공 여부를 출력하고 종료합니다.

 

마무리

이번 글에서는 Java로 간단한 TCP 소켓 프로그래밍을 구현해 보았습니다.
이 코드는 네트워크 프로그래밍의 기초로, 이후 데이터 전송, 멀티스레드 서버 등으로 확장할 수 있는 중요한 기반이 됩니다.

직접 코드를 실행해 보면서 네트워크 통신의 원리를 익혀 보세요! 😊

 

반응형