https://coding-factory.tistory.com/271



▶UDP(User Datagram Protocol 

1. UDP는 비 연결 지향이고, IP 위에 매우 얇은 레이어로 구성되어 있습니다.

2. UDP를 사용하는 애플리케이션은 TCP 프로그램에 비해 제어를 할 수 있는 부분이 적습니다.

3. UDP는 데이터를 전송할 때에 데이터가 잘 도착했는지 알아낼 방법이 없으며, 데이터를 보낸 순서대로 도착한다는 보장도 할 수 없습니다.

4. UDP는 TCP에 비해 훨씬 빠르게 전달된다는 장점이 있습니다.


▶DatagramPacket 클래스  

1. UDP 데이터그램은 java.net.DatagramPacket 클래스로 추상화한 것입니다.

2. DatagramPacket 클래스는 애플리케이션에서 주고 받을 데이터와 관련된 클래스이고, DatagramSocket 클래스는 실제 데이터의 전송을 책임지게 됩니다. 

3. DatagramPacket 클래스는 데이터를 송신하기 위한 기능과 수신을 하기 위한 기능으로 분리됩니다.


DatagramPacket 클래스의 생성자

DatagramPacket의 생성자는 데이터를 보내기 위한 생성자와 데이터를 받기 위한 생성자로 구분됩니다.


DatagramPacket 클래스의 메서드

IP 헤더에 출발지 주소와 목적지 주소를 설정하거나 주소를 얻어오는 메서드, 출발지 포트와 목적지 포트를 설정하거나 얻어오는 다양한 메서드 제공합니다.



▶DatagramSocket 클래스  

TCP 스트림 소켓과 달리 서버와 클라이언트 데이터 그램 소켓 사이에는 차이가 없으며 모든 데이터그램 소켓은 데이터그램을 전송할 뿐만 아니라 수신에서 사용할 수 있습니다.


DatagramSocket 클래스의 생성자 

모든 DatagramSocket 객체는 데이터그램을 수신하기 위해서 사용될 수 있기 때문에 로컬 호스트 내의 유일한 UDP 포트와 연관되어 있습니다.


DatagramSocket 클래스의 주요 메서드 

DatagramSocket 클래스의 주요 메서드 기능은 DatagramPacket을 보내거나 받을 수 있는 메서드를 제공하는 것입니다.

DatagramSocket 클래스의 주요 메서드


▶UDP 통신 예제 

UDP Client

import java.net.*;

import java.io.*;

public class UDPEchoClient{

    private String str;
    private BufferedReader file;
    private static int SERVERPORT=3000;
    public UDPEchoClient(String ip,int port){
        try{     
            InetAddress ia = InetAddress.getByName(ip);
            DatagramSocket ds = new DatagramSocket(port);
            System.out.print("message : ");
            file = new BufferedReader(new InputStreamReader(System.in)); 
            str = file.readLine();   
            byte buffer[] = str.getBytes();            
            DatagramPacket dp = new DatagramPacket(
                    buffer,buffer.length,ia,SERVERPORT);
            ds.send(dp);
            buffer = new byte[512];
            dp = new DatagramPacket(buffer,buffer.length);
            ds.receive(dp);
            System.out.println("server ip : "+dp.getAddress() + " , server port : "+dp.getPort());
            System.out.println("수신된 데이터 : "+ new String(dp.getData()).trim());
        }catch(IOException ioe){
            ioe.printStackTrace();          
        }
    }
    public static void main(String[] args){
        new UDPEchoClient("localhost",2000);        
    }
};


UDP Server

import java.net.*;
import java.io.*;

public class UDPEchoServer {
    public UDPEchoServer(int port) {
        try {
            DatagramSocket ds = new DatagramSocket(port);
            while (true) {
                byte buffer[] = new byte[512];
                DatagramPacket dp = new DatagramPacket(buffer,buffer.length);
                System.out.println("ready");
                ds.receive(dp);
                String str = new String(dp.getData());
                System.out.println("수신된 데이터 : " + str);

                InetAddress ia = dp.getAddress();
                port = dp.getPort();
                System.out.println("client ip : " + ia + " , client port : " + port);
                dp = new DatagramPacket(dp.getData(),dp.getData().length, ia,port);
                ds.send(dp);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        new UDPEchoServer(3000);
    }
}


[Java] 자바 네트워크에 대한 이해

[Java] 자바 네트워크 InetAddress 클래스

[Java] 자바 네트워크 URL 클래스와 URLConnection 클래스

[Java] 자바 네트워크 TCP 통신 소켓프로그래밍

[Java] 자바 네트워크 유니캐스팅과 멀티캐스팅

[Java] 자바 네트워크 프로토콜이란 무엇인가?