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

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 5,71 KB

Este documento detalla la creación de una arquitectura cliente-servidor utilizando el protocolo UDP (User Datagram Protocol) en el lenguaje de programación Java. A diferencia de TCP, UDP no está orientado a la conexión, lo que permite un intercambio de datos rápido mediante el uso de las clases DatagramSocket y DatagramPacket.

1. Código del Cliente

El cliente se encarga de iniciar la comunicación enviando un saludo inicial y gestionando las opciones del usuario a través de la consola.


import java.net.*; 
import java.util.*; 

public class Cliente { 
    public static void main(String args[]) throws Exception { 
        // Configuración del destino
        InetAddress destino = InetAddress.getLocalHost(); 
        int port = 12345; 
        byte[] mensaje = new byte[1024]; 
        String saludo = "HOLA"; 
        mensaje = saludo.getBytes(); 

        // Envío del paquete inicial
        DatagramPacket envio = new DatagramPacket(mensaje, mensaje.length, destino, port); 
        DatagramSocket socket = new DatagramSocket(34567); 
        socket.send(envio); 

        // Recepción del saludo de vuelta
        byte[] buffer = new byte[1024]; 
        DatagramPacket recibo = new DatagramPacket(buffer, buffer.length); 
        socket.receive(recibo); // Espera a recibir datos 
        String paquete = new String(recibo.getData()); 
        System.out.println(paquete); 

        // Inicio del proceso de interacción
        boolean bSalir = false; 
        Scanner sc = new Scanner(System.in); 
        while (!bSalir) { 
            // Solicitud de acción al cliente 
            System.out.println("Elige una opción:"); 
            System.out.println("TOTAL"); 

            // Recepción de la opción elegida 
            String sOpcion = sc.next(); 

            // Preparación del envío de la opción al servidor 
            mensaje = sOpcion.getBytes(); 
            envio = new DatagramPacket(mensaje, mensaje.length, destino, port); 

            // Envío del paquete
            socket.send(envio); 

            switch(sOpcion) { 
                case "COMP": 
                    // Limpieza del buffer 
                    buffer = new byte[1024]; 
                    // Preparación del paquete para recibir el mensaje 
                    recibo = new DatagramPacket(buffer, buffer.length); 
                    // Espera de recepción
                    socket.receive(recibo); 
                    String pedido = new String(recibo.getData()); 
                    System.out.println(pedido); 

                    String sCantidad = sc.next(); 
                    mensaje = sCantidad.getBytes(); 
                    envio = new DatagramPacket(mensaje, mensaje.length, recibo.getAddress(), recibo.getPort()); 
                    socket.send(envio); 
                    bSalir = true; 
                    break; 
            } // Fin del switch 
        } // Fin del while 

        socket.close(); 
    } // Fin del main 
} // Fin de la clase

2. Código del Servidor

El servidor permanece a la escucha en un puerto específico, recibe los paquetes del cliente y procesa las solicitudes de compra de manera asíncrona.


import java.net.*; 

public class Servidor { 
    public static void main(String args[]) throws Exception { 
        byte[] buffer = new byte[1024]; 
        DatagramSocket socket = new DatagramSocket(12345); 
        System.out.println("Esperando el mensaje..."); 

        // Recepción del mensaje inicial
        DatagramPacket recibo = new DatagramPacket(buffer, buffer.length); 
        socket.receive(recibo); // Espera a recibir datos 
        String paquete = new String(recibo.getData()); 
        System.out.println(paquete); 

        // Envío de saludo al cliente 
        byte[] mensaje = new byte[1024]; 
        String saludo = "HOLA"; 
        mensaje = saludo.getBytes(); 
        DatagramPacket envio = new DatagramPacket(mensaje, mensaje.length, recibo.getAddress(), recibo.getPort()); 
        socket.send(envio); 

        // Inicio del bucle de servicio 
        boolean bSalir = false; 
        while (!bSalir) { 
            // Limpieza del buffer 
            buffer = new byte[1024]; 
            // Preparación del paquete para recibir el mensaje 
            recibo = new DatagramPacket(buffer, buffer.length); 
            // Espera de recepción
            socket.receive(recibo); 
            System.out.println("1"); 

            // Conversión de los datos recibidos a String 
            String sOpcion = new String(recibo.getData()).trim(); 
            System.out.println("2" + sOpcion); 

            switch (sOpcion) { 
                case "COMP": 
                    System.out.println("2"); 
                    String info = "Dime cuántas entradas quieres comprar:"; 
                    mensaje = info.getBytes(); 
                    envio = new DatagramPacket(mensaje, mensaje.length, recibo.getAddress(), recibo.getPort()); 
                    socket.send(envio); 

                    // Limpieza del buffer 
                    buffer = new byte[1024]; 
                    // Preparación del paquete para recibir el mensaje 
                    recibo = new DatagramPacket(buffer, buffer.length); 
                    // Espera de recepción
                    socket.receive(recibo); 
                    String cantidad = new String(recibo.getData()).trim(); 
                    System.out.println("El cliente ha comprado " + cantidad + " entradas"); 
                    bSalir = true; 
                    break; 
            } // Fin del switch 
        } // Fin del while 

        socket.close(); 
    } // Fin del main 
} // Fin de la clase

Entradas relacionadas: