Skip to content

fsoladur/Proyecto_RC

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NanoFiles - Sistema P2P de Compartición de Archivos

NanoFiles es un sistema peer-to-peer (P2P) desarrollado en Java que permite a los usuarios compartir archivos a través de una red distribuida. El sistema implementa comunicación UDP para el directorio centralizado y TCP para la transferencia de archivos entre peers.

Proyecto desarrollado como parte de la asignatura de Redes de Computadores en la Universidad de Murcia por:

📋 Descripción del Proyecto

NanoFiles implementa una arquitectura híbrida donde:

  • Un servidor de directorio centralizado gestiona el registro de usuarios y la indexación de archivos compartidos
  • Los peers se conectan entre sí directamente para intercambiar archivos mediante protocolos TCP

Características principales:

  • ✅ Registro y autenticación de usuarios en el directorio
  • ✅ Publicación de archivos locales en el directorio global
  • ✅ Búsqueda de archivos disponibles en la red
  • ✅ Descarga directa P2P de archivos con verificación de integridad (hash)
  • ✅ Servidor de archivos en primer plano (foreground) y segundo plano (background)
  • ✅ Navegador de archivos remotos con interfaz de comandos
  • ✅ Protocolo tolerante a fallos con reintentos automáticos

🚀 Stack Tecnológico

Java UDP TCP P2P

Eclipse Git SHA256 Base64

Protocolos y Tecnologías Core:

  • 🌐 Java SE 8+: Compatible con Java 8, 11, 17 y versiones superiores
  • 📡 UDP Sockets: Comunicación con servidor de directorio (puerto 6868)
  • 🔗 TCP Sockets: Transferencia P2P de archivos entre peers
  • 🏗️ Arquitectura Híbrida: Directorio centralizado + intercambio P2P
  • 🔐 SHA-256: Verificación de integridad de archivos
  • 📦 Base64: Codificación para transferencia de datos
  • ⚡ Multithreading: Servidores concurrentes para múltiples clientes

📋 Compatibilidad de Versiones Java:

Versión Java Estado Características Utilizadas
Java 8 Compatible Base64, MessageDigest, HashMap, Collections
Java 11 Compatible StandardCharsets, LocalDateTime (java.time)
Java 17 Compatible Configuración actual del proyecto Eclipse

Nota: Aunque el proyecto está configurado para Java 17 en Eclipse, utiliza únicamente características disponibles desde Java 8, garantizando máxima compatibilidad.


🛠️ Tecnologías Requeridas

Requisitos del Sistema

  • Java SE Development Kit (JDK) 8 o superior (compatible con Java 8, 11, 17+)
  • Sistema Operativo: Windows, Linux, macOS
  • Memoria RAM: Mínimo 512MB disponible
  • Espacio en disco: 50MB para la aplicación + espacio para archivos compartidos
  • IDE recomendado: Eclipse IDE, IntelliJ IDEA, VS Code o cualquier IDE Java

Dependencias de Java

  • java.net.* - Para comunicación de red (UDP/TCP sockets)
  • java.io.* - Para manejo de archivos, streams y serialización
  • java.util.* - Para estructuras de datos (HashMap, Vector, etc.)
  • java.nio.* - Para operaciones de buffer de bytes
  • java.time.* - Para gestión de timestamps (LocalDateTime)
  • java.security.* - Para cálculo de hash SHA-256

Archivos de Configuración

  • .classpath: Configuración del classpath de Eclipse (ignorado en Git)
  • .project: Configuración del proyecto Eclipse (ignorado en Git)
  • bin/: Directorio de salida para archivos compilados (.class) (ignorado en Git)
  • src/: Directorio de código fuente Java
  • .gitignore: Archivos y directorios ignorados por Git

Puertos de Red

  • Puerto UDP 6868: Puerto por defecto del servidor de directorio
  • Puertos TCP dinámicos: Para servidores de archivos de cada peer (configurable)

📁 Estructura del Proyecto

