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