개발/Java

Java Datagram 관련 클래스

하프킴 2021. 5. 17. 10:31
728x90

TCP와는 다르게 클래스 하나에서 보내는 역할과 받는 역할을 모두 수행할 수 있다.

 

스트림을 사용하지 않고 DatagarmPacket이라는 클래스를 사용함

 

javadocs에는 아래와 같이 기술되어 있다.

datagram packet를 나타내는 클래스이다.

Datagarm 패킷은 비연결성 packet 전송 service에 쓰인다.

각각의 message는 

여러개의 packets은 한 machine에서 다른 machine으로 전송된다.

순서가 보장되지 않고,  전송이 보장되지 않는다.

 

 

* This class represents a datagram packet.
 * <p>
 * Datagram packets are used to implement a connectionless packet
 * delivery service. Each message is routed from one machine to
 * another based solely on information contained within that packet.
 * Multiple packets sent from one machine to another might be routed
 * differently, and might arrive in any order. Packet delivery is
 * not guaranteed.
 *
 * <p>
 * Unless otherwise specified, passing a {@code null} argument causes
 * a {@link NullPointerException NullPointerException} to be thrown.
 *
 * <p>
 * Methods and constructors of {@code DatagramPacket} accept parameters
 * of type {@link SocketAddress}. {@code DatagramPacket} supports
 * {@link InetSocketAddress}, and may support additional {@code SocketAddress}
 * sub-types.

 

final 클래스이고 더이상 확장할 수 없게 선언되어 있다.

 

public final
class DatagramPacket

다음과 같은 생성자가 있다.

 

    public DatagramPacket(byte buf[], int offset, int length) {
        setData(buf, offset, length);
    }
    
    public DatagramPacket(byte buf[], int length) {
        this (buf, 0, length);
    }

    public DatagramPacket(byte buf[], int offset, int length,
                          InetAddress address, int port) {
        setData(buf, offset, length);
        setAddress(address);
        setPort(port);
    }
    
    public DatagramPacket(byte buf[], int offset, int length, SocketAddress address) {
        setData(buf, offset, length);
        setSocketAddress(address);
    }
    
    public DatagramPacket(byte buf[], int length,
                          InetAddress address, int port) {
        this(buf, 0, length, address, port);
    }
    
    public DatagramPacket(byte buf[], int length, SocketAddress address) {
        this(buf, 0, length, address);
    }

 

여기서 byte 배열은 전송되는 데이터이다. 그리고 offset은 전송되는 byte배열의 첫 위치이다 offset이 1이면 1번째부터 데이터를 전송한다,

length는 데이터의 크기를 의미하는데, 이 값이 byte 배열의 크기보다 작으면 java.lang.IllegalArgumentException이 발생한다.

 

주요 메소드

 

getData()

    /**
     * Returns the data buffer. The data received or the data to be sent
     * starts from the {@code offset} in the buffer,
     * and runs for {@code length} long.
     *
     * @return  the buffer used to receive or  send data
     * @see #setData(byte[], int, int)
     */
    public synchronized byte[] getData() {
        return buf;
    }

byte[]로 전송받은 데이터를 리턴하고 스레드세이프하다.

 

 

getLength()

전송받은 데이터의 길이를 int 타입으로 리턴함.

    /**
     * Returns the length of the data to be sent or the length of the
     * data received.
     *
     * @return  the length of the data to be sent or the length of the
     *          data received.
     * @see #setLength(int)
     */
    public synchronized int getLength() {
        return length;
    }

 

 

DataSocket

아래와 같이 정의되어 있고

public class DatagramSocket implements java.io.Closeable

javadocs에는 아래와 같이 기술되어 있다.

"Datagram Socket은 packet을 보내거나 받기위한 전송 service의 point이다.

datagram socket에 의해 송수신 되는 packet은 각각 주소가 다르고 다르게 route된다.

여러 packet들은 한 machine에서 다른 machine으로 routed되고, 각기 다른 순서로 도착한다."

 

 * This class represents a socket for sending and receiving datagram packets.
 *
 * <p>A datagram socket is the sending or receiving point for a packet
 * delivery service. Each packet sent or received on a datagram socket
 * is individually addressed and routed. Multiple packets sent from
 * one machine to another may be routed differently, and may arrive in
 * any order.
 *
 * <p> Where possible, a newly constructed {@code DatagramSocket} has the
 * {@link StandardSocketOptions#SO_BROADCAST SO_BROADCAST} socket option enabled so as
 * to allow the transmission of broadcast datagrams. In order to receive
 * broadcast packets a DatagramSocket should be bound to the wildcard address.
 * In some implementations, broadcast packets may also be received when
 * a DatagramSocket is bound to a more specific address.