UDP 소켓 프로그래밍
UDP(User Datagram Protocol) 소켓 프로그래밍은 연결을 설정하고 해제하는 과정 없이, 데이터를 '데이터그램(Datagram)'이라는 패킷 단위로 나누어서 전송하는 방식입니다.
우편물을 보낼 때, 우체통에 편지를 넣기만 하면 배리어는 확인하지 않는 '편지 전송'과 매우 유사합니다. 상대가 데이터를 잘 받았는지, 데이터의 순서가 뒤섞이진 않았는지 전혀 확인하지 않기 때문에 신뢰성은 낮지만 오버헤드가 적어 전송 속도가 매우 빠릅니다.
1. UDP 소켓의 핵심 구조
TCP와 달리 TCP의 ServerSocket 처럼 1:1 전용 라인을 열고 연결을 대기하는 객체가 없습니다. 클라이언트와 서버 상관없이 정보를 주고받기 위해서는 모두 동일하게 DatagramSocket 클래스를 사용합니다.
데이터를 담는 상자 역할은 DatagramPacket이 수행합니다. 보낼 때는 데이터와 목적지 IP, 포트를 이 패킷에 봉인해서 전송합니다.
2. 간단한 UDP 통신 예제
정보 수신 측 (서버 역할) 구현
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiver {
public static void main(String[] args) {
try {
// 1. 8888번 포트를 열어두고 수신 대기할 소켓 생성
DatagramSocket socket = new DatagramSocket(8888);
System.out.println("UDP 패킷 수신 대기 중...");
// 2. 들어올 데이터를 담을 빈 상자(Packet) 준비 (최장 512바이트 가정)
byte[] inMsg = new byte[512];
DatagramPacket inPacket = new DatagramPacket(inMsg, inMsg.length);
// 3. 데이터가 올 때까지 대기(receive) 하다가, 오면 상자에 복사함
socket.receive(inPacket);
// 4. 수신된 바이트 데이터를 문자열로 변환 (공백 제거)
String receivedStr = new String(inMsg, 0, inPacket.getLength());
System.out.println("도착한 메시지: " + receivedStr);
System.out.println("보낸 사람 IP: " + inPacket.getAddress().getHostAddress());
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
정보 송신 측 (클라이언트 역할) 구현
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSender {
public static void main(String[] args) {
try {
// 1. 발송을 위한 임의의 소켓 생성
// (포트 번호를 지정하지 않으면 남는 단자에 알아서 할당됨)
DatagramSocket socket = new DatagramSocket();
// 2. 보낼 데이터의 바이트 배열
String msg = "Hello! 이것은 UDP 메시지입니다.";
byte[] outMsg = msg.getBytes();
// 3. 받을 대상(Receiver)의 IP 주소 객체화
InetAddress address = InetAddress.getByName("127.0.0.1");
// 4. 발송할 상자(Packet) 조립: [데이터, 길이, 목적지 IP, 목적지 PORT]
DatagramPacket outPacket = new DatagramPacket(outMsg, outMsg.length, address, 8888);
// 5. 묻지도 따지지도 않고 소켓을 통해 발송 (send)
System.out.println("데이터 전송 완료.");
socket.send(outPacket);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
이와 같이 UDP는 스트림(Stream)을 사용하지 않고 항상 패킷(상자)을 통해 데이터를 조각 내어 던지는 방식으로 작동합니다. 스트리밍 비디오, 온라인 게임 데이터 전송 등에 탁월합니다.