LABORATORIO
DI PROGRAMMMAZIONE DI RETE
ESERCIZI
ASSEGNATI - A.A. 2004-2005
Ogni esercizio deve essere inviato all'indirizzo ricci@di.unipi.it,
entro la data stabilita a lezione.
Esercizio n. 1 Massimo
(14 febbraio)
(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. (21 febbraio) (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".
E' necessario visualizzare anche la classe dell'indirizzo IP.
Esercizio n.3 (28 febbraio) (Gestione Laboratorio)
(Ripasso sincronizzazione tra Threads)
Il laboratorio di Informatica del Polo Marconi e' utilizzato da
tre tipi di utenti, studenti, tesisti e professori ed
ogni utente deve fare una richiesta al tutor per accedere al
laboratorio. I computers del laboratorio sono numerati da 1 a 20.
Le richieste di accesso sono diverse a seconda del tipo
dell'utente:
a) i professori accedono in modo esclusivo a tutto il laboratorio,
poiche' hanno necessita' di utilizzare tutti i
computers per effettuare prove in rete.
b) i tesisti richiedono l'uso esclusivo di un solo computer,
identificato dall'indice i, poiche' su quel computer e' istallato
un particolare software necessario per lo sviluppo della tesi.
c) gli studenti richiedono l'uso esclusivo di un qualsiasi computer.
I professori hanno priorita' su tutti nell'accesso al laboratorio, i
tesisti hanno priorita' sugli studenti.
Scrivere un programma JAVA che simuli il comportamento degli utenti e
del tutor. Il programma
riceve in ingresso il numero di studenti, tesisti e professori che
utilizzano il laboratorio ed attiva
un thread per ogni utente. Ogni utente accede k volte al laboratorio,
con k generato casualmente.
Simulare l'intervallo di tempo che intercorre tra un accesso ed il
successivo e l'intervallo
di permanenza in laboratorio mediante il
metodo sleep.
Il tutor deve coordinare gli accessi al laboratorio. Il programma deve
terminare quando tutti gli utenti
hanno completato i loro accessi al laboratorio.
Esercizio n.4 (7 marzo) (Gestione Conti Correnti)
(Protocollo UDP/Utilizzo di byteArrayOutput/InputStreams per la
costruzione dei pacchetti UDP)
Si consideri una applicone che definisce un Client UtenteBanca ed un server GestoreCorrenti.
Il
server gestiscesce un insieme di conti correnti, per ogni conto corrente
memorizza codice e saldo.
Il client invia al server richieste del tipo (Tipo,Cod), dove Tipo e'
il tipo della richiesta e Cod e' il codice
del conto corrente. Tipo puo' assumere i seguenti valori:
V=Versamento
P= Prelievo
S= Saldo
Nel caso di tipo="V" oppure ="P" il client invia anche l'importo da
versare/prelevare.
Implementare il client ed il server, utilizzando il protocollo UDP per
la comunicazione tra di essi.
Utilizzare i filtri sugli streams per implementare la comunicazione.
Esercizio n.5 (14 marzo) (Calcolo massimo distribuito) (Invio di
oggetti su connessioni UDP)
Si supponga che una grande azienda produttrice di computers
abbia n filiali. Ogni filiale
commercializza 5 modelli di computers prodotti dalla azienda. Si
supponga che ogni filiale voglia
conoscere, per ogni modello di computer, il nome della filiale che
possiede nel suo magazzino il
maggior numero di computers di quel modello.
Si attivi per ogni file un server, Serverfiliale, che memorizzi le
giacenze dei computers presso quella
filiale. I servers sono interconnessi mediante una struttura logica di
interconnessione ad anello
(ogni server puo' solamente comunicare con il suo successore ed il suo
predecessore sull'anello,
non esiston altri servers o altre comunicazioni). La computazione e'
innescata da un server arbitrario presente
sull'anallo. Utilizzare gli stream di oggetti per generare pacchetti
UDP.
Esercizio n.6 (21
marzo) (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.8 (11
aprile) (Utilizzo socket TCP)
Scrivere una applicazione client/server caratterizzata dal seguente
protocollo tra client e server:
ogni client invia al server un nome. Il server concatena i nomi
ricevuti dai diversi clients in una
stringa Se, una volta accettata una connessione da un client, gli invia
S. Il client visualizza la
stringa ricevuta dal server. Programmare il Client ed il Server
utilizzando la classe MyStreamSocket.java
(vedere capitolo 5 di Liu) producendo le seguenti versioni per il
Server:
a) Server iterativo,
connection-oriented
b) Server concorrente,
connection-oriented