Proyecto_RC/
├── .git/                           # Control de versiones Git
├── Directory.jar                   # Servidor de directorio compilado
├── Nanofiles.jar                  # Cliente NanoFiles compilado
├── Documentación_Nanofiles.pdf    # Documentación técnica completa
├── README.md                      # Este archivo
└── nanoFilesP2PalumnosUDP/        # Proyecto principal
    ├── .classpath                 # Configuración de classpath de Eclipse
    ├── .gitignore                 # Archivos ignorados por Git
    ├── .project                   # Configuración de proyecto Eclipse
    ├── bin/                       # Directorio de archivos .class compilados (generado automáticamente)
    │   └── es/um/redes/nanoFiles/ # Estructura de paquetes con archivos .class
    ├── nf-shared/                 # Directorio de archivos compartidos por defecto
    │   ├── 402.cpp               # Archivo de código C++
    │   ├── 707_FSD_resuelto.docx # Documento Word
    │   ├── foto.jpeg             # Imagen JPEG
    │   ├── simbolofium.png       # Imagen PNG
    │   ├── T7-G1-propuestos.zip  # Archivo comprimido
    │   └── tema3-ER-apuntes.pdf  # Documento PDF
    └── src/                      # Código fuente Java
        └── es/um/redes/nanoFiles/
            ├── client/           # Lógica del cliente
            │   ├── application/  # Controladores principales
            │   │   ├── NanoFiles.java         # Clase principal del cliente
            │   │   ├── NFController.java      # Controlador principal
            │   │   ├── NFControllerLogicDir.java    # Lógica del directorio
            │   │   └── NFControllerLogicP2P.java    # Lógica P2P
            │   ├── comm/         # Comunicación P2P
            │   │   └── NFConnector.java       # Conector para peers
            │   └── shell/        # Interfaz de comandos
            │       ├── NFCommands.java        # Definición de comandos
            │       └── NFShell.java           # Shell interactivo
            ├── directory/        # Servidor de directorio
            │   ├── connector/    # Cliente UDP para directorio
            │   │   └── DirectoryConnector.java
            │   ├── message/      # Protocolo de mensajes del directorio
            │   │   ├── DirMessage.java         # Mensajes del directorio
            │   │   └── DirMessageOps.java      # Operaciones del directorio
            │   └── server/       # Lógica del servidor de directorio
            │       ├── Directory.java          # Servidor principal
            │       └── DirectoryThread.java    # Hilo del servidor
            ├── message/          # Mensajería P2P
            │   ├── PeerMessage.java            # Mensajes entre peers
            │   └── PeerMessageOps.java         # Operaciones P2P
            ├── server/           # Servidor de archivos
            │   ├── NFServer.java               # Servidor multihilo
            │   ├── NFServerComm.java           # Comunicación del servidor
            │   ├── NFServerSimple.java         # Servidor simple
            │   └── NFServerThread.java         # Hilo del servidor
            └── util/             # Utilidades
                ├── FileDatabase.java           # Base de datos de archivos
                ├── FileDigest.java             # Cálculo de hash
                └── FileInfo.java               # Información de archivos

🚀 Instalación y Configuración

Opción 1: Usar JARs Precompilados (Recomendado)

  1. Asegurar que Java está instalado:

    java -version
  2. Ejecutar el servidor de directorio:

    java -jar Directory.jar
    # O con probabilidad de pérdida de paquetes para testing:
    java -jar Directory.jar -loss 0.1
  3. Ejecutar el cliente NanoFiles:

    java -jar Nanofiles.jar
    # O especificando directorio personalizado:
    java -jar Nanofiles.jar mi-directorio-compartido

Opción 2: Compilar desde Código Fuente

Compilación Manual con javac:

  1. Compilar el proyecto:

    cd nanoFilesP2PalumnosUDP/src
    javac -d ../bin es/um/redes/nanoFiles/**/*.java
  2. Crear JARs (opcional):

    cd ../bin
    jar cfe ../../Directory.jar es.um.redes.nanoFiles.directory.server.Directory .
    jar cfe ../../Nanofiles.jar es.um.redes.nanoFiles.client.application.NanoFiles .
  3. Ejecutar desde clases compiladas:

    # Servidor de directorio
    java -cp bin es.um.redes.nanoFiles.directory.server.Directory
    
    # Cliente
    java -cp bin es.um.redes.nanoFiles.client.application.NanoFiles

Compilación con Eclipse IDE:

  1. Importar el proyecto:

    • Abrir Eclipse IDE
    • File → Import → Existing Projects into Workspace
    • Seleccionar el directorio nanoFilesP2PalumnosUDP/
    • Configurar JDK: El proyecto funciona con Java 8, 11, 17 o superior
  2. Compilar automáticamente:

    • Eclipse compilará automáticamente al guardar los archivos
    • Los archivos .class se generan en bin/
  3. Ejecutar desde Eclipse:

    • Click derecho en Directory.java → Run As → Java Application
    • Click derecho en NanoFiles.java → Run As → Java Application

Compatibilidad Multi-JDK:

# Compilar con Java 8
javac -cp . -d bin src/es/um/redes/nanoFiles/**/*.java

# Compilar con Java 11
javac --release 8 -cp . -d bin src/es/um/redes/nanoFiles/**/*.java

# Compilar con Java 17
javac --release 8 -cp . -d bin src/es/um/redes/nanoFiles/**/*.java

📖 Uso del Sistema

Comandos Disponibles

Una vez ejecutado el cliente, la aplicación presenta un shell interactivo con los siguientes comandos:

