LABORATORIO
DI PROGRAMMMAZIONE DI RETE
ESERCIZI
ASSEGNATI - A.A. 2003-2004
Ogni esercizio deve essere inviato all'indirizzo ricci@di.unipi.it,
entro 15 giorni dalla data di assegnazione.
Esercizio n. 1 Massimo (2
marzo) (Ripasso programmazione multithreaded).
Si carichi una matrice quadrata M(n*n) con numeri interi. Si vuole
calcolare il massimo di ogni riga
della matrice. A questo scopo si devono attivare n threads. Il thread
ti calcola il massimo della riga di
indice i della matrice data.
Esercizio n. 2 Asta (9 marzo)
(Ripasso programmazione Multithreaded)
Realizzare un programma che simuli
un'asta a cui partecipano n utenti. Ogni utente viene
implementato
mediante un diverso thread. Ogni utente propone un importo tra 1 e 1000
euro e lo comunica agli altri.
Quando tutti gli utenti hanno effettuato la loro richiesta, ogni therad
deve stampare l'indice del vincitore
e la differenza tra la sua offerta ed il valore offerto dal vincitore.
Esercizio n.3 (9 marzo)
(NsLookUp)
Si vuole realizzare un programma JAVA che consenta di tradurre
indirizzi IP in nomi simbolici
di hosts e viceversa. E' possibile utilizzare questo programma secondo
due diverse modalita'.
Nel primo caso, l'utente passa come parametro, a linea di comando, il
nome simbolico di
un host oppure un indizizzo IP e ne ottiene la traduzione. L'utente
puo' anche utilizzare una modalita'
interattiva. In quest'ultimo caso, viene letta da standard input una
sequenza di nomi simbolici/indirizzi IP
e se ne effettua la traduzione. L'immissione dei dati termina quando
l'utente inserisce la stringa "EXIT"
Esercizio n. 4 SimpleProtocol (16 marzo)
(Programmazione Client/Server
con protocollo TCP)
Realizzare una applicazione Client/Server definita come segue. Il
server SimpleServer pubblica un
socket su una porta il cui numero e' passato come argomento da riga di
comando, oppure, se
il numero di argomenti passati e' uguale a zero, sulla porta prefissata
1528. Accettata la connessione da
parte del client, SimpleClient, il server visualizza l'indirizzo IP e
la porta da cui il client si e' connesso, poi
invia al client la stringa "CIAO SEI CONNESSO", quindi si mette in
attesa di un messaggio da SimpleClient.
Il client, SimpleClient si connette alla porta pubblicata dal server,
attende un messaggio da SimpleServer e stampa
la stringa ricevuta. Quindi manda il messaggio"OK" al Server. Al
termine di questo protocollo
la connessione viene chiusa. Impostare opportuni time-outs sulle
connessioni. Gestire le eccezioni
in modo da rilevare l'esatta causa per cui si e' verificata la
eccezione. Utilizzare il protocollo TCP.
Esercizio n.5 (23 marzo)
(Programmazione Client/Server con
protocollo TCP)
Implementare un sistema che gestisca un
registro di classe in rete. Il sistema comprende un server
multithreaded e diverse istanze di clients che si
connettono al server.
Il registro di classe riporta una entrata per ogni alunno. Ogni entrata
riporta la matricola dell'alunno,
il numero di assenze fatte, il numero di quelle giustificate, il numero
di rapporti subiti.
Il server legge inizialmente le informazioni relative agli alunni da un
file e le memorizza in
una tabella realizzata come un
Hashtable. Ogni client puo' richiedere al server informazioni
relative
ad ogni alunno. Il protocollo client/server prevede che prima il client
invii la matricola dell'alunno, e
che il server verifichi che esista un alunno con quella matricola.
Successivamente il
client puo' richiedere informazioni riguardo a quell'alunno (n.assenze,
n.assenze giustificate, etc)
oppure modificare una di queste informazioni.
Esercizio n.6 (6
aprile)
(Implementazione
protocollo UDP affidabile)
Progettare una applicazione che prevede un server che pubblica un
socket UDP su un indirizzo noto, accetta messaggi
provenienti da questa porta e ne effettua l'eco.
Ogni client invia al server una sequenza di messaggi, contenenti il
testo del messaggio ed un identificatore che identifica univocamente
ogni messaggio tra quelli spediti. Dopo aver inviato un messaggio, il
client attiva un time-out sulla ricezione dell'echo al messaggio msgi.
Nel caso in cui il time out scatti prima di ricevere l'echo di msgi, il
client continua a spedire ulteriori messaggi.
E' necassario che nella fase di ricezione dell'echo del messaggio msgi,
vengano scartati eventuali echos relativi
a messaggi spediti in precedenza. Poiche' la perdita/il ritardo di
pacchetti UDP e' un evento comune su WAN, ma non su LAN, occorre
prevedere nel server per simulare la perdita/ritardo di tali pacchetti
Esercizio n.7 (20
aprile) (Utilizzo del Multicast)
Scrivere un programma TimeServer che invia su un gruppo di
multicast la data e l'ora ad intevalli regolari.
Scrivere poi il programma TimeClient che si unisce al gruppo di
multicast, riceve per 10 volte la data e l'ora e
la stampa
Esercizio n.8 (20
aprile) (Serializzazione oggetti)
Modificare l'esercizio n.5 in modo da usare gli ObjectStreams per la
comunicazione tra Client e Servers
Esercizio n.9 (27
aprile) (Utilizzo multicast + Invio Oggetti su
connessioni UDP)
Si consideri una applicazione composta da m servers Magazzino1, ...,
Magazzinom ed n clients Client1, ...,Clientn.
Ogni Client ed ogni server e' allocato all'interno di uno spazio
virtuale bidimensionale ed puo' essere individuato
dalle sue coordinate cartesiane all'inteno di questo spazio.
Ogni Magazzino possiede un elenco di articoli, ognuno caratterizzato
dal suo codice e dalla quantita' presente in magazzino(scorta).
Le informazioni riguardanti gli articoli vengono caricate da un file.
Ogni magazzino invia periodicamente le sue
coordinate ad un gruppo di multicast M a cui ogni client si collega
all'inizio della propria esecuzione. Quando un client
riceve una informazione da M, la scarta se la ha ricevuta
precedentemente, altrimenti la memorizza in una
struttura dati opportuna.
Ogni client riceve dall'utente, in modo interattivo, il codice e la
quantita' di un prodotto e richiede tale prodotto al
magazzino piu' vicino, ttamite una connessione UDP. Il Magazzino invia
al client un ack, nel caso possieda tale
prodotto in quantita' sufficiente, altrimenti invia un nack. Il client
visualizza la risposta e, nel caso di nack, provvede
ad inviare una ulteriore richiesta al Magazzino piu' vicino, scelto tra
i rimanenti. Il procedimento termina quando il
Client riceve una risposta positiva da un magazzino, oppure quando sono
stati consultati tutti i magazzini.
Per inviare oggetti su collegamenti UDP utilizzare serializzazione come
visto in classe.
Esercizio n.10 (5maggio)
(Programmazione
client server basata su RMI)
Si vuole implementare un sistema che implementi un servizio per la
gestione di forum in rete. Un
forum e' caratterizzato
da un argomento su cui
diversi utenti possono scambiarsi opinioni via rete. Il sistema deve
prevedere un server RMI che fornisca
le seguenti funzionalita':
a) apertura di un nuovo forum,
di cui e' specificato l'argomento
b) inserimento di un nuovo messaggio indirizzato
ad un forum identificato dall'argomento
c) reperimento dell'ultimo messaggio
inviato ad un forum di cui e' specificato l'argomento.
Si devono definire almeno le
seguenti classi:
- una interfaccia ForumInterface,
che definisce i metodi del server che possono essere invocati in remoto
- una classe Forum che
implementa la struttura dati relativa ad un singolo forum. Il numero
massimo di messaggi per ogni forum e'definito staticamente ed e' uguale
per ogni forum
- una classe Server che
gestisce i forum implementando i metodi definiti nella interfaccia ForumInterface. Il numero massimo di forum che
possono essere gestiti da Server e' determinato
staticamente
- una classe Client che
interagisce con l'utente ed, in base alle richieste dell'utente, invoca
i metodi di Server.
- una classe Messaggio che implementa la struttura dati che
descrive il messaggio inviato al forum . Si supponeche un messaggio sia
rappresentato come un vettore di stringhe la cui lunghezza viene
determinata staticamente