본문 바로가기

시즌1/Java Tips

[Java Tips] DatagramSocket을 이용한 간단한 UDP 서버/클라이언트 구현

자바에서는 UDP 통신을 위해서 DatagramSocket과 DatagramPacket을 제공합니다.
이번 팁에서는 DatagramSocket과 DatagramPacket을 이용하여 간단한 UDP 서버/클라이턴트를 구현해 보겠습니다.

UDP 통신을 위해서는 UDP 패킷을 받을 서버 Socket이 생성되어야 합니다.
Socket 생성 시는 다음과 같은 순서로 수행합니다.

1. DatagramSocket 생성 : 생성 시, Listen할 Port 지정
2. DatagramPacket 생성 : 데이터를 수신할 그릇이 되는 DatagramPacket 생성
3. DatagramSocket.receive() 호출 : 생성된 Socket의 receive method를 생성된 packet object를 파라미터로 하여 호출. receive method는 호출 후, packet이 수신될 때까지 대기를 하게 됨

간단하게 구현한 UDP 서버는 다음과 같습니다.


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class DatagramServer extends Thread {

	private DatagramSocket socket;

	public DatagramServer() throws SocketException {
		super();
		
		// DatagramPacket을 받기 위한 Socket 생성
		// 9999 : Listen할 Port
		socket = new DatagramSocket(9999);
	}

	public void run() {
		while (true)
		{
			try
			{
				// 데이터를 받을 버퍼
				byte[] inbuf = new byte[256];

				// 데이터를 받을 Packet 생성
				DatagramPacket packet = new DatagramPacket(inbuf, inbuf.length);

				// 데이터 수신
				// 데이터가 수신될 때까지 대기됨
				socket.receive(packet);

				// 수신된 데이터 출력
				System.out.println("received length : " + packet.getLength() + ", received data : "
						+ new String(packet.getData(), 0, packet.getLength()));
			} catch (IOException e)
			{
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String args[]) throws SocketException{
		DatagramServer server = new DatagramServer();
		server.start();
	}
}

클라이언트는 마찬가지로, DatagramSocket과 DatagramPacket을 이용하여 데이터를 전송하며 순서는 다음과 같습니다.

1. DatagramSocket 생성 ; 생성 시, Packet을 전송할 Server IP, PORT 정보 전달
2. DatagramPacket 생성 및 데이터 입력 : 전송할 Packet을 생성하고, 데이터를 입력
3. DatagramSocket.send 호출 : 전송할 Packet을 send method로 전송

간단한 클라이언트 소스는 다음과 같습니다.

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class DatagramClient extends Thread {

	public DatagramClient() {
		super();
	}

	public void run() {
		try
		{
			while (true)
			{
				// 전송할 데이터 : 현재 시간
				String data = String.valueOf(System.currentTimeMillis());

				// 전송할  DatagramPacket 생성
				DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress
						.getByName("127.0.0.1"), 9999);

				// DatagramSocket 생성
				DatagramSocket socket = new DatagramSocket();
				
				// DatagramPacket 전송
				socket.send(packet);
			}
		} catch (UnknownHostException e)
		{
			e.printStackTrace();
		} catch (SocketException e)
		{
			e.printStackTrace();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	public static void main(String args[]) {
		DatagramClient client = new DatagramClient();
		client.start();
	}
}


Output :

received length : 13, received data : 1256179996593
received length : 13, received data : 1256179996593
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996609
received length : 13, received data : 1256179996640
received length : 13, received data : 1256179996640
received length : 13, received data : 1256179996640
received length : 13, received data : 1256179996640