Sockets UDP

Sockets basados en el protocolo UDP.

El código completo lo encuentra en: https://github.com/jorgaf/programacionintegrativa/tree/main/sockets/src/ec/edu/utpl/pi/practice/sockets/practices/p2/udp y está compuesto por dos clases EmisorDatagram.java y ReceptorDatagram.java. Considere que en este tipo de sockets, no existe un servidor y un cliente, cualquiera puede hacer de ambos roles.

Comience analizando la clase EmisorDatagram.java.

El emisor

Imports

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

Al igual que sucede con los sockets TCP, los UDP pueden lanzar excepciones relacionadas con la entrada/salida, razón por la cual se usa la clase IOException. Las clases relacionadas con los sockets con DatagramPacket y DatagramSocket, mientras que la clase InetAddress se utiliza para la asignación de una dirección IP.

La clase:

public class EmisorDatagram {

Es una clase que no necesita heredadar de otra, ni implementar alguna interfaz.

Excepciones

Como ya se mencionó las excepciones que se pueden presentar está relacionados con la entrada/salida, debio al uso de una red de computadoreas. La estrategia que la clase utiliza es dejar que el método principal lance nuevamente esas excepciones, esto se consigue agregando throws IOException.

    public static void main(String[] args) throws IOException {

Sentencias:

La primera sentencia crea un objeto del tipo DatagramSocket que es una clase especializada en enviar/recibir paquetes datagramas. La segunda sentencia obtiene la dirección IP del receptor utilizando su nombre (localhost).

        DatagramSocket datagramSocket = new DatagramSocket()
        InetAddress address = InetAddress.getByName("localhost");

Otra sentencia es la creación del mensaje que este emisor enviará a un receptor.

        String mensaje = "mensaje desde el emisor";

Lo siguiente es crear el datagrama a enviar y para ello se debe usar:

  • El mensaje transformado en bytes.

  • La longitud del mensaje

  • La dirección IP del emisor

  • Finalmente el puerto establecido para la comunicación.

        DatagramPacket datagram = new DatagramPacket(mensaje.getBytes(),mensaje.getBytes().length, address, 5555);

Ahora posee todos los elementos que se necesita para poder realizar el envío del menaje, esa actividad se hace así:

        datagramSocket.send(datagram);

La última sentencia es cerrar el socket UDP creado, así:

        datagramSocket.close();

De ese forma se termina el código de esta clase. Es momento de analizar la siguiente clase, el receptor.

El receptor

Imports

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

La única diferencia con los imports anteriores es el uso de la clase InetSocketAddress, que es uan clase que permite asignar una dirección IP a un socket.

La clase:

public class EmisorDatagram {

Excepciones:

Ya se comentó sobre el origen de las excepcione y la forma de manejo, razón por la cual únicamente se presenta el código:

    public static void main(String[] args) throws IOException {

Sentencias:

Lo primero que se hace es la creación de la dirección IP del socket, usando una instancia de la clase InetInetSocketAddress. Las sentencias para la creación del socket receptor es la misma que se usó para la creación del socket emisor, pero está vez asignando la dirección al socket.

        InetSocketAddress address = new InetSocketAddress("localhost", 5555);
        DatagramSocket datagramSocket = new DatagramSocket(address);

Hay que prepararse para la recepción del mensaje, para ello se crea un arreglo de bytes y se usa como parámetro en la creación del paquete datagrama y se recibe el mensaje a través de la tercer sentencia

        byte[] mensaje = new byte[25];
        DatagramPacket datagram = new DatagramPacket(mensaje, 25);
        datagramSocket.receive(datagram);

Se imprime el mensaje recibió y se cierra el socket con las siguientes sentencias:

        System.out.printf("Mensaje recibido: %s\n", new String(mensaje));
        datagramSocket.close();
    }
}

Salida

Ahora que cuenta con ambas clases es necesario ejecutarlas para observar las salidas que generan. Recuerde que aquí se evita presentar muchas sentencias System.out.print* ya que son considerados poco relevantes para la explicación.

El orden de ejecucución es primero ejecutar el receptor (clase: ReceptorDatagram) y luego el emisor (EmisorDatagram).

Una vez que ejecuta el receptor se generan esta salida:

Creando socket datagram
Recibiendo mensaje

Se detiene la ejecución del programa ya que el método receive bloquea la ejecución hasta que llega una datagrama.

Es momento de ejecutar el emisor para que se genera la siguiente salida:

Creando socket datagram
Enviando mensaje
Mensaje enviado
Cerrando el socket datagram
Terminado

Ahora regrese a la ejecución del receptor y verá la salida:

Mensaje recibido: mensaje desde el emisor
Cerrando el socket datagram
Terminado

No olvide que ambos programas terminan inmediatamente luego de enviar un mensaje y luego de recibir un mensaje.

Hasta aquí la explicación del código. Recuerde que debe tratar de implementarlo y ejecutarlo.

Last updated