Reti di Calcolatori L-A Appello del 10/12/2003 Turno 2

Reti di Calcolatori L-A
Appello del 10/12/2003
Turno 2 - Compito A
Tempo a disposizione: 2h
Parte Java
Sviluppare un’applicazione C/S che, utilizzando RMI, permetta di fornire due funzionalità per
verificare le prenotazioni della sala in una certa fascia oraria. In particolare, le funzioni
servono per sapere quante postazioni risultino prenotate e quali clienti abbiano effettuato
le prenotazioni.
Il progetto RMI si basa su:
Cognome:
………………………………
Nome:
………………………………
Matricola:
………………………………
•
un’interfaccia (ServerInterface, contenuta nel file ServerInterface.java) in cui vengono
definiti i metodi invocabili in remoto dal client, ad esempio come nel seguente:
import java.rmi.Remote;
import java.rmi.RemoteException;
E’ obbligatorio mettere Cognome Nome Matricola e compito all’inizio di ogni file sorgente, pena
la non valutazione del compito, che può essere stampato in modo automatico, solo in caso siano
presenti gli elementi detti sopra
Si devono consegnare tutti i file sorgente e tutti gli eseguibili prodotti (per favore, solo quelli relativi ai
file sorgente consegnati!!!).
La prova intende valutare le capacità progettuali e di programmazione sia in ambiente Java sia in
ambiente C. È consigliabile sviluppare, almeno in parte, entrambe le soluzioni richieste.
In entrambi gli esercizi, sia Java che C, si effettuino gli opportuni controlli sui parametri della
richiesta e si gestiscano le eccezioni, tenendo presente i criteri secondo cui si possa ripristinare il
funzionamento del programma oppure si debba forzarne la terminazione.
Dovendo realizzare la soluzione, tutta o in parte, sia in Java che in C, vale la pena pensare ad un
progetto che sia il più possibile portabile tra i due linguaggi.
Leggete con attenzione le specifiche del problema prima di impegnarvi “a testa bassa” nello
sviluppo delle singole parti. Naturalmente, i componenti da consegnare devono essere stati
provati.
*************************************************************************************************************
Si vuole realizzare un sistema che consenta di gestire l’accesso quotidiano dei clienti di una palestra
alla sala dove si svolgono le lezioni di spinning, che ha un numero limitato di postazioni. Si
supponga che la sala sia accessibile dalle ore 10 alle ore 22, e disponga di 20 bike.
Dal lato server si deve gestire la struttura dati in cui vengono memorizzate le prenotazioni dei clienti per
una certa giornata.
Dal lato client si devono fornire una serie di funzionalità per prenotare, e verificare le prenotazioni della
sala.
public interface ServerInterface extends Remote {
int[] quanti_clienti(int inizio, int fine) throws RemoteException;
String[][] quali_clienti(int inizio, int fine) throws RemoteException;
}
Il server, in seguito alle invocazioni dei due metodi remoti, restituisce, rispettivamente, un
vettore con i contatori delle postazioni e una tabella con i nomi dei clienti che hanno prenotato,
relativi alle ore comprese fra l’ora di inizio e l’ora di fine passati come parametri di invocazione.
Si progettino inoltre le classi:
•
Server (contenuta nel file Server.java), che implementa i metodi del server invocabili in
remoto;
•
Client (contenuta nel file Client.java), che realizza l’interazione con l’utente proponendo
ciclicamente i servizi che utilizzano i metodi remoti fino alla fine del file di input da tastiera.
Parte C
Utilizzando la primitiva select sviluppare un’applicazione C/S che consenta di:
•
•
Più in dettaglio, si sviluppino:
•
un client datagram (client_datagram), che chiede ciclicamente da console al cliente il
nome e l’ora da prenotare, fino alla fine del file di input da tastiera. Per ogni richiesta, il client
invia la richiesta al server e stampa a video l’esito dell’operazione in base alla risposta
ottenuta dal server, cioè –1 in caso di impossibilità di prenotare (ora piena o nome già
presente), oppure 0 in caso di prenotazione effettuata;
•
un client stream (client_stream), che chiede ciclicamente da console nome del cliente di
cui si vuole conoscere quali ore sono state prenotate. Per ogni richiesta, il client usa la
propria connessione per inviare il nome al server e stampa a video la sequenza di ore
prenotate dal cliente, preceduta dal numero di ore totali prenotate (necessarie al client per
sapere quanti interi aspettarsi di ricevere…);
•
il server (server_select), che discrimina le richieste utilizzando la primitiva select. Le
richieste di prenotazione devono essere gestite, tramite socket datagram, in maniera
sequenziale. Le richieste di recupero dello stato di un certo cliente devono essere gestite,
tramite socket stream, in maniera parallela.
Suggerimento
Per gestire le prenotazioni, si consiglia di utilizzare, ad esempio:
un vettore di 12 interi, che rappresentano i contatori con cui tenere traccia delle postazioni libere (o di
quelle occupate) della sala (il primo elemento é il contatore relativo ai posti per l’ora dalle 10 alle 11,
l’ultimo per l’ora dalle 21 alle 22);
una tabella di 20 righe e 12 colonne di stringhe di dimensione fissata, in cui memorizzare i nomi dei
clienti che prenotano le postazioni (le righe corrispondono alle postazioni, le colonne alle ore).
Più eventuali aggiunte di dati, tipo contatori, che possano semplificare le operazioni.
Facoltativo
Si consideri il vincolo che ogni cliente può prenotare al massimo 2 ore in una stessa giornata.
1
prenotare una postazione per una certa ora;
conoscere quali ore sono state prenotate da un cliente.
2
Reti di Calcolatori L-A
Appello del 10/12/2003
Turno 2 - Compito B
Tempo a disposizione: 2h
Cognome:
………………………………
Nome:
………………………………
Matricola:
………………………………
E’ obbligatorio mettere Cognome Nome Matricola e compito all’inizio di ogni file sorgente, pena
la non valutazione del compito, che può essere stampato in modo automatico, solo in caso siano
presenti gli elementi detti sopra
Si devono consegnare tutti i file sorgente e tutti gli eseguibili prodotti (per favore, solo quelli relativi ai
file sorgente consegnati!!!).
La prova intende valutare le capacità progettuali e di programmazione sia in ambiente Java sia in
ambiente C. È consigliabile sviluppare, almeno in parte, entrambe le soluzioni richieste.
In entrambi gli esercizi, sia Java che C, si effettuino gli opportuni controlli sui parametri della
richiesta e si gestiscano le eccezioni, tenendo presente i criteri secondo cui si possa ripristinare il
funzionamento del programma oppure si debba forzarne la terminazione.
Dovendo realizzare la soluzione, tutta o in parte, sia in Java che in C, vale la pena pensare ad un
progetto che sia il più possibile portabile tra i due linguaggi.
Leggete con attenzione le specifiche del problema prima di impegnarvi “a testa bassa” nello
sviluppo delle singole parti. Naturalmente, i componenti da consegnare devono essere stati
provati.
*************************************************************************************************************
Si vuole realizzare un sistema che consenta di gestire l’accesso quotidiano dei clienti di una palestra
alla sala dove si svolgono le lezioni di spinning, che ha un numero limitato di postazioni. Si
supponga che la sala sia accessibile dalle ore 10 alle ore 22, e disponga di 20 bike.
Dal lato server si deve gestire la struttura dati in cui vengono memorizzate le prenotazioni dei clienti per
una certa giornata.
Dal lato client si devono fornire una serie di funzionalità per prenotare, e verificare le prenotazioni della
sala.
Suggerimento
Parte Java
Utilizzando socket stream sviluppare un’applicazione C/S che consenta di conoscere quanti
e quali clienti si sono prenotati per una certa ora. Più in dettaglio:
•
il client chiede ciclicamente l’ora che interessa, fino all’inserimento del fine file da tastiera.
Per ogni richiesta il client, invia al server i dati, e attende dal server l’invio del numero di
clienti e dei loro nomi;
•
il server riceve i dati, e invia al client il numero di prenotazioni relative all’ora richiesta e,
successivamente, i nomi dei clienti che hanno prenotato.
Parte C
Sviluppare un’applicazione C/S che, utilizzando delle RPC, consenta di:
•
•
prenotare la prima ora disponibile entro una certa ora;
conoscere quante ore un cliente ha già prenotato.
Le procedure remote che realizzano queste operazioni sono:
int prenota_prima(Dato), che permette di inviare una richiesta di prenotazione al server. Il
parametro di invocazione è una struttura dati contenente il nome del cliente e l’ora massima
entro cui vuole prenotarsi.
Il server, all’invocazione di questa rpc, verifica se prima dell’ora richiesta c’è una postazione
disponibile e se il cliente non si sia già prenotato. In caso sia possibile prenota (ovvero
incrementa il contatore dei posti occupati e memorizza il nome del cliente, relativamente all’ora
trovata) e restituisce l’ora prenotata; in caso non sia possibile non esegue nessuna
prenotazione e restituisce un valore negativo, per esempio -1.
int ore_prenotate(string nome), che consente di conoscere quante ore ha prenotato il cliente
identificato dal nome passato come parametro. Il server, in seguito all’invocazione di questa
rpc, verifica quante ore nell’arco della giornata abbia prenotato il cliente in questione e
restituisce il numero ottenuto da questo conteggio.
In entrambi i casi, il client chiede ciclicamente all’utente i dati di ogni richiesta, fino alla fine del
file di input da tastiera. Per ogni richiesta, selezionata dall’utente nel modo più semplice,
esegue una chiamata all’opportuna procedura remota, passando l’opportuno parametro, e
stampa il risultato dell’operazione ricavato dal valore di ritorno della procedura.
Per gestire le prenotazioni, si consiglia di utilizzare, ad esempio:
un vettore di 12 interi, che rappresentano i contatori con cui tenere traccia delle postazioni libere (o di
quelle occupate) della sala (il primo elemento é il contatore relativo ai posti per l’ora dalle 10 alle 11,
l’ultimo per l’ora dalle 21 alle 22);
una tabella di 20 righe e 12 colonne di stringhe di dimensione fissata, in cui memorizzare i nomi dei
clienti che prenotano le postazioni (le righe corrispondono alle postazioni, le colonne alle ore).
Più eventuali aggiunte di dati, tipo contatori, che possano semplificare le operazioni.
Facoltativo
Si consideri il vincolo che ogni cliente può prenotare al massimo 2 ore in una stessa giornata.
3
4
Reti di Calcolatori L-A
Appello del 10/12/2003
Turno 2 - Compito C
Tempo a disposizione: 2h
Cognome:
………………………………
Nome:
………………………………
Matricola:
………………………………
Parte Java
Sviluppare un’applicazione C/S che, utilizzando RMI, permetta di fornire due funzionalità, una
per richiedere la prenotazione di una postazione per una certa ora, e una per conoscere
quali ore un cliente abbia già prenotato.
Il progetto RMI si basa su:
•
un’interfaccia (ServerInterface, contenuta nel file ServerInterface.java) in cui vengono
definiti i metodi invocabili in remoto dal client:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerInterface extends Remote {
int prenota(int ora, String nome) throws RemoteException;
int[] quali_ore(String nome) throws RemoteException;
}
E’ obbligatorio mettere Cognome Nome Matricola e compito all’inizio di ogni file sorgente, pena
la non valutazione del compito, che può essere stampato in modo automatico, solo in caso siano
presenti gli elementi detti sopra
Si devono consegnare tutti i file sorgente e tutti gli eseguibili prodotti (per favore, solo quelli relativi ai
file sorgente consegnati!!!).
La prova intende valutare le capacità progettuali e di programmazione sia in ambiente Java sia in
ambiente C. È consigliabile sviluppare, almeno in parte, entrambe le soluzioni richieste.
In entrambi gli esercizi, sia Java che C, si effettuino gli opportuni controlli sui parametri della
richiesta e si gestiscano le eccezioni, tenendo presente i criteri secondo cui si possa ripristinare il
funzionamento del programma oppure si debba forzarne la terminazione.
Dovendo realizzare la soluzione, tutta o in parte, sia in Java che in C, vale la pena pensare ad un
progetto che sia il più possibile portabile tra i due linguaggi.
Leggete con attenzione le specifiche del problema prima di impegnarvi “a testa bassa” nello
sviluppo delle singole parti. Naturalmente, i componenti da consegnare devono essere stati
provati.
*************************************************************************************************************
Si vuole realizzare un sistema che consenta di gestire l’accesso quotidiano dei clienti di una palestra
alla sala dove si svolgono le lezioni di spinning, che ha un numero limitato di postazioni. Si
supponga che la sala sia accessibile dalle ore 10 alle ore 22, e disponga di 20 bike.
Dal lato server si deve gestire la struttura dati in cui vengono memorizzate le prenotazioni dei clienti per
una certa giornata.
Dal lato client si devono fornire una serie di funzionalità per prenotare, e verificare le prenotazioni della
sala.
Il server, in seguito all’invocazione di prenota, verifica se per l’ora richiesta ci sia una postazione
disponibile e se il cliente non si sia già prenotato. In caso sia possibile la prenota e restituisce
un valore che indichi successo, per esempio 0, in caso non sia possibile non esegue nessuna
prenotazione e restituisce un valore negativo, per esempio -1.
In seguito all’invocazione di quali_ore verifica in quali ore compare il nome passato come
parametro, e salva tali ore in un vettore da restituire come valore di ritorno.
Si progettino inoltre le classi:
•
Server (contenuta nel file Server.java), che implementa i metodi del server invocabili in
remoto;
•
Client (contenuta nel file Client.java), che realizza l’interazione con l’utente proponendo
ciclicamente i servizio che utilizzano i metodi remoti fino alla fine del file di input da tastiera.
Parte C
Sviluppare un’applicazione C/S che, utilizzando la select, permetta di fornire due funzionalità
per verificare le prenotazioni della sala in una certa fascia oraria, in particolare quante
postazioni risultino prenotate e quali clienti abbiano effettuato le prenotazioni.
Più in dettaglio, si sviluppino:
•
un client datagram (client_datagram), che chiede ciclicamente da console l’ora di inizio e
l’ora di fine dell’intervallo di interesse, fino alla fine del file di input da tastiera. Per ogni
richiesta, il client invia i due interi al server e stampa a video la risposta ottenuta, ovvero i
contatori delle prenotazioni relativi alle ore dell’intervallo di interesse;
•
un client stream (client_stream), che chiede ciclicamente da console l’ora di inizio e l’ora di
fine dell’intervallo di interesse, fino alla fine del file di input da tastiera. Per ogni richiesta, il
client usa la propria connessione per inviare i due interi al server e stampa a video la
risposta ottenuta, ovvero i nomi dei clienti che hanno prenotato nell’intervallo di interesse,
suddivisi per ore;
•
il server (server_select), che discrimina le richieste utilizzando la primitiva select. Le
richieste di quante postazioni sono state prenotate nelle ore dell’intervallo, devono essere
gestite, tramite socket datagram, in maniera sequenziale. Le richieste di quali clienti si sono
prenotati per ore dell’intervallo, devono essere gestite, tramite socket stream, in maniera
parallela.
Suggerimento
Per gestire le prenotazioni, si consiglia di utilizzare, ad esempio:
un vettore di 12 interi, che rappresentano i contatori con cui tenere traccia delle postazioni libere (o di
quelle occupate) della sala (il primo elemento é il contatore relativo ai posti per l’ora dalle 10 alle 11,
l’ultimo per l’ora dalle 21 alle 22);
una tabella di 20 righe e 12 colonne di stringhe di dimensione fissata, in cui memorizzare i nomi dei
clienti che prenotano le postazioni (le righe corrispondono alle postazioni, le colonne alle ore).
Più eventuali aggiunte di dati, tipo contatori, che possano semplificare le operazioni.
Facoltativo
Si consideri il vincolo che ogni cliente può prenotare al massimo 2 ore in una stessa giornata.
5
6
Reti di Calcolatori L-A
Appello del 10/12/2003
Turno 2 - Compito D
Tempo a disposizione: 2h
Cognome:
………………………………
Nome:
………………………………
Matricola:
………………………………
E’ obbligatorio mettere Cognome Nome Matricola e compito all’inizio di ogni file sorgente, pena
la non valutazione del compito, che può essere stampato in modo automatico, solo in caso siano
presenti gli elementi detti sopra
Si devono consegnare tutti i file sorgente e tutti gli eseguibili prodotti (per favore, solo quelli relativi ai
file sorgente consegnati!!!).
La prova intende valutare le capacità progettuali e di programmazione sia in ambiente Java sia in
ambiente C. È consigliabile sviluppare, almeno in parte, entrambe le soluzioni richieste.
In entrambi gli esercizi, sia Java che C, si effettuino gli opportuni controlli sui parametri della
richiesta e si gestiscano le eccezioni, tenendo presente i criteri secondo cui si possa ripristinare il
funzionamento del programma oppure si debba forzarne la terminazione.
Dovendo realizzare la soluzione, tutta o in parte, sia in Java che in C, vale la pena pensare ad un
progetto che sia il più possibile portabile tra i due linguaggi.
Leggete con attenzione le specifiche del problema prima di impegnarvi “a testa bassa” nello
sviluppo delle singole parti. Naturalmente, i componenti da consegnare devono essere stati
provati.
*************************************************************************************************************
Si vuole realizzare un sistema che consenta di gestire l’accesso quotidiano dei clienti di una palestra
alla sala dove si svolgono le lezioni di spinning, che ha un numero limitato di postazioni. Si
supponga che la sala sia accessibile dalle ore 10 alle ore 22, e disponga di 20 bike.
Dal lato server si deve gestire la struttura dati in cui vengono memorizzate le prenotazioni dei clienti per
una certa giornata.
Dal lato client si devono fornire una serie di funzionalità per prenotare, e verificare le prenotazioni della
sala.
Suggerimento
Per gestire le prenotazioni, si consiglia di utilizzare, ad esempio:
Parte Java
Utilizzando socket datagram sviluppare un’applicazione C/S che consenta di conoscere
quanti e quali clienti si siano prenotati per una certa ora. Più in dettaglio:
•
il client chiede ciclicamente l’ora che interessa, fino all’inserimento del fine file da tastiera. Il
client, invia al server i dati di ogni richiesta, e attende dal server l’invio della risposta con il
numero di clienti e dei loro nomi;
•
il server riceve i dati, e invia al client il numero di prenotazioni relative all’ora richiesta e,
successivamente, i nomi dei clienti prenotati.
N.B.: si consiglia di raggruppare sia i dati delle richieste sia quelli delle risposte in oggetti unici,
in modo da poterli inviare in un unico pacchetto di richiesta o di risposta.
Parte C
Sviluppare un’applicazione C/S che, utilizzando delle RPC, consenta di:
•
•
prenotare la prima postazione libera dopo una certa ora;
conoscere quante ore un cliente può ancora prenotare.
Le procedure remote che realizzano queste operazioni sono:
int prenota_dopo(Dato), che permette di inviare una richiesta di prenotazione al server. Il
parametro di invocazione è una struttura dati contenente il nome del cliente e l’ora minima dopo
la quale vuole prenotarsi. Il server, in seguito a questa invocazione, verifica se dopo l’ora
richiesta c’è una postazione disponibile e se il cliente non si sia già prenotato, in caso sia
possibile prenota (ovvero incrementa il contatore dei posti occupati e memorizza il nome del
cliente, relativamente all’ora trovata) e restituisce l’ora prenotata, in caso non sia possibile non
esegue nessuna prenotazione e restituisce un -1.
int ore_prenotabili(int matricola), che consente di conoscere quante ore può ancora
prenotare il cliente identificato dal nome passato come parametro. Il server, in seguito
all’invocazione di questa rpc, verifica in quante ore nell’arco della giornata non risultano
prenotazioni del cliente in questione e ci sono ancora posti disponibili, e restituisce il numero
ottenuto da questo conteggio.
In entrambi i casi, il client chiede ciclicamente all’utente i dati della richiesta, fino alla fine del file
di input da tastiera. Per ogni richiesta, selezionata dall’utente nel modo più semplice, esegue
una chiamata all’opportuna procedura remota, passando l’opportuno parametro, e stampa il
risultato dell’operazione ricavato dal valore di ritorno della procedura.
un vettore di 12 interi, che rappresentano i contatori con cui tenere traccia delle postazioni libere (o di
quelle occupate) della sala (il primo elemento é il contatore relativo ai posti per l’ora dalle 10 alle 11,
l’ultimo per l’ora dalle 21 alle 22);
una tabella di 20 righe e 12 colonne di stringhe di dimensione fissata, in cui memorizzare i nomi dei
clienti che prenotano le postazioni (le righe corrispondono alle postazioni, le colonne alle ore).
Più eventuali aggiunte di dati, tipo contatori, che possano semplificare le operazioni.
Facoltativo
Si consideri il vincolo che ogni cliente può prenotare al massimo 2 ore in una stessa giornata.
7
8