Clase Java.net.DatagramSocket en Java

El socket de datagramas es un tipo de socket de red que proporciona un punto sin conexión para enviar y recibir paquetes. Cada paquete enviado desde un socket de datagrama se enruta y entrega individualmente. También se puede utilizar para enviar y recibir mensajes de difusión. Datagram Sockets es el mecanismo de Java para proporcionar comunicación de red a través de UDP en lugar de TCP. 

Constructores :  

1. DatagramSocket(): crea un datagramSocket y lo vincula a cualquier puerto disponible en la máquina local. Si se usa este constructor, el sistema operativo asignaría cualquier puerto a este socket. 

Syntax :public DatagramSocket()
               throws SocketException
Throws :
SocketException : if the socket could not be opened

2. DatagramSocket(DatagramSocketImpl impl): crea un socket de datagrama no vinculado con datagramImpl dado. 

Syntax :protected DatagramSocket(DatagramSocketImpl impl)
Parameters :
impl : instance of datagramScketImpl

3. DatagramSocket (puerto int): crea y vincula el socket de datagrama al puerto especificado. El socket estará vinculado a una dirección comodín elegida por el kernel. 

Syntax : public DatagramSocket(int port)
               throws SocketException
Parameters : 
port : port number to bind this socket to

4. DatagramSocket(int port, InetAddress laddr): Construye un socket de datagrama y lo vincula al puerto especificado y la dirección ineta. 

Syntax : public DatagramSocket(int port,
              InetAddress laddr)
               throws SocketException
Parameters :
port : local port to bind
laddr : local address to bind
Throws :
SocketException : If the socket could not be opened

5. DatagramSocket(SocketAddress bindaddr): construye un nuevo objeto de socket y lo vincula a la dirección de socket especificada (dirección IP + número de puerto). 

Syntax :public DatagramSocket(SocketAddress bindaddr)
               throws SocketException
Parameters :
bindaddr : socket address to bind to
Throws : 
SocketException : If socket could not be opened

Métodos : 

1. bind() : Vincula este socket a la dirección y el número de puerto especificados. 

Syntax : public void bind(SocketAddress addr)
Parameters : 
addr : socket address to bind to

2. connect() : se conecta a la dirección y el puerto especificados. Después de conectarse al host remoto, este socket puede enviar o recibir paquetes solo desde este host remoto. Si no se puede establecer una conexión con el host remoto especificado, las llamadas a send() o receive() arrojarían una excepción PortUnreachable. 

Syntax :public void connect(InetAddress address,
           int port)
Parameters :
address : address of remote host
port : port number of remote host

Otro método sobrecargado toma la dirección del socket como parámetro. 

Syntax :public void connect(SocketAddress address)
Parameters :
address : socket address of remote host

3. desconectar() : Desconecta el zócalo. Si el enchufe no está conectado, este método no tiene efecto. 

Syntax :public void disconnect()

4. isBound() : Devuelve un valor booleano que indica si este socket está enlazado o no. 

Syntax :public boolean isBound()

isConnected() :Devuelve un valor booleano que indica si este socket está conectado o no. 

Syntax :public boolean isConnected()

5. isConnected() : Devuelve el valor booleano que representa el estado de conexión del socket. Tenga en cuenta que incluso después de cerrar el zócalo, este método seguirá devolviendo verdadero si este zócalo se conectó antes de cerrar el zócalo. 

Syntax :public boolean isConnected()

6. getInetAddress() : Devuelve la dirección a la que está conectado este socket. 

Syntax : public InetAddress getInetAddress()

7. getPort() : Devuelve el puerto en la máquina a la que está conectado este socket. 

Syntax : public int getPort()

8. getRemoteSocketAddress() : Devuelve la dirección del socket (dirección IP+número de puerto) a la que está conectado este socket. 

Syntax : public SocketAddress getRemoteSocketAddress()

9. getLocalSocketAddress() : Devuelve la dirección de la máquina a la que está vinculado este socket, es decir, la dirección del socket de la máquina local. 

public SocketAddress getLocalSocketAddress()

10. send() : Envía un paquete de datagramas desde este socket. Cabe señalar que la información sobre los datos que se enviarán, la dirección a la que se envían, etc. son manejados por el propio paquete. 

Syntax : public void send(DatagramPacket p)
Parameters :
p : packet to send

11. receive() : se utiliza para recibir el paquete de un remitente. Cuando un paquete se recibe con éxito, el búfer del paquete se llena con el mensaje recibido. El paquete también contiene información valiosa como la dirección del remitente y el número de puerto. Este método espera hasta que se recibe un paquete. 

