Skip to content

ProocessiAnonimi/LABSO_PROCESSI_ANONIMI

Repository files navigation

Progetto LABSO - Sistema Peer-to-Peer

Questo è un sistema peer-to-peer in Java che implementa la condivisione di risorse tra peer attraverso un server master centralizzato. src

Struttura del Progetto

LABSO_PROCESSI_ANONIMI/
├── P2P_Project/
|   └── src/
|       ├── resources.json           # File di persistenza delle risorse (generato automaticamente)
|       ├── download_log.txt         # Log dei download (generato automaticamente)
|       ├── Client_files/            # Directory per le risorse dei client (creata automaticamente)
│       ├── Master.java          # Server master per la gestione della rete
│       └── Client.java          # Applicazione client/peer
├── README.md               # Questo file
└── DOCUMENTAZIONE.pdf      # Documentazione completa del progetto

Requisiti

  • Java SE 24 (o versione LTS recente)
  • Sistema operativo: Windows, macOS, o Linux
  • Connessione di rete (per comunicazione tra peer)

Compilazione

Su Linux/macOS:

javac src/Master.java
javac src/Client.java

Su Windows:

javac src\Master.java
javac src\Client.java

Avvio del Sistema

1. Avviare il Master Server

Il master deve essere avviato per primo e rimane in ascolto sulla porta specificata:

java -cp src Master <PORTA>

Esempio:

java -cp src Master 9000

Output atteso:

Master server avviato sulla porta 9000
File delle risorse: resources.json
In attesa di connessioni client...
----------------
Comandi disponibili:
- listdata -> Lista risorse disponibili
- log -> Log richieste download
- help -> Mostra comandi disponibili
- quit -> Chiudi il server
----------------
>

2. Avviare i Client/Peer

Ogni client si connette al master specificando IP e porta:

java -cp src Client <IP_MASTER> <PORTA_MASTER>

Esempio (su localhost):

java -cp src Client 127.0.0.1 9000

Output atteso:

Connesso Peer123 al master su 127.0.0.1:9000
Server peer avviato automaticamente sulla porta 52341
Registrato al master come peer sulla porta 52341
Risorse locali registrate al master.
----------------
Comandi disponibili:
- add <file> --> Condividi un file
- listdata local --> Mostra file locali
- listdata remote --> Mostra file disponibili
- download <file> --> Scarica un file
- help --> Mostra comandi disponibili
- quit --> Esci
----------------
>

Comandi Disponibili

Comandi Master

  • listdata - Mostra tutte le risorse disponibili nella rete

    > listdata
    Risorse disponibili nella rete:
    - file1.txt: Peer123 Peer456 
    - file2.txt: Peer789 
    
  • log - Visualizza il log dei download effettuati

    > log
    === LOG DOWNLOAD ===
    [2025-09-27 14:30:15] File: file1.txt, da: Peer123, a: Peer456, Event: DOWNLOAD_SUCCESS
    [2025-09-27 14:31:22] File: file2.txt, da: Peer789, a: Peer123, Event: DOWNLOAD_FAILED - Risorsa rimossa
    ===================
    
  • help - Mostra l'elenco dei comandi

  • quit - Termina il server master

Comandi Client

  • add <nome> <contenuto> - Aggiunge una nuova risorsa

    > add test.txt Contenuto di esempio
    File 'test.txt' creato/sovrascritto localmente.
    
  • listdata local - Mostra le risorse locali

    > listdata local
    Risorse locali:
    - file1.txt
    - test.txt
    
  • listdata remote - Mostra tutte le risorse nella rete

    > listdata remote
    Risorse disponibili nella rete:
    - file1.txt: Peer123, Peer456
    - file2.txt: Peer789
    - test.txt: Peer123
    
  • download <nome> - Scarica una risorsa da un peer

    > download file1.txt
    Trovati 2 peer per file1.txt
    Download completato da Peer456, dimensione: 1024 bytes
    >>> DOWNLOAD RIUSCITO da Peer456 <
    
  • help - Mostra l'elenco dei comandi

  • quit - Disconnette il client e termina

Caratteristiche Principali

1. Sincronizzazione e Concorrenza

  • Uso di ReentrantReadWriteLock per gestire l'accesso concorrente alla lista delle risorse
  • ExecutorService con thread pool per gestire le connessioni multiple
  • Gestione seriale delle richieste ai peer (una richiesta per volta)

2. Protocollo Robusto di Download

  • Meccanismo di retry automatico in caso di peer non disponibili
  • Notifica al master dei peer non raggiungibili
  • Aggiornamento automatico della lista risorse
  • Fallback su peer alternativi

3. Persistenza

  • Le risorse vengono salvate in resources.json
  • I download vengono tracciati in download_log.txt
  • Riattivazione automatica delle risorse alla riconnessione

4. Gestione della Disconnessione

  • Le risorse dei peer disconnessi vengono marcate come non disponibili
  • Riattivazione automatica alla riconnessione
  • Cleanup automatico delle risorse

Esempio di Utilizzo Completo

Scenario: 3 Peer che condividono risorse

  1. Avvio Master

    java -cp src Master 9000
  2. Avvio Peer1

    java -cp src Client 127.0.0.1 9000
    > add documento1.txt Contenuto documento 1
  3. Avvio Peer2

    java -cp src Client 127.0.0.1 9000
    > add documento2.txt Contenuto documento 2
  4. Avvio Peer3

    java -cp src Client 127.0.0.1 9000
    > listdata remote
    Risorse disponibili nella rete:
    - documento1.txt: Peer123
    - documento2.txt: Peer456
    
    > download documento1.txt
    Trovati 1 peer per documento1.txt
    Download completato da Peer123, dimensione: 256 bytes
    >>> DOWNLOAD RIUSCITO da Peer123 <

Gestione Errori

Il sistema gestisce automaticamente:

  • Peer non raggiungibili durante il download
  • Disconnessioni improvvise
  • Risorse non più disponibili
  • Conflitti di accesso concorrente
  • Timeout di rete

Note Importanti

  1. La directory Client_files/ viene creata automaticamente per ogni client
  2. Le porte dei peer vengono assegnate automaticamente dal sistema
  3. Il master mantiene traccia di tutte le risorse anche quando i peer si disconnettono
  4. È possibile avviare più client sulla stessa macchina (useranno porte diverse)

Autori

  • Bufalox
  • Alexis1513
  • Ilaria-Lee
  • Fede046

Licenza

Progetto didattico per il corso di Laboratorio di Sistemi Operativi - Università di Bologna A.A. 2024-2025

About

Sistema Peer-to-Peer in Java con server master centralizzato per la gestione delle risorse. Supporta condivisione file tra peer, persistenza su JSON, log dei download, gestione della concorrenza e riconnessione automatica dei nodi. Progetto didattico per il corso di Laboratorio di Sistemi Operativi (UniBo, A.A. 2024-2025).

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages