자바 UDP 네트워크 프로그래밍 기초

이전에 TCP 네트워크 통신에 대해 간단히 소개했던 내용을 바탕으로, 이제 UDP 통신에 관한 내용을 보충해 보겠습니다.

UDP는 신뢰성이 보장되지 않는 네트워크 프로토콜이지만, 이는 UDP가 사용 가치가 없다는 의미는 아닙니다. 실제로 특정 상황에서 UDP 프로토콜은 매우 유용하게 사용될 수 있습니다. UDP는 TCP가 가진 속도 이점을 갖고 있기 때문입니다. TCP 프로토콜은 다양한 보안 기능을 내장하고 있지만, 실행 과정에서 시스템 오버헤드를 크게 차지하여 속도에 부정적인 영향을 미칩니다. 반면 UDP는 데이터 신뢰성 전달 메커니즘을 제외하고, 보안과 순서 등의 기능을 상위 애플리케이션에 위임함으로써 실행 시간을 크게 줄여 속도를 보장합니다.

이론적인 설명은 생략하고 바로 코드 예제를 통해 실제 구현 방법을 살펴보겠습니다.

  1. 기본 UDP 네트워크 프로그래밍:

서버 측

public class UDP서버 {

    /** 서버 측 코드
     * @param args
     * UDP와 TCP의 포트 번호는 65536 이내 범위에서 자유롭게 설정 가능
     * UDP와 TCP의 포트 번호는 서로 독립적이며, 각각 65536개의 포트를 가짐
     */
    public static void main(String[] args) throws Exception {
        byte[] 데이터버퍼 = new byte[1024]; // 데이터 저장용 바이트 배열
        DatagramPacket 데이터패킷 = new DatagramPacket(데이터버퍼, 데이터버퍼.length);
        DatagramSocket 데이터소켓 = new DatagramSocket(5888); // 포트 번호 설정
        while (true) {
            데이터소켓.receive(데이터패킷); // 클라이언트로부터 데이터 수신
            System.out.println(new String(데이터버퍼, 0, 데이터패킷.getLength()));
            // String 생성자: 바이트 배열을 String으로 변환
        }
    }
}

클라이언트 측

public class UDP클라이언트 {

    /** 클라이언트 코드 예제
     * @param args
     * SocketAddress: 네트워크 주소(IP 포함)
     * InetAddress: IP 주소 추상화 클래스
     * InetSocketAddress: IP 주소 + 포트 번호
     */
    public static void main(String[] args) throws Exception {
        byte[] 데이터버퍼 = new byte[1024];
        데이터버퍼 = (new String("안녕하세요")).getBytes(); // String을 바이트 배열로 변환
        DatagramPacket 데이터패킷 = new DatagramPacket(데이터버퍼, 데이터버퍼.length, new InetSocketAddress("127.0.0.1", 5888));
        DatagramSocket 데이터소켓 = new DatagramSocket(9999); // 클라이언트 데이터 전송 포트 설정
        데이터소켓.send(데이터패킷); // 서버로 데이터 전송
        데이터소켓.close();
    }
}

코드의 상세 설명은 주석에 포함되어 있으니, 학습이 필요하다면 직접 복사하여 실행해 보세요. 위 코드는 모두 완전한 형태이며 바로 실행 가능합니다.

  1. 데이터 전송을 위한 UDP 프로그래밍:

서버 측

public class 데이터전송UDP서버 {

    public static void main(String[] args) throws Exception {
        byte[] 데이터버퍼 = new byte[1024]; // 데이터 저장용 바이트 배열
        DatagramPacket 데이터패킷 = new DatagramPacket(데이터버퍼, 데이터버퍼.length);
        DatagramSocket 데이터소켓 = new DatagramSocket(5888); // 포트 번호 설정
        while (true) {
            데이터소켓.receive(데이터패킷); // 클라이언트로부터 데이터 수신
            ByteArrayInputStream 바이트입력스트림 = new ByteArrayInputStream(데이터버퍼);
            DataInputStream 데이터입력스트림 = new DataInputStream(바이트입력스트림);
            System.out.println(데이터입력스트림.readLong());
        }
    }
}

클라이언트 측

public class 데이터전송UDP클라이언트 {

    public static void main(String[] args) throws Exception {
        Long 숫자값 = 10000L;
        ByteArrayOutputStream 바이트출력스트림 = new ByteArrayOutputStream();
        DataOutputStream 데이터출력스트림 = new DataOutputStream(바이트출력스트림); // Long 타입 데이터 직접 쓰기 가능
        데이터출력스트림.writeLong(숫자값);
        byte[] 데이터버퍼 = 바이트출력스트림.toByteArray();
        DatagramPacket 데이터패킷 = new DatagramPacket(데이터버퍼, 데이터버퍼.length, new InetSocketAddress("127.0.0.1", 5888));
        DatagramSocket 데이터소켓 = new DatagramSocket(9999); // 클라이언트 데이터 전송 포트 설정
        데이터소켓.send(데이터패킷); // 서버로 데이터 전송
        데이터소켓.close();
    }
}

이런 데이터 전송이 왜 필요할까요? 실시간 온라인 게임에서 Long 타입 데이터 전송은 매우 중요합니다. 예를 들어 레이싱 게임에서 플레이어의 3D 공간 위치 정보를 다른 플레이어 시스템에 실시간으로 전송해야 하는 경우, 게임의 요구사항에 따라 전송 속도가 매우 빨라야 하므로 UDP 기반 데이터 전송이 게임 개발 과정에서 가장 많이 사용됩니다.

위 내용은 UDP 프로그래밍의 기본 개념을 소개하기 위한 간단한 예제입니다. 이를 통해 UDP 통신의 기본 구조를 이해하는 데 도움이 되기를 바랍니다.

태그: java UDP DatagramSocket 네트워크 프로그래밍 데이터 전송

6월 17일 00:40에 게시됨