Comandos de Directorio:

  • login <IP_directorio> - Conectarse al servidor de directorio
  • register <nickname> - Registrarse con un nickname único
  • userlist - Mostrar usuarios registrados en el directorio
  • filelist - Mostrar archivos disponibles en la red

Comandos de Servidor:

  • myfiles - Mostrar archivos en el directorio local compartido
  • fgserve <puerto> - Iniciar servidor de archivos en primer plano
  • bgserve <puerto> - Iniciar servidor de archivos en segundo plano

Comandos de Navegación P2P:

  • browse <nickname|IP:puerto> - Conectarse a un peer para explorar archivos
  • queryfiles - (En modo browse) Listar archivos del peer remoto
  • download <hash> <nombre_local> - (En modo browse) Descargar archivo
  • close - (En modo browse) Cerrar conexión con el peer

Comandos Generales:

  • help - Mostrar ayuda de comandos
  • quit - Salir de la aplicación

Ejemplo de Sesión Típica

# Terminal 1: Servidor de directorio
java -jar Directory.jar

# Terminal 2: Peer 1
java -jar Nanofiles.jar
> login localhost
> register usuario1
> bgserve 8080

# Terminal 3: Peer 2
java -jar Nanofiles.jar
> login localhost
> register usuario2
> filelist
> browse usuario1
> queryfiles
> download a1b2c3d4... documento.pdf
> close
> quit

🔧 Protocolos de Comunicación

Protocolo UDP (Cliente ↔ Directorio)

  • Puerto: 6868 (por defecto)
  • Mensajes: Login, registro, publicación de archivos, consultas
  • Tolerancia a fallos: Reintentos automáticos con timeout
  • Formato: Mensajes binarios con opcodes específicos

Protocolo TCP (Peer ↔ Peer)

  • Puertos: Dinámicos (configurables por el usuario)
  • Mensajes: Consulta de archivos, descarga, transferencia de datos
  • Formato: Texto estructurado campo:valor
  • Transferencia: Archivos enviados en chunks codificados en Base64

Operaciones de Mensajería P2P:

  • download - Solicitud de descarga de archivo
  • queryfiles - Lista de archivos disponibles
  • close - Cierre de conexión
  • download_ok - Confirmación con datos del archivo
  • download_error - Error en la descarga

🔐 Características de Seguridad

  • Verificación de integridad: Cada archivo se identifica por su hash SHA-256
  • Validación de usuarios: Nicknames únicos en el directorio
  • Timeouts: Prevención de conexiones colgantes
  • Control de errores: Manejo robusto de fallos de red

🐛 Resolución de Problemas

Problemas Comunes:

  1. "Directory cannot create UDP socket on port 6868"

    • Solución: Verificar que no hay otro proceso usando el puerto 6868
    • Comando: netstat -an | grep 6868
  2. "Server exception: Address already in use"

    • Solución: Cambiar el puerto del servidor de archivos
    • Usar un puerto diferente: fgserve 8081
  3. "El servidor no recibe los paquetes"

    • Solución: Verificar conectividad de red y firewall
    • Probar con login localhost si es local
  4. Archivos no aparecen en myfiles

    • Solución: Colocar archivos en el directorio nf-shared/
    • O especificar directorio personalizado al iniciar

Logs y Debugging:

  • Los errores se muestran en la consola con prefijo *
  • Para debugging detallado, modificar las clases en src/ y recompilar

📚 Documentación Adicional

  • Documentación técnica completa: Documentación_Nanofiles.pdf
  • Código fuente comentado: Directorio src/
  • Arquitectura del protocolo: Clases en message/

🤝 Desarrollo y Contribución

Para modificar o extender el proyecto:

  1. Editar código fuente: Modificar archivos en src/
  2. Recompilar: Usar comandos javac mostrados arriba
  3. Testing: Usar parámetro -loss para simular pérdida de paquetes
  4. Nuevas funcionalidades: Extender clases de mensaje y controladores

Gestión de Archivos Compilados

  • Archivos .class: Se generan automáticamente durante la compilación y están excluidos del control de versiones
  • Directorio bin/: Contiene archivos compilados y está ignorado por Git
  • Archivos de configuración: .classpath y .project están ignorados para evitar conflictos entre diferentes IDEs y configuraciones

📄 Licencia

Este proyecto está desarrollado con fines educativos para la asignatura de Redes de Computadores de la Universidad de Murcia.


Autor: Proyecto de Redes de Computadores por Fabián Sola y Juan Manuel Molero
Fecha de creación: 2023 Versión: P2P con UDP/TCP
Última actualización: 2025

About

Este proyecto pertenece al segundo cuatrimestre de 2º, concretamente, a la asignatura Redes de Comunicaciones. Nosotros programamos una serie de mensajes que se enviarían durante nuestro protocolo de uso.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors