Implementación de Eco Cliente-Servidor con Sockets UDP en Java

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 6,07 KB

Ejercicio 3: Comunicación Cliente-Servidor mediante UDP

Este documento presenta la implementación en Java de un sistema de comunicación de eco (echo) utilizando el protocolo UDP a través de la clase DatagramSocket.

1. Clase Cliente

El cliente se encarga de enviar mensajes al servidor y esperar la respuesta de eco, cerrando la conexión al enviar el mensaje "fin".

Código Java del Cliente


public class Cliente {

    // Se asume que este código se ejecuta dentro de un método main o similar
    public static void main(String[] args) {

        try { 
            // Le pasamos la IP y el puerto de conexión, y el bind se realiza de forma implícita:
            InetAddress addr = InetAddress.getByName(HOST); // Crea la InetAddress
            DatagramSocket ds = new DatagramSocket(); // Crea el socket
            Scanner scanner = new Scanner(System.in);
            String mensaje;

            do {
                System.out.print("Escriba el mensaje que desea enviar al servidor: ");
                mensaje = scanner.next(); // Escribimos el mensaje que deseamos enviar

                // DatagramPacket datagrama = new DatagramPacket(mensaje, longitud); // Datagrama que se usa para recibir

                // Datagrama que se usa para enviar
                DatagramPacket datagramaEnviar = new DatagramPacket(
                    mensaje.getBytes(),
                    mensaje.getBytes().length, 
                    addr, 
                    PUERTO
                ); // Crea el datagrama 

                ds.send(datagramaEnviar); // Se envía el datagrama

                // Para recibir el mensaje
                int longitud = 100; // Longitud máxima del mensaje
                byte[] mensajeRecibido = new byte[longitud]; // Array de bytes donde almacenar el mensaje
                DatagramPacket datagramaRecibir = new DatagramPacket(mensajeRecibido, longitud);

                ds.receive(datagramaRecibir);

                if (mensaje.equalsIgnoreCase("fin")) {
                    System.out.println("FIN DE COMUNICACIÓN :)");
                    ds.close();
                } else {
                    // Se utiliza la longitud real del paquete recibido para construir el String
                    String ecoMensaje = new String(datagramaRecibir.getData(), 0, datagramaRecibir.getLength()).trim();
                    System.out.println(">>ECO: " + ecoMensaje);
                }

            } while (!mensaje.equalsIgnoreCase("fin"));

            scanner.close();

        } catch (IOException e) {
            System.err.println("Error al conectarse con el socket del servidor.");
            System.out.println(e.getMessage()); // Ejemplo: Connection refused: connect
        }
    }
}

2. Clase Servidor

El servidor se mantiene en un bucle infinito, esperando peticiones de clientes, recibiendo el mensaje y enviándolo de vuelta como eco.

Código Java del Servidor


public class Servidor {

    public static void main(String[] args) {

        try {
            System.out.println("Esperando una petición del socket cliente...");

            // Le pasamos la IP y el puerto de conexión, y el bind se realiza de forma implícita:
            InetSocketAddress addr = new InetSocketAddress(HOST, PUERTO); // Incluye el bind

            // Nota: InetSocketAddress en el servidor se usa porque es como abrir una puerta con una dirección a la que los clientes se conectan.
            DatagramSocket ds = new DatagramSocket(addr); // Crea el socket

            while(true) {
                int longitud = 100; // Longitud máxima del mensaje
                byte[] mensaje = new byte[longitud]; // Array de bytes donde almacenar el mensaje

                // Recibe el mensaje del cliente
                DatagramPacket datagrama = new DatagramPacket(mensaje, longitud); // Se crea el datagrama
                ds.receive(datagrama); // Se carga en el datagrama el mensaje recibido

                // Se puede reutilizar el Datagrama, y en receive se puede usar datagrama.getData()
                // Lo convierto a String, usando la longitud real del paquete recibido
                String mensajeRecibido = new String(datagrama.getData(), 0, datagrama.getLength()).trim();

                // Para enviar de vuelta lo que recibo (Eco)
                System.out.println("Mensaje recibido: " + mensajeRecibido );

                // Envía el datagrama (que ahora contiene la dirección de retorno del cliente)
                ds.send(datagrama);

                if(mensajeRecibido.equalsIgnoreCase("fin")) { 
                    // Nota: En UDP, el servidor generalmente sigue escuchando, a menos que se fuerce el cierre.
                    System.out.println("Cliente ha enviado 'fin'. El servidor sigue activo.");
                    // ds.close(); // Cierra la conexión si se desea terminar el servidor
                }
            }
        } catch (IOException e) {
            System.err.println("Error al crear el socket del servidor.");
            e.printStackTrace();
        }
    }
}

Entradas relacionadas: