lpr-b:lpr-b-08:esercizi
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
| lpr-b:lpr-b-08:esercizi [29/10/2008 alle 22:12 (17 anni fa)] – Andrea Corradini | lpr-b:lpr-b-08:esercizi [03/09/2009 alle 09:10 (17 anni fa)] (versione attuale) – Andrea Corradini | ||
|---|---|---|---|
| Linea 40: | Linea 40: | ||
| Prima della terminazione il thread stampa il valore approssimato di pigreco calcolato fino a quel momento. | Prima della terminazione il thread stampa il valore approssimato di pigreco calcolato fino a quel momento. | ||
| - | |||
| - | //Soluzione proposta: [[http:// | ||
| Linea 47: | Linea 45: | ||
| Modificare il programma dell' | Modificare il programma dell' | ||
| - | //Soluzione proposta: [[http:// | ||
| ===== Thread Pooling e Indirizzi IP ===== | ===== Thread Pooling e Indirizzi IP ===== | ||
| Linea 58: | Linea 55: | ||
| * Per ottimizzare la ricerca, si deve attivare un pool di thread che esegua i task in modo concorrente. Ogni volta che si sottomette al pool di thread un task, si ottiene un oggetto **Future< | * Per ottimizzare la ricerca, si deve attivare un pool di thread che esegua i task in modo concorrente. Ogni volta che si sottomette al pool di thread un task, si ottiene un oggetto **Future< | ||
| * Infine, si scorre l’**ArrayList**, | * Infine, si scorre l’**ArrayList**, | ||
| + | |||
| === Esercizio 2 === | === Esercizio 2 === | ||
| Linea 164: | Linea 162: | ||
| ===== Il protocollo UDP [2] ===== | ===== Il protocollo UDP [2] ===== | ||
| + | ** Inviare gli esercizi svolti a acorradi@cli.di.unipi.it con Subject " | ||
| === Esercizio 1: Objects to DatagramPackets === | === Esercizio 1: Objects to DatagramPackets === | ||
| Linea 169: | Linea 168: | ||
| Scrivere la classe **Obj2DP** che fornisce due metodi statici: | Scrivere la classe **Obj2DP** che fornisce due metodi statici: | ||
| - | | + | public static Object dp2obj(DatagramPacket dp) |
| che restituisce l' | che restituisce l' | ||
| - | | + | public static DatagramPacket obj2dp(Object obj) |
| che restituisce un pacchetto contenente l' | che restituisce un pacchetto contenente l' | ||
| + | |||
| Semplificare le classi **UDP_SendObject** e **UDP_ReceiveObject** viste a lezione usando i metodi della classe **Obj2DP**, senza più usare le classi **ObjectOutput/ | Semplificare le classi **UDP_SendObject** e **UDP_ReceiveObject** viste a lezione usando i metodi della classe **Obj2DP**, senza più usare le classi **ObjectOutput/ | ||
| + | |||
| Usare la classe **Obj2DP** per i prossimi esercizi, trasmettendo oggetti serializzati con UDP invece di dati di tipi primitivi. | Usare la classe **Obj2DP** per i prossimi esercizi, trasmettendo oggetti serializzati con UDP invece di dati di tipi primitivi. | ||
| Linea 183: | Linea 184: | ||
| Si realizzino un Server e un Client UDP che realizzano un semplice Instant Messanger: ogni linea scritta nella shell del Server viene copiata nella shell del Client e viceversa. La trasmissione delle linee inizia dopo una semplice fase di handshaking, | Si realizzino un Server e un Client UDP che realizzano un semplice Instant Messanger: ogni linea scritta nella shell del Server viene copiata nella shell del Client e viceversa. La trasmissione delle linee inizia dopo una semplice fase di handshaking, | ||
| * Il Server viene lanciato da shell, fornendo il numero di porta su cui ricevere i pacchetti UDP. | * Il Server viene lanciato da shell, fornendo il numero di porta su cui ricevere i pacchetti UDP. | ||
| - | * Il Client viene lanciato da un' | + | * Il Client viene lanciato da un' |
| * Il Client manda una richiesta di connessione al Server, indicando nel messaggio la propria porta. Se non riceve un messaggio di ack entro 3 secondi, riprova a mandare la richiesta altre 5 volte, poi termina. Se invece riceve l'ack, inizia la trasmissione delle linee scritte nella shell locale e la ricezione e stampa delle linee scritte nella shell del Server. | * Il Client manda una richiesta di connessione al Server, indicando nel messaggio la propria porta. Se non riceve un messaggio di ack entro 3 secondi, riprova a mandare la richiesta altre 5 volte, poi termina. Se invece riceve l'ack, inizia la trasmissione delle linee scritte nella shell locale e la ricezione e stampa delle linee scritte nella shell del Server. | ||
| - | * Quando il Server riceve una richiesta di connessione, | + | * Quando il Server riceve una richiesta di connessione, |
| - | * Il Client decide quando disconnettersi in base a una condizione a vostra scelta (per esempio, allo scadere di un timeout, oppure se la linea da mandare è vuota, oppure se la stringa è “CLOSE”, | + | * Il Client decide quando disconnettersi in base a una condizione a vostra scelta (per esempio, allo scadere di un timeout, oppure se la linea da mandare è vuota, oppure se la stringa è “CLOSE”, |
| - | Per disconnettersi, | + | |
| * Quando il Server riceve una richiesta di disconnessione interrome la trasmissione delle linee, manda un messaggio di ack, e si rimette in attesa di una richiesta di connessione. | * Quando il Server riceve una richiesta di disconnessione interrome la trasmissione delle linee, manda un messaggio di ack, e si rimette in attesa di una richiesta di connessione. | ||
| - | Il Client e il Server devono scambiarsi unicamente oggetti della classe TalkMsg, usando i metodi della classe per crearne istanze e per ispezionare i messaggi arrivati. | + | Il Client e il Server devono scambiarsi unicamente oggetti della classe |
| + | |||
| + | === Esercizio 3: MiniTalk Messanger con UDP === | ||
| + | |||
| + | Riusando il più possibile il codice sviluppato per l' | ||
| + | |||
| + | Due istanze di Messanger devono essere lanciate in due shell diverse, fornendo ad ognuna tre dati: la porta locale, e l'host e la porta dell' | ||
| + | |||
| + | I messaggi scambiati devono essere tutti oggetti di una stessa classe. Usare la classe [[http:// | ||
| + | |||
| + | === Esercizio 4: TFTP con UDP (Trivial File Transfer Protocol) === | ||
| + | |||
| + | Questa è la specifica di TFTP da WIKIPEDIA: | ||
| + | |||
| + | * L'host A invia un pacchetto RRQ (read request) o WRQ (write request) all' | ||
| + | * B risponde con un ACK (acknowledgement) packet, che serve anche a dire ad A quale porta sull' | ||
| + | * L'host di origine invia dei pacchetti DATA numerati all' | ||
| + | * Il pacchetto DATA finale deve contenere un blocco di dati non pieno ad indicare che si tratta dell' | ||
| + | |||
| + | Realizzare un Server TFTP che implementa il comportamento dell' | ||
| + | * Client e Server devono scambiarsi solo oggetti di una classe, TFTPmsg, usati sia per messaggi di servizio (RRQ, WRQ, ACK) che per i pacchetti DATA: definire opportunamente la classe TFTPmsg. | ||
| + | * Per il trasferimento dei file, considerarli come file binari, usando quindi opportuni Output/ | ||
| + | * Inviare le porzioni di file in array di byte all' | ||
| + | |||
| + | Per testare il programma: | ||
| + | * Confrontare il file originale spedito dal mittente con quello ricevuto dal destinatario e scritto nel file system. | ||
| + | * Usare la classe [[http:// | ||
| + | |||
| + | ===== Il Protocollo TCP ===== | ||
| + | ** Inviare gli esercizi svolti a acorradi@cli.di.unipi.it con Subject " | ||
| + | |||
| + | === Esercizio 1: Compressione di file === | ||
| + | |||
| + | Progettare un' | ||
| + | Il client legge chunks di bytes da un file e li spedisce al server che provvede alla loro compressione. Il server restituisce | ||
| + | file originario e con estensione **gz**, che contiene i dati ricevuti dal server. | ||
| + | |||
| + | La comunicazione tra client e server utilizza il protocollo TCP. Per la compressione si può utilizzare la classe JAVA **GZIPOutputStream**. | ||
| + | |||
| + | Individuare le condizioni necessarie affinchè | ||
| + | |||
| + | **Suggerimento: | ||
| + | |||
| + | |||
| + | === Esercizio 2: Interazione con server predefiniti === | ||
| + | |||
| + | Considerare | ||
| + | |||
| + | ** Attenzione: | ||
| + | come protocollo HTTP sulla porta 80, e come host un web server (per esempio, '' | ||
| + | Scrivere un semplice client HTTP in grado di effettuare una breve sequenza di richieste al server, stampando i risultati. Per testare il protocollo si può usare il comando '' | ||
| + | attraverso la quale si possono scambiare stringhe. | ||
| + | |||
| + | ===== Ancora TCP e Multicast ===== | ||
| + | ** Inviare gli esercizi svolti a acorradi@cli.di.unipi.it con Subject " | ||
| + | |||
| + | === Esercizio 1: Asta Elettronica === | ||
| + | |||
| + | Sviluppare un programma client server per il supporto di un' | ||
| + | |||
| + | Ogni client possiede un budget massimo **B** da investire. | ||
| + | Il client può richiedere al server il valore **V** della migliore offerta | ||
| + | pervenuta fino ad un certo istante e decidere se abbandonare l' | ||
| + | oppure rilanciare. Se il valore ricevuto dal server supera **B**, | ||
| + | abbandona l' | ||
| + | inviando al server un valore maggiore di **V**. | ||
| + | |||
| + | Il server invia ai client che lo richiedono il valore della migliore offerta | ||
| + | ricevuta fino ad un certo momento e riceve dai client le richieste di | ||
| + | rilancio. Per ogni richiesta di rilancio, il server notifica al client se tale | ||
| + | offerta può essere accettata (nessuno ha offerto di più nel frattempo), | ||
| + | oppure è rifiutata. | ||
| + | Il server deve attivare un thread diverso per ogni client che intende | ||
| + | partecipare all' | ||
| + | |||
| + | La comunicazione tra clients e server deve avvenire mediante socket | ||
| + | TCP. Sviluppare due diverse versioni del programma che utilizzino, | ||
| + | rispettivamente una codifica testuale dei messaggi spediti tra client e | ||
| + | server oppure la serializzazione offerta da JAVA in modo da scambiare | ||
| + | oggetti tramite la connessione TCP | ||
| + | |||
| + | === Esercizio 2: TimeServer Multicast === | ||
| + | Definire un server **TimeServer**, | ||
| + | **dategroup**, | ||
| + | successivo può essere simulata mediante il metodo | ||
| + | di **dategroup** viene introdotta linea di comando. | ||
| + | |||
| + | Definire quindi un client **TimeClient** che si unisce a **dategroup** e riceve, per | ||
| + | dieci volte consecutive, | ||
| + | |||
| + | ===== Esercizi su RMI ===== | ||
| + | ** Inviare gli esercizi svolti a acorradi@cli.di.unipi.it con Subject " | ||
| + | |||
| + | === Esercizio 1: Gestione elezione === | ||
| + | Sviluppare una applicazione RMI per la gestione di un’elezione. Il server esporta un insieme di metodi: | ||
| + | |||
| + | * '' | ||
| + | |||
| + | * '' | ||
| + | |||
| + | * un metodo che consenta di ottenere i nomi di tutti i candidati, con i rispettivi voti, ordinati rispetto ai voti ottenuti. | ||
| + | |||
| + | Il client invoca un certo numero di volte i metodi del server su opportuni argomenti (eventualmente forniti interattivamente dall' | ||
| + | Testare che il sistema funzioni con server e client sullo stesso host e su host diversi. Nel secondo caso, provare due versioni: con il registry sull' | ||
| + | |||
| + | === Esercizio 2: Passaggio di parametri con RMI === | ||
| + | |||
| + | Scrivere opportune classi e interfacce per verificare che nel caso di valori di tipo riferimento (oggetti e array), una invocazione di metodo remota passa al metodo chiamante una copia dell' | ||
| + | |||
| + | ===== Esercizi su RMI Callbacks ===== | ||
| + | |||
| + | === Esercizio 1: Gestione elezione === | ||
| + | |||
| + | Modificare l’Esercizio 1 dell' | ||
| + | |||
| + | === Esercizio 2: Forum === | ||
| + | |||
| + | Si vuole implementare un sistema che implementi un servizio per la gestione di forum in rete. Un forum è caratterizzato da un argomento su cui diversi utenti, iscritti al forum, possono scambiarsi opinioni via rete. | ||
| + | Il sistema deve prevedere un server RMI che fornisca le seguenti funzionalità: | ||
| + | - apertura di un nuovo forum, di cui è specificato l' | ||
| + | - registrazione ad un forum, di cui è specificato l' | ||
| + | - inserimento di un nuovo messaggio indirizzato ad un forum identificato dall' | ||
| + | - reperimento dell' | ||
| + | Quindi il messaggio può essere richiesto esplicitamente dal client oppure può essere notificato ad un client precedentemente registrato. | ||
| + | |||
| + | |||
| + | ===== Esercizi su Collezioni Sincronizzate e Secure Sockets===== | ||
| + | |||
| + | === Esercizio 1: Crawler === | ||
| + | |||
| + | Si realizzi un programma **Crawler** che analizza tutti i file presenti | ||
| + | in una directory specificata e nelle sue sottodirectory, | ||
| + | righe presenti in tali file che contengono una determinata parola chiave //P//. | ||
| + | |||
| + | Il programma deve attivare due thread, | ||
| + | |||
| + | * un thread produttore che enumera tutti i file e inserisce un riferimento | ||
| + | ad ogni file individuato in una coda bloccante; | ||
| + | |||
| + | * un consumatore che estrae i riferimenti ai file dalla coda e, per ognuno | ||
| + | di essi, visualizza tutte le righe che contengono la parola chiave //P//. | ||
| + | I due thread si scambiano i dati mediante una coda bloccante. Scegliere il | ||
| + | tipo di coda bloccante ritenuto più opportuno. | ||
| + | |||
| + | |||
| + | === Esercizio 2: Secure Sockets === | ||
| + | |||
| + | Per prima cosa, tramite **keytool** creare le chiavi pubbliche/ | ||
| + | (che andranno associate al server nel keystore) ed estrarre il certificato che va importato in | ||
| + | un truststore (sul client). Usando le chiavi svolgere i seguenti esercizi: | ||
| + | |||
| + | - Effettuare una comunicazione sicura su TCP (come nell’esempio del Web Server visto a lezione) modificando uno degli esercizi assegnati nelle lezioni precedenti in maniera da usare socket sicuri invece dei socket TCP; | ||
| + | - Modificare l’esercizio sulla votazione RMI proposto per l' | ||
| + | |||
| + | In entrambi i casi, dal lato client deve essere presente solo il file con il truststore | ||
| + | (non il file con le chiavi). Tutte le password usate (per esempio per il trustore/ | ||
| + | NON devono essere | ||
| + | inserite nei file sorgenti, ma (per esempio) passate come parametri da riga di comando | ||
| + | o inserite a runtime. | ||
| ====== ====== | ====== ====== | ||
| [[start|Torna alla pagina principale di LPR-B-08]] | [[start|Torna alla pagina principale di LPR-B-08]] | ||
lpr-b/lpr-b-08/esercizi.1225318334.txt.gz · Ultima modifica: 29/10/2008 alle 22:12 (17 anni fa) da Andrea Corradini
