Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 배우는 UDP 데이터그램 통신: 송신자·수신자 프로그램 완전 정복

파이썬에서는 UDP(User Datagram Protocol)를 사용해 클라이언트와 서버 사이에서 데이터 조각(청크)을 주고받습니다. 통신을 성립하려면 양쪽 끝점(endpoint)이 서로의 IP 주소와 포트 번호를 알아야 합니다. 데이터를 보내는 쪽을 송신자(sender), 받는 쪽을 수신자(receiver)라고 부릅니다.

UDP의 가장 큰 특징은 비연결형(connectionless) 프로토콜이라는 점입니다. 송신자는 전송한 패킷의 도착 여부를 추적하지 않으며, 도착한 패킷을 수락할지 여부 역시 전적으로 수신자의 몫입니다. 이러한 특성 덕분에 오버헤드가 적고 빠른 통신이 가능하지만, 신뢰성은 TCP보다 떨어집니다.

송신자(Sender) 프로그램

다음 파이썬 프로그램은 socket 모듈을 활용해 송신자 프로그램을 구현한 것입니다. 먼저 IP 주소와 포트 번호를 변수로 선언하고, 전송할 메시지를 정의합니다. 그런 다음 sendto() 메서드를 사용해 메시지를 IP 주소와 포트 번호와 함께 묶어 전송합니다.

예제 코드

import socket

UDP_IP = "localhost"
UDP_PORT = 5050
MESSAGE = "Hello UDP! "

print ("Sent Message: ", MESSAGE)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP, UDP_PORT))

실행 결과

위 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.

Sent Message: Hello UDP!

수신자(Receiver) 프로그램

같은 방식으로 송신자가 보낸 메시지를 받아들이는 수신자 프로그램을 작성할 수 있습니다. 아래 예제에서는 한 번에 받을 수 있는 메시지의 최대 크기를 1024바이트로 제한했습니다. bind() 함수는 지정된 IP 주소와 포트 번호를 소켓에 연결하여, 해당 주소로 들어오는 데이터를 수신할 수 있게 해줍니다.

예제 코드

import socket

UDP_IP = "localhost"
UDP_PORT = 5050

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((UDP_IP, UDP_PORT))

while True:
    # 버퍼 크기는 1024바이트
    data, addr = s.recvfrom(1024)
    print("Received message:", data)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.

Received message: Hello UDP!

정리

UDP는 TCP와 달리 연결 설정 과정 없이 데이터를 즉시 전송할 수 있어 속도가 빠르지만, 패킷 손실이나 도착 순서를 보장하지 않습니다. 따라서 실시간 스트리밍, 온라인 게임, IoT 센서 데이터 전송처럼 속도가 중요한 애플리케이션에서 널리 활용됩니다. 파이썬의 socket 모듈만으로도 위 예제처럼 간단하게 UDP 통신 프로그램을 구현할 수 있습니다.