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