본문

UDP 소켓 프로그래밍

반응형

# UDP 소켓 프로그래밍

TCP소켓 프로그래밍에서는 Socket과 ServerSocket을 사용하지만,
UDP소켓 프로그래밍에서는 DatagramSocket과 DatagramPacket을 사용한다.

UDP는 연결지향적인 프로토콜이 아니기 때문에 ServerSocket이 필요하지 않다.
UDP통신에서 사용하는 소켓은 DatagramSocket이며 데이터를 DatagramPacket에 담아서 전송한다
.

DataagramPacket은 헤더와 데이터로 구성되어 있으며, 헤더에는 DatagramPacket을 신한 호스트의 정보(호스트의 주소와 포트)가 저장되어 있다. 소포(packet)에 수신할 상대의 주소를 적어서 보내는 것과 같다고 이해하면 된다. 그래서 DatagramPacket을 전송하면DatagramPacket에 지정된 주소(호스트의 포트)의 DatagramSocket에 도착한다.


Source01) UdpServer .java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package networkingEx;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import org.omg.CORBA.PUBLIC_MEMBER;
 
public class UdpServer {
    final static int SERVER_PORT = 7777;
 
    public void start() throws IOException {
        // 포트 7777번을 사용하는 소켓을 생성한다.
        DatagramSocket socket = new DatagramSocket(SERVER_PORT);
        DatagramPacket inPacket, outPacket;
 
        byte[] inMsg = new byte[10];
        byte[] outMsg;
 
        System.out.println("UDP 서버가 실행되었습니다.");
        
        while (true) {
            // 데이터를 수신하기 위한 패킷을 생성한다.
            inPacket = new DatagramPacket(inMsg, inMsg.length);
 
            // 패킷을 통해 데이터를 수신(receive)한다.
            socket.receive(inPacket);
 
            // 수신한 패킷으로 부터 client의 IP주소와 Port를 얻는다.
            InetAddress address = inPacket.getAddress();
            int port = inPacket.getPort();
 
            // 서버의 현재 시간을 시분초 형태([hh:mm:ss])로 반환한다.
            SimpleDateFormat sdf = new SimpleDateFormat("[hh:mm:ss]");
            String time = sdf.format(new Date());
            outMsg = time.getBytes(); // time을 byte배열로 반환한다.
 
            // 패킷을 생성하여 client에게 전송(send)한다.
            outPacket = new DatagramPacket(outMsg, outMsg.length, address, port);
            socket.send(outPacket);
        }
    }
 
    public static void main(String args[]) {
        try {
            // UDP 서버를 실행시킨다.
            new UdpServer().start();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}
cs

Source02) UdpClient.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package networkingEx;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class UdpClient {
    final static int SERVER_PORT = 7777;
    final static String SERVER_IP = "127.0.0.1";
 
    public void start() throws IOException, UnknownHostException {
        DatagramSocket datagramSocket = new DatagramSocket();
        InetAddress serverAddress = InetAddress.getByName(SERVER_IP);
 
        // 데이터가 저장된 공간으로 byte배열을 생성한다.
        byte[] msg = new byte[100];
 
        DatagramPacket outPacket = new DatagramPacket(msg, 1, serverAddress, SERVER_PORT);
        DatagramPacket inPacket = new DatagramPacket(msg, msg.length);
 
        // DatagramPacket을 전송한다.
        datagramSocket.send(outPacket);
 
        // DatagramPacket을 수신한다.
        datagramSocket.receive(inPacket);
 
        System.out.println("current server time : " + new String(inPacket.getData()));
 
        datagramSocket.close();
    }
 
    public static void main(String[] args) {
        try {
            new UdpClient().start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

Result-server)

1
UDP 서버가 실행되었습니다.
cs

Result-client)

1
current server time : [09:29:18]
cs


서버로부터 서버시간을 전송받아 출력하는 간단한 UDP소켓 클라이언트와 서버 프로그램이다. 클라이언트가 DatagramPacket을 생성해서 DatagramSocket으로 서버에 전송하면, 서버는 전송받은 DatagramPacket의 getAddress(), getPort()를 호출해서 클라이언트의 정보를 얻어서 서버시간을 DatagramPacket에 담아서 전송한다.




출처 및 참고자료 : JAVA의정석(남궁성 저)

반응형

공유

댓글