Este repositorio contiene una serie de ejercicios académicos enfocados en la implementación de Sistemas Distribuidos en Java. Los proyectos abordan la comunicación entre procesos mediante diferentes niveles de abstracción y protocolos.
- Java RMI (Remote Method Invocation)
- Sockets TCP (Orientados a conexión)
- Sockets UDP (No orientados a conexión)
- Canales Asíncronos
/src ├── /TresEquipos # Sistema híbrido (Async, RMI y Sockets) ├── /CineRMI # Reserva de entradas (Gestión de aforo) ├── /TrenRMI # Reserva de asientos específicos (Matriz) └── /RMIPrimos # Procesamiento paralelo RMI └── /SocketsTCPprimos # Procesamiento paralelo distribuido TCP └── /SocketsUDPprimos # Procesamiento paralelo distribuido UDP
Cada proyecto es independiente. Para probar los sistemas distribuidos, generalmente deberás seguir este orden:
- Iniciar el Servidor (o Registry RMI): Ejecutar primero la clase Servidor o MainServidor.
- Iniciar el/los Cliente(s): Ejecutar la clase Cliente o MainCliente en una terminal separada (o varias para probar concurrencia). Nota: Asegurarse de que los puertos utilizados (ej. 1099 para RMI, o puertos TCP/UDP específicos) estén libres en la máquina. Este repositorio fue creado con fines educativos para la asignatura de Paradigmas de Programación.
-
Sistema Híbrido de 3 EQUIPOS (E1, E2, E3) 🔄. Integración de múltiples protocolos de comunicación en un flujo circular de datos. Se simula un sistema compuesto por tres nodos que procesan información numérica secuencialmente:
- E1 ➔ E2: Canales de comunicación asíncronos.
- E2 ➔ E3: Java RMI.
- E3 ➔ E1: Sockets TCP. Lógica del Flujo:
- Equipo E1 (Cliente/Iniciador): Lee 5 enteros positivos del usuario (descarta negativos). Los envía a E2. Finalmente, espera resultados de E3 hasta recibir un flag de parada (-10).
- Equipo E2 (Servidor Intermedio): Servicio continuo. Recibe un número N, genera dos nuevos (
$N \times 2$ y$N / 2$ división entera) y los envía inmediatamente a E3 vía RMI. Total: 10 envíos. - Equipo E3 (Filtro): Recibe los 10 números. Filtra y elimina los que sean múltiplos de 3. Envía los restantes a E1 vía TCP y finaliza enviando un -10.
-
CINE RMI: Cliente-Servidor con estado compartido y concurrencia. Sistema de reserva de entradas para un cine con 4 películas y salas de capacidad limitada (máx. 30). El cliente consulta la cartelera. Intenta comprar N entradas para una película. Respuestas del Servidor:
- Reserva exitosa: Se descuenta el aforo.
- No hay entradas suficientes: Devuelve una lista de películas alternativas que sí tienen cupo.
- Cine completo: Informa del cierre de ventas. El servidor maneja múltiples clientes simultáneamente garantizando la integridad de los datos (Thread-safety).
-
BILLETES RMI 🚆: Gestión de recursos específicos (Matriz de Asientos). Simulación de reservas en un vagón representado por una matriz de 10 filas x 4 columnas. El cliente solicita un asiento específico por coordenada (Fila, Columna). Respuestas del Servidor:
- Reservado: Compra exitosa.
- Ocupado: El asiento ya tiene dueño. El servidor devuelve la lista de asientos libres para que el cliente elija otro.
- Vagón completo: Finaliza la operación. Integridad de datos ante peticiones concurrentes.
-
Cálculo de PRIMOS Distribuido con todos los mecanismos (RMI, TCP y UDP): computación paralela y comparación de protocolos de transporte. Tres versiones de un mismo problema: Calcular la cantidad de números primos entre 1 y N. Todos siguen una lógica común:
- El cliente envía un número N.
- El servidor calcula la cantidad de primos en ese rango.
- Paralelismo: cálculo en el servidor debe realizarse obligatoriamente utilizando al menos 2 hilos de ejecución para dividir la carga de trabajo. Las varientes de implementación son:
- Versión RMI: Invocación de método remoto. Abstracción alta.
- Versión Sockets TCP: Fiabilidad y orden garantizado (Stream).
- Versión Sockets UDP: Envío de datagramas sin conexión (rápido pero sin garantías de entrega).