2010년 12월 14일 화요일

UDP server test

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

Posted at 2009/10/22 12:08 // in Java Tips // by FrogInPot


자바에서는 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 서버는 다음과 같습니다.


01.import java.io.IOException;
02.import java.net.DatagramPacket;
03.import java.net.DatagramSocket;
04.import java.net.SocketException;
05.
06.public class DatagramServer extends Thread {
07.
08.private DatagramSocket socket;
09.
10.public DatagramServer() throws SocketException {
11.super();
12.
13.// DatagramPacket을 받기 위한 Socket 생성
14.// 9999 : Listen할 Port
15.socket = new DatagramSocket(9999);
16.}
17.
18.public void run() {
19.while (true)
20.{
21.try
22.{
23.// 데이터를 받을 버퍼
24.byte[] inbuf = new byte[256];
25.
26.// 데이터를 받을 Packet 생성
27.DatagramPacket packet = new DatagramPacket(inbuf, inbuf.length);
28.
29.// 데이터 수신
30.// 데이터가 수신될 때까지 대기됨
31.socket.receive(packet);
32.
33.// 수신된 데이터 출력
34.System.out.println("received length : " + packet.getLength() + ", received data : "
35.+ new String(packet.getData(), 0, packet.getLength()));
36.} catch (IOException e)
37.{
38.e.printStackTrace();
39.}
40.}
41.}
42.
43.public static void main(String args[]) throws SocketException{
44.DatagramServer server = new DatagramServer();
45.server.start();
46.}
47.}

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

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

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

01.import java.io.IOException;
02.import java.net.DatagramPacket;
03.import java.net.DatagramSocket;
04.import java.net.InetAddress;
05.import java.net.SocketException;
06.import java.net.UnknownHostException;
07.
08.public class DatagramClient extends Thread {
09.
10.public DatagramClient() {
11.super();
12.}
13.
14.public void run() {
15.try
16.{
17.while (true)
18.{
19.// 전송할 데이터 : 현재 시간
20.String data = String.valueOf(System.currentTimeMillis());
21.
22.// 전송할 DatagramPacket 생성
23.DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress
24..getByName("127.0.0.1"), 9999);
25.
26.// DatagramSocket 생성
27.DatagramSocket socket = new DatagramSocket();
28.
29.// DatagramPacket 전송
30.socket.send(packet);
31.}
32.} catch (UnknownHostException e)
33.{
34.e.printStackTrace();
35.} catch (SocketException e)
36.{
37.e.printStackTrace();
38.} catch (IOException e)
39.{
40.e.printStackTrace();
41.}
42.}
43.
44.public static void main(String args[]) {
45.DatagramClient client = new DatagramClient();
46.client.start();
47.}
48.}

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
저작자 표시