Progetto di Programmazione a oggetti
Tecnologie InformaticheA.A. 2006/2007
Introduzione
Una grande Università che sul proprio sito web riceve molti accessi al giorno decide di replicare il contenuto del proprio server principale (di seguito: SERVER) per diminuire il carico di lavoro e la occupazione di banda su di esso. Per fare ciò vuole creare una rete di altri server, (di seguito: PROXY), con il requisito fondamentale che essi si aggiornino automaticamente ai cambiamenti del SERVER, quali l'aggiunta di nuove pagine web (FILE) e la modifica di FILE esistenti. I browser degli utenti (CLIENT) verranno quindi indirizzati sui PROXY invece che sul SERVER, visualizzeranno un sito sempre aggiornato e non sovraccaricheranno il SERVER principale.
L'Università, prima di realizzare la rete di PROXY, vuole simulare l'intero sistema con un programma scritto in linguaggio C++. Nel seguito sono descritti il meccanismo dettagliato del sistema e i requisiti per la sua simulazione.
Descrizione del sistema
Il CLIENTIl CLIENT è un computer dotato di un browser e di una memoria cache sulla quale vengono memorizzate le pagine web (FILE) accedute più di recente.
Il CLIENT tiene traccia della data di memorizzazione di ogni FILE nella cache.
Ogni CLIENT si connette alla rete attraverso un provider. Questa informazione sarà utilizzata per assegnare al client il PROXY più vicino.
Ogni volta che un utente richiede una pagina sul suo browser (ad esempio la pagina www.università.it/index.html), il CLIENT esegue questi passi:
- interroga il DNS, cioè un server apposito che restituisce l'indirizzo del PROXY più vicino (anziché l'indirizzo del SERVER)
- verifica l'eventuale possesso del FILE (pagina) in cache. Se il FILE c'è, il CLIENT chiede al PROXY la data di ultima modifica della pagina e la confronta con la data di memorizzazione del FILE in cache. Se i due FILE hanno la stessa data allora il CLIENT non fa altre richieste, ma mostra direttamente la pagina. Altrimenti prosegue con il prossimo passo.
- il CLIENT chiede il FILE al PROXY, lo visualizza e lo memorizza nella cache.
Chiameremo le due richieste di cui ai passi 2 e 3, rispettivamente: LastMod() e Get().
Il PROXY
Il PROXY è un computer in grado di rispondere alle richieste dei CLIENT e di eseguire, a sua volta, delle richieste al SERVER. Il PROXY ha una memoria dove mantiene i FILE.
Quando il PROXY riceve una richiesta, sia LastMod() che Get(), per poter rispondere deve prima verificare l'aggiornamento del FILE nella sua memoria. Poi potrà rispondere, rispettivamente:
- inviando la data dell'ultimo aggiornamento del file, nel caso di richiesta LastMod()
- inviando il file stesso, nel caso di richiesta Get()
L'aggiornamento del file si verifica in questo modo:
- Il PROXY deve verificare il possesso del FILE nella sua memoria.
- Se sì, deve verificare che non sia stato modificato sul SERVER, mediante una richiesta LastMod() analoga a quella del CLIENT.
- Se è stato modificato o se non era presente in memoria deve richiedere il FILE al SERVER (mediante una opportuna Get()) e (re)inserirlo in memoria.
Il SERVER
Il SERVER mantiene tutti i FILE, può rispondere alle richieste LastMod() e Get(), e, nel caso gli venga richiesto un file non esistente, restituisce un file speciale chiamato ERRORFILE. Inoltre è possibile aggiungere nuovi FILE sul SERVER e aggiornare file esistenti.
Modellazione
Modellare il sistema come segue.- una classe File. Ogni oggetto ha un contenuto, come stringa di testo. Ha un metodo per stamparsi e uno per restituire la propria lunghezza
- una classe base Computer, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
- un repository di FILE, con filename, size, date
- un log delle operazioni eseguite
- Add(), aggiunge un file al repository
- Touch(), aggiorna la data di un FILE alla data corrente (simula un aggiornamento del file)
- LastMod(), restituisce la data di un FILE
- Get(), restituisce il contenuto di un file
- Log(), aggiorna il log con l'operazione eseguita
- Stat(), stampa le statistiche relative al log
- una classe derivata Proxy, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
- Get() e LastMod() modificati per la verifica e l'aggiornamento del FILE
- gestione dell'ERRORFILE (non deve essere mai memorizzato in cache)
- una classe derivata Server, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
- Get() e LastMod() modificati per la gestione dei FILE inesistenti
- classe Dns
- classe Client, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
- stampa del FILE (simula la visualizzazione di una pagina)
- richiesta di un file
Realizzare un main() che, leggendo un file di configurazione in un formato a scelta, esegua una simulazione con 100 CLIENT, 4 PROXY, 1 SERVER, 1 DNS, 5 FILE.