Syntax : public void receive(DatagramPacket p)
Parameters : 
p : datagram packet into which incoming data is filled

12. getLocalAddress() : Devuelve la dirección local a la que está vinculado este socket. 

Syntax : public InetAddress getLocalAddress()

13. getLocalPort() : Devuelve el puerto en la máquina local a la que está vinculado este socket. 

Syntax : public int getLocalPort()

14. setSOTimeout() : se utiliza para establecer el tiempo de espera para recibir un paquete de datagramas. Como una llamada al método receive() bloquea la ejecución del programa indefinidamente hasta que se recibe un paquete, este método puede usarse para limitar ese tiempo. Una vez que expira el tiempo especificado, se lanza java.net.SocketTimeoutException. 

Syntax : public void setSoTimeout(int timeout)
Parameters :
timeout : time to wait

15. getSoTimeout() : Devuelve el parámetro de tiempo de espera si se especifica, o 0 que indica tiempo infinito. 

Syntax : public int getSoTimeout()

16. setSendBufferSize() : se usa para establecer un límite para el tamaño máximo del paquete que se puede enviar desde este socket. Establece la opción SO_SNDBUF, que la implementación de la red utiliza para establecer el tamaño de los búfer de red subyacentes. Aumentar el tamaño puede permitir poner en cola los paquetes antes de enviarlos cuando la tasa de envío es alta. 

Syntax : public void setSendBufferSize(int size)
Parameters : 
size : size of send buffer to set

Implementación Java:

Java

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
   
public class datasocket 
{
    public static void main(String[] args) throws IOException 
    {
        // Constructor to create a datagram socket
        DatagramSocket socket = new DatagramSocket();
        InetAddress address = InetAddress.getByName("localhost");
        int port = 5252;
        byte buf[] = { 12, 13 };
        byte buf1[] = new byte[2];
        DatagramPacket dp = new DatagramPacket(buf, 2, address, port);
        DatagramPacket dptorec = new DatagramPacket(buf1, 2);
           
        // connect() method
        socket.connect(address, port);
       
        // isBound() method
        System.out.println("IsBound : " + socket.isBound());
   
        // isConnected() method
        System.out.println("isConnected : " + socket.isConnected());
   
        // getInetAddress() method
        System.out.println("InetAddress : " + socket.getInetAddress());
   
        // getPort() method
        System.out.println("Port : " + socket.getPort());
   
        // getRemoteSocketAddress() method
        System.out.println("Remote socket address : " + 
                         socket.getRemoteSocketAddress());
   
        // getLocalSocketAddress() method
        System.out.println("Local socket address : " + 
                          socket.getLocalSocketAddress());
   
        // send() method
        socket.send(dp);
        System.out.println("...packet sent successfully....");
   
        // receive() method
        socket.receive(dptorec);
        System.out.println("Received packet data : " + 
                          Arrays.toString(dptorec.getData()));
   
        // getLocalPort() method
        System.out.println("Local Port : " + socket.getLocalPort());
   
        // getLocalAddress() method
        System.out.println("Local Address : " + socket.getLocalAddress());
   
        // setSOTimeout() method
        socket.setSoTimeout(50);
   
        // getSOTimeout() method
        System.out.println("SO Timeout : " + socket.getSoTimeout());
    }
   
}

Para probar el programa anterior, se requiere un pequeño programa de servidor para recibir el paquete enviado y para implementar el método receive(). Su implementación se da a continuación.

Java

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class smallserver {
   
    public static void main(String[] args) throws IOException {
           
        DatagramSocket ds = new DatagramSocket(5252);
        byte buf[] = new byte[2];
        byte send[] = { 13, 18 };
        DatagramPacket dp = new DatagramPacket(buf, 2);
   
        ds.receive(dp);
   
        DatagramPacket senddp = new DatagramPacket(send, 2, 
                               dp.getAddress(), dp.getPort());
        ds.send(senddp);
    }
   
}

Salida: en el lado del cliente

IsBound : true
isConnected : true
InetAddress : localhost/127.0.0.1
Port : 5252
Remote socket address : localhost/127.0.0.1:5252
Local socket address : /127.0.0.1:59498
packet sent successfully
Received packet data : [13, 18]
Local Port : 59498
Local Address : /127.0.0.1
SO Timeout : 50

17. getSendBufferSize() : Devuelve el valor de la opción SO_SNDBUF de este socket. 

Syntax : public int getSendBufferSize()

18. setReceiveBufferSize() : se usa para establecer un límite para el tamaño máximo del paquete que se recibe en este socket. Establece la opción SO_RCVBUF, que la implementación de la red utiliza para establecer el tamaño de los búfer de red subyacentes. Aumentar el tamaño puede permitir poner en cola los paquetes en el extremo receptor cuando los paquetes se envían más rápido de lo que se consumen. 

Syntax : public void setReceiveBufferSize(int size)
Parameters : 
size : size of receive buffer to set

19. getReceiveBufferSize() : Devuelve el valor de la opción SO_RCVBUF de este socket. 

Syntax : public int getReceiveBufferSize()

20. setReuseAddress(): A veces puede ser necesario vincular múltiples sockets a la misma dirección. Habilitar esta opción permite que otro socket se vincule a la misma dirección que este. Debe establecerse antes de realizar una llamada a bind(). Establece el valor de la opción de socket SO_REUSEADDR. 

Syntax : public void setReuseAddress(boolean on)
Parameters : 
on : true for enable, false otherwise

21. getReuseAddress() : Devuelve un valor booleano que indica la configuración de la opción de socket SO_REUSEADDR. 

Syntax : public boolean getReuseAddress()

22. setBroadcast() : Establece el valor de la opción de socket SO_BROADCAST. 

Syntax : public void setBroadcast(boolean on)
Parameters : 
on : true to allow broadcast, false otherwise

23. getBroadcast() : Devuelve verdadero si la transmisión está habilitada, de lo contrario, devuelve falso. 

Syntax : public boolean getBroadcast()

24. setTrafficClass() : se utiliza para establecer el octeto de tipo de servicio en el encabezado del datagrama IP para los datagramas enviados desde este DatagramSocket. Para obtener más detalles sobre el tráfico, la clase, consulte Wikipedia 

Syntax : public void setTrafficClass(int tc)
Parameters : 
tc : int value of bitset, 0<=tc<=255

25. getTrafficClass() : Obtiene la clase de tráfico o el tipo de servicio del encabezado IP de los paquetes enviados desde este socket. 

Syntax : public int getTrafficClass()

26. close() : Cierra este socket de datagrama. Cualquier llamada de recepción pendiente lanzará SocketException. 

Syntax : public void close()

27. isClosed() : Devuelve el valor booleano que indica si el socket está cerrado o no. 

Syntax : public boolean isClosed()

28. getChannel() : Devuelve un canal de datos, si hay alguno asociado con este socket. Se pueden encontrar más detalles sobre los canales de Datagram en la documentación oficial de Java

Syntax : public DatagramChannel getChannel()

29. setDatagramSocketImplFactory() : establece la fábrica de implementación de sockets de datagramas para la aplicación. 

Syntax :public static void setDatagramSocketImplFactory(
                                 DatagramSocketImplFactory fac)
Parameters : 
fac - the desired factory.
Throws : 
IOException - if an I/O error occurs when setting the datagram socket factory.
SocketException - if the factory is already defined.

Implementación Java:

Java

import java.io.IOException;
import java.net.DatagramSocket;
   
public class datasock2 {
   
    public static void main(String[] args) throws IOException {
   
        // Constructor
        DatagramSocket socket = new DatagramSocket(1235);
   
        // setSendBufferSize() method
        socket.setSendBufferSize(20);
   
        // getSendBufferSize() method
        System.out.println("Send buffer size : " + 
                         socket.getSendBufferSize());
   
        // setReceiveBufferSize() method
        socket.setReceiveBufferSize(20);
   
        // getReceiveBufferSize() method
        System.out.println("Receive buffer size : " + 
                           socket.getReceiveBufferSize());
   
        // setReuseAddress() method
        socket.setReuseAddress(true);
   
        // getReuseAddress() method
        System.out.println("SetReuse address : " + 
                             socket.getReuseAddress());
   
        // setBroadcast() method
        socket.setBroadcast(false);
   
        // getBroadcast() method
        System.out.println("setBroadcast : " + 
                              socket.getBroadcast());
   
        // setTrafficClass() method
        socket.setTrafficClass(45);
   
        // getTrafficClass() method
        System.out.println("Traffic class : " + 
                           socket.getTrafficClass());
   
        // getChannel() method
        System.out.println("Channel : " + 
       ((socket.getChannel()!=null)?socket.getChannel():"null"));
   
        // setSocketImplFactory() method
        socket.setDatagramSocketImplFactory(null);
   
        // close() method
        socket.close();
   
        // isClosed() method
        System.out.println("Is Closed : " + socket.isClosed());
   
    }
}

Producción :

Send buffer size : 20
Receive buffer size : 20
SetReuse address : true
setBroadcast : false
Traffic class : 44
Channel : null
Is Closed : true

Referencias: documentación oficial de Java 

Este artículo es una contribución de Rishabh Mahrsee . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *