Esta classe fornece facilidade para conexão menos transferência de mensagens de um sistema para outro. Cada mensagem é roteada apenas com base nas informações contidas no pacote e pode ser possível que pacotes diferentes sejam roteados de maneira diferente. Também não há garantia de que a mensagem será entregue ou não, e eles também podem chegar fora de serviço. Esta classe fornece mecanismos para a criação de pacotes de datagrama para entrega sem conexão usando a classe de soquete de datagrama.
Construtores: Os construtores variam de acordo com a sua utilização, ou seja, para receber ou enviar o pacote. Os parâmetros importantes usados ​​nesses construtores são-

  1. buf : Esta é a mensagem real que deve ser entregue ou recebida. Os pacotes de datagrama recebem ou enviam dados armazenados em uma matriz de bytes. Se for utilizado no construtor para envio da mensagem, então representa a mensagem a ser entregue, quando utilizado para fins de recebimento, representa o buffer onde a mensagem recebida será armazenada.
  2. deslocamento : representa o deslocamento na matriz do buffer.
  3. comprimento: é o tamanho real do pacote a receber. Este deve ser menor ou igual ao tamanho da matriz de buffer, caso contrário, haverá estouro, pois a mensagem recebida não caberá na matriz.
  4. Endereço InetAddress : Este é o destino ao qual a mensagem deve ser entregue.
  5. porta : esta é a porta para a qual a mensagem será entregue.
  6. Endereço de SocketAddress : As informações sobre o endereço e a porta podem ser representadas com a ajuda do endereço de soquete. Mesma função que as duas anteriores combinadas.

Para o propósito de envio , os seguintes construtores são usados:

  1. Sintaxe: public DatagramPacket (byte [] buf,
                  deslocamento interno,
                  comprimento interno,
                  Endereço InetAddress,
                  porta interna)
    Parâmetros:
    buf: matriz de bytes
    deslocamento: deslocamento na matriz
    comprimento: comprimento da mensagem a ser entregue
    endereço: endereço de destino
    porta: número da porta de destino
    
  2. Sintaxe: public DatagramPacket (byte [] buf,
                  deslocamento interno,
                  comprimento interno,
                  Endereço SocketAddress)
    Parâmetros:
    buf: matriz de bytes
    deslocamento: deslocamento na matriz
    comprimento: comprimento da mensagem a ser entregue
    endereço: endereço do soquete de destino
    
  3. Sintaxe: public DatagramPacket (byte [] buf,
                  comprimento interno,
                  Endereço InetAddress,
                  porta interna)
    Parâmetros:
    buf: matriz de bytes
    comprimento: comprimento da mensagem a ser entregue
    endereço: endereço de destino
    porta: número da porta de destino
    
  4. Sintaxe: public DatagramPacket (byte [] buf,
                  comprimento interno,
                  Endereço SocketAddress)
    Parâmetros:
    buf: matriz de bytes
    comprimento: comprimento da mensagem a ser entregue
    endereço: endereço do soquete de destino
    

Para fins de recebimento , os seguintes construtores são usados:

  1. Sintaxe: public DatagramPacket (byte [] buf,
                  deslocamento interno,
                  comprimento interno)
    Parâmetros:
    buf: matriz de bytes
    deslocamento: deslocamento na matriz
    comprimento: comprimento da mensagem a ser entregue
    
  2. Sintaxe: public DatagramPacket (byte [] buf,
                  comprimento interno)
    Parâmetros:
    buf: matriz de bytes
    comprimento: comprimento da mensagem a ser entregue
    

Métodos :

  1. getAddress(): Retorna o endereço IP para o qual este pacote é enviado ou de onde foi recebido.
    Sintaxe: public InetAddress getAddress()
  2. getPort(): Retorna a porta para a qual este pacote é enviado ou de onde foi recebido. Este método é usado especificamente no servidor para obter a porta do cliente que enviou a solicitação.
    Sintaxe: public int getPort()
  3. getData(): Retorna os dados contidos neste pacote como uma matriz de bytes. Os dados começam no deslocamento especificado e têm o comprimento especificado.
    Sintaxe: public byte [] getData()
  4. getOffset(): Retorna o deslocamento especificado.
    Sintaxe: public int getOffset()
  5. getLength(): Retorna o comprimento dos dados para enviar ou receber
    Sintaxe: public int getLength()
  6. setData(): Usado para definir os dados deste pacote.
    Sintaxe: public void setData (byte [] buf,
               deslocamento interno,
               comprimento interno)
    Parâmetros:
    buf: buffer de dados
    deslocamento: deslocamento para os dados
    comprimento: comprimento dos dados
    

    Outro método sobrecarregado no qual o deslocamento é definido como 0 e o comprimento é definido como o comprimento do buffer.



  7. Sintaxe: public void setData (byte [] buf)
     Parâmetros: 
    buf: buffer de dados
  8. setAddress(): Usado para definir o endereço para o qual este pacote é enviado.
    Sintaxe: public void setAddress (InetAddress iaddr)
     Parâmetros: 
    iaddr: InetAddress do destinatário
    
  9. setPort(): Defina a porta na qual o destino receberá este pacote.
    Sintaxe: public void setPort (int iport)
     Parâmetros: 
    iport: o número da porta
  10. setSocketAddress(): Usado para definir o endereço de soquete do destino (endereço IP + número da porta).
    Sintaxe: public void setSocketAddress (SocketAddress address)
     Parâmetros: 
    address: socket address
  11. getSocketAddress(): Retorna o endereço do socket deste pacote. Caso tenha sido recebido, retorne o endereço do soquete da máquina host.
    Sintaxe: public SocketAddress getSocketAddress()
  12. setLength(): Usado para definir o comprimento deste pacote.
    Sintaxe: public void setLength (int length)
     Parâmetros: 
    comprimento: comprimento do pacote

Implementação Java:

//Java program to illustrate various
//DatagramPacket class methods
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.util.Arrays;
  
public class datapacket 
{
    public static void main(String[] args) throws IOException 
    {
  
        byte ar[] = { 12, 13, 15, 16 };
        byte buf[] = { 15, 16, 17, 18, 19 };
        InetAddress ip = InetAddress.getByName("localhost");
          
        // DatagramPacket for sending the data
        DatagramPacket dp1 = new DatagramPacket(ar, 4, ip, 1052);
  
        // setAddress() method
        // I have used same address as in initiation
        dp1.setAddress(ip);
  
        // getAddress() method
        System.out.println("Address : " + dp1.getAddress());
          
        // setPort() method
        dp1.setPort(2525);
          
        // getPort() method
        System.out.println("Port : " + dp1.getPort());
          
        // setLength() method
        dp1.setLength(4);
          
        // getLength() method
        System.out.println("Length : " + dp1.getLength());
          
        // setData() method
        dp1.setData(buf);
          
        // getData() method
        System.out.println("Data : " + Arrays.toString(dp1.getData()));
          
        // setSocketAddress() method
        //dp1.setSocketAddress(address.getLocalSocketAddress());
          
        // getSocketAddress() method
        System.out.println("Socket Address : " + dp1.getSocketAddress());
  
        // getOffset() method
        System.out.println("Offset : " + dp1.getOffset());
  
    }
}

Saída :

Address : localhost/127.0.0.1
Port : 2525
Length : 4
Data : [15, 16, 17, 18, 19]
Socket Address : localhost/127.0.0.1:2525
Offset : 0

Para obter uma implementação detalhada de um programa cliente-servidor que usa soquete de datagrama para enviar os pacotes reais pela rede, consulte - Trabalhando com Sockets de Datagrama UDP
Referências:
Documentação oficial de Java
Este artigo foi contribuído por Rishabh Mahrsee . Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando contribute.geeksforgeeks.org ou enviar o seu artigo para contribute@geeksforgeeks.org. Veja o seu artigo na página principal do GeeksforGeeks e ajude outros Geeks.

Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.