lpr-b:lpr-b-09: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-09:esercizi [22/10/2009 alle 20:33 (16 anni fa)] – Andrea Corradini | lpr-b:lpr-b-09:esercizi [08/12/2009 alle 12:45 (15 anni fa)] (versione attuale) – Andrea Corradini | ||
---|---|---|---|
Linea 72: | Linea 72: | ||
Si suggerisce di definire una classe per ogni tipo di task di calcolo, fattorizzando le funzionalità comuni (come la stampa finale) in una superclasse astratta comune. | Si suggerisce di definire una classe per ogni tipo di task di calcolo, fattorizzando le funzionalità comuni (come la stampa finale) in una superclasse astratta comune. | ||
- | [[Soluzioni# | + | [[Soluzioni# |
=== Esercizio 2: Raffinamenti === | === Esercizio 2: Raffinamenti === | ||
Linea 101: | Linea 101: | ||
* Usare il metodo statico **getNetworkInterfaces()** per ottenere una **Enumeration** di **NetworkInterface**. | * Usare il metodo statico **getNetworkInterfaces()** per ottenere una **Enumeration** di **NetworkInterface**. | ||
* Per ogni **NetworkInterface**, | * Per ogni **NetworkInterface**, | ||
+ | |||
+ | [[Soluzioni# | ||
=== Esercizio 2 === | === Esercizio 2 === | ||
Linea 158: | Linea 160: | ||
Simulare l' | Simulare l' | ||
+ | |||
+ | ===== Il protocollo UDP ===== | ||
+ | ** Inviare gli esercizi svolti a [email protected] con Subject " | ||
+ | |||
+ | == Avviso: Per eseguire gli esercizi su di un unico host == | ||
+ | |||
+ | - Attivare il client/ | ||
+ | - Se l’host è connesso in rete: utilizzare come indirizzo IP del mittente/ | ||
+ | - Se l’host non è connesso in rete utilizzare l’indirizzo di loopback (“localhost” o 127.0.0.1) | ||
+ | - Tenere presente che mittente e destinatario sono in esecuzione sulla stessa macchina, quindi devono utilizzare porte diverse | ||
+ | - Mandare in esecuzione per primo il server/ | ||
+ | |||
+ | == Avviso: Per eseguire gli esercizi su più host distinti == | ||
+ | |||
+ | - Se siete nel Laboratorio M, potete usare come host remoti gli altri computer del laboratorio: | ||
+ | - Usando questa shell potete mandare in esecuzione su quell' | ||
+ | |||
+ | === Esercizio 1: Invio di Datagram UDP === | ||
+ | Scrivere un' | ||
+ | |||
+ | Considerare poi i seguenti punti: | ||
+ | * Cosa cambia se mando in esecuzione prima il Sender, poi il Receiver rispetto al caso in cui mando in esecuzione prima il Receiver? | ||
+ | * Nel processo Receiver, aggiungere un time-out sulla receive, in modo che la receive non si bocchi per più di 5 secondi. Cosa accade se attivo il receiver, ma non il sender? | ||
+ | |||
+ | |||
+ | - Modificare il codice del Sender in modo che usi lo stesso socket per inviare lo stesso messaggio a due diversi receivers. Mandare in esecuzione prima i due Receivers, poi il Sender. Controllare l' | ||
+ | - Modificare il codice del Sender in modo che esso usi due sockets diversi per inviare lo stesso messaggio a due diversi receivers. Mandare in esecuzione prima i due Receivers, poi il Sender. | ||
+ | - Modificare il codice ottenuto al passo precedente in modo che il Sender invii una sequenza di messaggi ai due Receivers. | ||
+ | - Modificare il codice ottenuto al passo precedente in modo che il Sender non si sospenda tra un invio e l’altro. Cosa accade? | ||
+ | - Modificare il codice iniziale in modo che il Receiver invii al Sender un ack quando riceve il messaggio. Il Sender visualizza l’ack ricevuto. | ||
+ | |||
+ | === Esercizio 2: CountDown Server === | ||
+ | |||
+ | Si richiede di programmare un server **CountDownServer** che fornisce | ||
+ | un semplice servizio: ricevuto da un client un valore intero n, il server | ||
+ | spedisce al client i valori | ||
+ | |||
+ | Il client deve calcolare il numero di pacchetti persi e quello di quelli | ||
+ | ricevuti fuori ordine e lo visualizza alla fine della sessione. | ||
+ | Utilizzare le classi **ByteArrayOutput/ | ||
+ | generazione/ | ||
+ | |||
+ | La interazione tra i clients e CountDownServer è di tipo connectionless. | ||
+ | Si richiede di implementare due versioni di CountDownServer | ||
+ | |||
+ | - realizzare CountDownServer come un server iterativo. L’applicazione riceve la richiesta di un client, gli fornisce il servizio e solo quando ha terminato va a servire altre richieste | ||
+ | - realizzare CountDownServer come un server concorrente. Si deve definire un thread che ascolta le richieste dei clients dalla porta UDP a cui è associato il servizio ed attiva un thread diverso per ogni richiesta ricevuta. Ogni thread si occupa di servire un client. | ||
+ | |||
+ | Per testare il funzionamento del client, può essere utile usare la classe [[http:// | ||
+ | |||
+ | ===== Il protocollo UPD (2) ===== | ||
+ | ** Inviare gli esercizi svolti a [email protected] con Subject " | ||
+ | |||
+ | === Esercizio 1: Objects to DatagramPackets === | ||
+ | |||
+ | Scrivere la classe **Obj2DP** che fornisce due metodi statici: | ||
+ | |||
+ | public static Object dp2obj(DatagramPacket dp) | ||
+ | |||
+ | che restituisce l' | ||
+ | |||
+ | public static DatagramPacket obj2dp(Object obj) | ||
+ | |||
+ | 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/ | ||
+ | |||
+ | Usare la classe **Obj2DP** per i prossimi esercizi, trasmettendo oggetti serializzati con UDP invece di dati di tipi primitivi. | ||
+ | |||
+ | === Esercizio 2: MiniTalk Server e Client con UDP === | ||
+ | |||
+ | 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 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. | ||
+ | * 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”, | ||
+ | * 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 [[http:// | ||
+ | |||
+ | === 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 [email protected] 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 '' | ||
+ | |||
+ | Individuare le condizioni necessarie affinchè | ||
+ | |||
+ | **Suggerimento: | ||
+ | |||
+ | |||
+ | === Esercizio 2: Compressione di file, estensioni === | ||
+ | |||
+ | Si realizzi il client con due thread, uno per la lettura del file originale e l' | ||
+ | ove necessario, la sincronizzazione fra i due e la gestione degli errori) | ||
+ | |||
+ | Si realizzi il server in modo da poter gestire in maniera efficiente connessioni multiple da parte di più client – si ipotizzi anche che il numero di richieste di servizio possa | ||
+ | essere elevato | ||
+ | |||
+ | Quali costrutti per il multithreading sono maggiormente indicati in ciascuno dei due casi di cui sopra? | ||
+ | |||
+ | **Suggerimento: | ||
+ | |||
+ | |||
+ | === Esercizio 3: Interazione con server predefiniti === | ||
+ | |||
+ | Utilizzando come protocollo HTTP (come visto nel corso di Reti) 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 '' | ||
+ | |||
+ | ===== Protocollo TCP e Multicast ===== | ||
+ | ** Inviare gli esercizi svolti a [email protected] 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, | ||
+ | |||
+ | === Esercizio 3: Streaming Audio === | ||
+ | La pagina '' | ||
+ | audio nel popolare formato WAV (audio non compresso) | ||
+ | |||
+ | * Questi dati possono generalmente essere riprodotti, su macchine UNIX, semplicemente scrivendo il loro contenuto su ''/ | ||
+ | * Attenzione: su alcune installazioni, | ||
+ | * Si scriva un server streaming audio che, ricevuta sulla riga di comando l'URL di un file WAV, lo scarichi dal web e trasmetta il contenuto, con adeguata temporizzazione, | ||
+ | * Si scriva poi un client streaming audio che, ricevuto sulla riga di comando l' | ||
+ | |||
+ | Non ci si allarmi se l' | ||
+ | |||
+ | |||
+ | |||
+ | ===== Remote Method Invocation ===== | ||
+ | ** Inviare gli esercizi svolti a [email protected] 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' | ||
+ | |||
+ | ===== RMI e Callback ===== | ||
+ | |||
+ | === 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. | ||
+ | |||
===== ===== | ===== ===== |
lpr-b/lpr-b-09/esercizi.1256243620.txt.gz · Ultima modifica: 22/10/2009 alle 20:33 (16 anni fa) da Andrea Corradini