본문 바로가기
IT/자바 Java

게임 개발의 필수! UDP 소켓에서의 통신 이해하기

by SidePower 2024. 11. 28.

 

자바 UDP 소켓 프로그래밍에 대해 초보자도 쉽게 이해할 수 있는 강의를 구성해 볼게요.

TCP와 UDP의 차이, 간단한 서버-클라이언트 코드 예제,

UDP의 특성과 데이터 손실 처리 방법까지 다뤄보죠!

 

TCP와 다른 UDP의 비연결 특성

UDP (User Datagram Protocol) 은 데이터를 빠르게 보내는 데 최적화된 프로토콜이에요.

TCP는 연결을 유지하며 데이터의 순서와 무결성을 보장하지만,

UDP는 연결 없이 데이터를 전송하기 때문에 속도가 훨씬 빨라요.

다만, 데이터가 손실될 수 있죠.

이런 특성 덕분에 UDP는 게임 개발, 실시간 스트리밍,

VoIP 같은 빠른 응답이 중요한 애플리케이션에 많이 사용돼요.

 

UDP 서버 코드 (Java)

import java.net.*;

public class UDPServer {
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket(9876)) {
            byte[] receiveData = new byte[1024];

            System.out.println("UDP 서버가 시작되었습니다.");

            while (true) {
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                socket.receive(receivePacket);  // 클라이언트로부터 데이터 수신
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());

                System.out.println("클라이언트 메시지: " + message);

                // 클라이언트에게 응답 전송
                InetAddress clientAddress = receivePacket.getAddress();
                int clientPort = receivePacket.getPort();
                String response = "메시지 수신 완료!";
                byte[] sendData = response.getBytes();

                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
                socket.send(sendPacket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

UDP 클라이언트 코드 (Java)

import java.net.*;
import java.util.Scanner;

public class UDPClient {
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket();
             Scanner scanner = new Scanner(System.in)) {

            InetAddress serverAddress = InetAddress.getByName("localhost");

            Systehttp://m.out.print("서버에 보낼 메시지를 입력하세요: ");
            String message = scanner.nextLine();
            byte[] sendData = message.getBytes();

            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9876);
            socket.send(sendPacket);  // 서버로 데이터 전송

            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            socket.receive(receivePacket);  // 서버로부터 응답 수신

            String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("서버 응답: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

데이터 손실 처리 방법

UDP는 데이터 손실을 감지하거나 재전송하지 않기 때문에 응용 계층에서 직접 처리해야 해요.

재전송 로직

서버가 응답을 보내지 않으면 타임아웃 후 재전송 시도.

데이터 무결성 검사

데이터에 해시값(예: MD5)을 포함해 클라이언트가 손상 여부를 확인할 수 있어요.

UDP가 사용되는 게임 사례

FPS 게임

빠른 반응 속도가 중요하며 몇 프레임의 위치 손실은 무시할 수 있음.

MOBA 게임

실시간 상태 전송이 많아 최신 정보가 중요한 구조.

MMORPG

수많은 플레이어의 정보가 주기적으로 전달되는 환경에 적합.

 

 

UDP는 게임 개발에서 빠른 응답성낮은 지연이 필요할 때 적합한 프로토콜이에요.

TCP의 재전송과 확인 과정이 불필요한 경우 UDP를 사용하면 더 효율적이죠.

물론, 보안이나 데이터 무결성이 중요한 경우 TCP가 더 나을 수 있지만,

게임의 경우 최신 상태만 유지되면 되기 때문에 UDP가 탁월한 선택입니다.

 

게임에서는 속도가 생명!

UDP로 서버와 클라이언트가 경쾌하게 통신하며 끊김 없는 게임 경험을 제공하는 거죠.

 

UDP 프로그래밍은 처음엔 약간 헷갈릴 수 있지만,

게임이나 실시간 통신에서 어떻게 사용되는지를 알면 더 재미있게 느껴질 거예요.

작은 예제부터 차근차근 연습하다 보면, 네트워크 통신에 대한 자신감이 생길 거예요!

반응형

댓글