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:
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
- ✅ 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
- 🌐 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
| 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.
- 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
java.net.*- Para comunicación de red (UDP/TCP sockets)java.io.*- Para manejo de archivos, streams y serializaciónjava.util.*- Para estructuras de datos (HashMap, Vector, etc.)java.nio.*- Para operaciones de buffer de bytesjava.time.*- Para gestión de timestamps (LocalDateTime)java.security.*- Para cálculo de hash SHA-256
.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
- Puerto UDP 6868: Puerto por defecto del servidor de directorio
- Puertos TCP dinámicos: Para servidores de archivos de cada peer (configurable)
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
-
Asegurar que Java está instalado:
java -version
-
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 -
Ejecutar el cliente NanoFiles:
java -jar Nanofiles.jar # O especificando directorio personalizado: java -jar Nanofiles.jar mi-directorio-compartido
-
Compilar el proyecto:
cd nanoFilesP2PalumnosUDP/src javac -d ../bin es/um/redes/nanoFiles/**/*.java
-
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 .
-
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
-
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
-
Compilar automáticamente:
- Eclipse compilará automáticamente al guardar los archivos
- Los archivos .class se generan en
bin/
-
Ejecutar desde Eclipse:
- Click derecho en
Directory.java→ Run As → Java Application - Click derecho en
NanoFiles.java→ Run As → Java Application
- Click derecho en
# 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/**/*.javaUna vez ejecutado el cliente, la aplicación presenta un shell interactivo con los siguientes comandos:
login <IP_directorio>- Conectarse al servidor de directorioregister <nickname>- Registrarse con un nickname únicouserlist- Mostrar usuarios registrados en el directoriofilelist- Mostrar archivos disponibles en la red
myfiles- Mostrar archivos en el directorio local compartidofgserve <puerto>- Iniciar servidor de archivos en primer planobgserve <puerto>- Iniciar servidor de archivos en segundo plano
browse <nickname|IP:puerto>- Conectarse a un peer para explorar archivosqueryfiles- (En modo browse) Listar archivos del peer remotodownload <hash> <nombre_local>- (En modo browse) Descargar archivoclose- (En modo browse) Cerrar conexión con el peer
help- Mostrar ayuda de comandosquit- Salir de la aplicación
# 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- 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
- 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
download- Solicitud de descarga de archivoqueryfiles- Lista de archivos disponiblesclose- Cierre de conexióndownload_ok- Confirmación con datos del archivodownload_error- Error en la descarga
- 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
-
"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
-
"Server exception: Address already in use"
- Solución: Cambiar el puerto del servidor de archivos
- Usar un puerto diferente:
fgserve 8081
-
"El servidor no recibe los paquetes"
- Solución: Verificar conectividad de red y firewall
- Probar con
login localhostsi es local
-
Archivos no aparecen en
myfiles- Solución: Colocar archivos en el directorio
nf-shared/ - O especificar directorio personalizado al iniciar
- Solución: Colocar archivos en el directorio
- Los errores se muestran en la consola con prefijo
* - Para debugging detallado, modificar las clases en
src/y recompilar
- Documentación técnica completa:
Documentación_Nanofiles.pdf - Código fuente comentado: Directorio
src/ - Arquitectura del protocolo: Clases en
message/
Para modificar o extender el proyecto:
- Editar código fuente: Modificar archivos en
src/ - Recompilar: Usar comandos javac mostrados arriba
- Testing: Usar parámetro
-losspara simular pérdida de paquetes - Nuevas funcionalidades: Extender clases de mensaje y controladores
- 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:
.classpathy.projectestán ignorados para evitar conflictos entre diferentes IDEs y configuraciones
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