Università degli Studi di Milano Università degli Studi di Milano Dipartimento di Informatica e Comunicazione Corso di Laurea in Comunicazione Digitale Laboratorio di Sistemi e Reti Ottavo appello a.a. 2003-04 6 dicembre 2004 Cognome ___________________________ Nome ________________________________ Matricola ___________________________ Frequentato: SI NO FIRMARE se si CONSEGNA ______________________________________________ FIRMARE se si RINUNCIA ______________________________________________ Anno di prima immatricolazione: a.a. 2003-04 a.a. 2002-03 a.a. 2001-02 a.a. 2000-01 a.a. precedenti Riassunto delle regole: La soluzione deve essere redatta su fogli opportunamente predisposti, consegnati al momento a ciascuno studente, e ritirati allo scadere del tempo previsto per questa prova scritta. Durante lo svolgimento di questa prova scritta NON potranno essere consultati libri di testo, appunti e manuali. Questa prova scritta si intende sostenuta solo qualora il relativo elaborato venga sottoposto a giudizio di valutazione ["L'esame vale solo se si consegna"]. L'ammissione a questa prova scritta annulla la validità dell'eventuale giudizio positivo conseguito in prove scritte precedentemente sostenute ["Se si ridà l'esame si perde il voto"]. L’ammissione alla prova orale si ottiene superando questa prova scritta con un punteggio di almeno 18/30. Il punteggio massimo conseguibile in questa prova scritta è di 30/30. Cognome ___________________ Nome ___________________ Matricola _______________ Programmazione con le socket in Java [copia da consegnare] Asta elettronica (protocollo richiesto TCP) Si vuole implementare un sistema telematico di mercato elettronico. Il suddetto sistema può essere immaginato come una sorta di asta e può essere modellato in due processi. 1. Nuovo offerente che offre un nuovo oggetto. In questa prima fase avremo un nuovo offerente (rappresentato da una applicazione client) che si presenta al rivenditore dell’asta (rappresentato da una applicazione server) e offre un suo oggetto inviando le specifiche dell’oggetto quali la descrizione, la base d’asta (ossia il prezzo di partenza dell’asta) e il prezzo di vendita incondizionata (prezzo al di sopra del quale l’offerente è disposto a vendere immediatamente l’oggetto ad un altro offerente, senza attendere la fine dell’asta). 2. Richiesta oggetti disponibili al venditore e offerta per un oggetto con probabile vendita. Dopo aver trasmesso un nuovo oggetto da mettere all’asta, l’offerente richiede al venditore tutti gli oggetti che si trovano nell’asta. Se il venditore ha tutte le condizioni necessarie per inviare il catalogo degli oggetti al venditore (esiste almeno un oggetto nell’asta!) trasmette il catalogo al richiedente e attende una nuova offerta riguardante un oggetto dell’asta. Ricevuta l’offerta, formata nel seguente modo [descrizione articolo] [nuovo prezzo proposto] l’offerente controlla il nuovo prezzo offerto per l’articolo e: a. Se il prezzo proposto è maggiore del prezzo di vendita incondizionata (precedentemente indicato dall’offerente dell’oggetto) il venditore effettua la vendita, quindi trasmette la conferma della vendita al richiedente ed elimina l’oggetto dall’asta. b. Se il prezzo proposto è minore del prezzo di vendita incondizionata, il venditore aggiorna il valore dell’ultima offerta per l’oggetto richiesta e comunica all’offerente che il prezzo minimo di vendita incondizionata non è stato raggiunto. Si richiede allo studente di implementare l’applicazione appena descritta seguendo una logica di tipo multithreading, immaginando che più offerenti effettuino operazioni con il rivenditore contemporaneamente. Per l’implementazione si richiede allo studente di scrivere le seguenti classi Java: 1. Offerente.java 2. Rivenditore.java 3. RivenditoreThread.java 4. Asta.java (solo nella parte da fare in laboratorio). La classe Asta.java viene messa a disposizione dello studente nella parte da elaborare in aula, per tale scopo vengono indicati i metodi e i tipi restituiti della suddetta classe. ATTENZIONE!!! Non implementare questi metodi in aula ma utilizzarli quando necessario: public Asta() Istanzia un nuovo oggetto di tipo Asta senza nessun oggetto disponibile. public Asta(String nomefile) Istanzia un nuovo oggetto di tipo Asta e legge gli oggetti disponibili dal file passato come parametro. public void aggiungiOggetto(String oggetto) Aggiunge un nuovo oggetto in memoria, ogni campo della stringa è delimitato da tabulazione: [descrizione] [prezzo iniziale] [prezzo minimo di vendita] public boolean esisteOggetto(String descrizione) Ritorna vero se l’oggetto passato come parametro esiste nell’asta, false altrimenti. Il parametro contiene soltanto la descrizione dell’oggetto. public String offerta(String offertaArticolo) Ritorna una stringa rappresentante l’esito della proposta di acquisto. La stringa offertaArticolo è composta nel seguente modo: [descrizione] [prezzo offerto]. public String getCatalogo() Ritorna una stringa rappresentante tutti gli oggetti in memoria. public void scriviSuFile() Aggiorna il contenuto del file con il catalogo che si trova al momento memorizzato in memoria. La classe Offerente.java dovrà seguire i seguenti passi logici: 1. 2. 3. 4. Importazione dei packages necessari per l’utilizzo delle socket e dell’input output Creazione di un oggetto per leggere da tastiera: [BufferedReader br = new BufferedReader(new InputStreamReader(System.in));] Creazione della socket e degli oggetti per scrivere e leggere sulla socket. Scambio dati: a. Lettura dell’offerta da inviare al rivenditore da tastiera; l’offerta deve rispettare il formato: [descrizione] [prezzo iniziale] [prezzo minimo di vendita] Laboratorio di Sistemi e Reti – Prova scritta del 6 dicembre 2004 2 Cognome ___________________ Nome ___________________ Matricola _______________ b. c. d. 5. Invio offerta al rivenditore. Ricezione del catalogo inviato dal rivenditore e visualizzazione su standard output. Lettura da tastiera della proposta di acquisto da inviare al rivenditore; la proposta di acquisto deve rispettare il formato: [descrizione] [prezzo offerto]. e. Ricezione dell’esito della proposta e visualizzazione su standard output. Chiusura della socket. La classe Rivenditore.java dovrà seguire i seguenti passi logici: 1. 2. 3. 4. 5. Importazione dei packages necessari per l’utilizzo delle socket e dell’input output Crea un nuovo oggetto socket appropriato per ricevere richieste di connessione Crea un nuovo oggetto Asta. Entra in un ciclo while a. Stabilita la connessione, istanzia un nuovo oggetto RivenditoreThread (passando i parametri appropriati) e lo manda in esecuzione. Chiude la socket. La classe RivenditoreThread.java dovrà seguire i seguenti passi logici: 1. 2. 3. 4. Importazione dei packages necessari per l’utilizzo delle socket e dell’input output Definire gli attributi di classe Definire il costruttore Definire il metodo run() a. Leggere sul canale di input appropriato l’offerta iniziale del client e aggiungerla utilizzando il metodo aggiungiOggetto(String Descrizione). b. Inviare sul canale di ouput appropriato il catalogo all’offerente c. Leggere sul canale di input appropriato la proposta di acquisto dell’offerente. d. Inviare sul canale di output appropriato all’offerente il risultato del metodo offerta(String offertaArticolo). e. Chiusura del canale di comunicazione. NELLA SOLA VERSIONE DA REALIZZARE IN LABORATORIO, andrà sviluppata la classe Asta.java (Si ricorda che il server è di tipo concorrente e quindi più Thread possono invocare contemporaneamente alcuni metodi della classe, attenzione alla gestione della sincronizzazione.) Le stampe che consentono di tracciare il comportamento del sistema dovranno essere incluse NELLA SOLA VERSIONE DA SVILUPPARE IN LABORATORIO, ma DOVRANNO ESSERE OMESSE nella versione da sviluppare in aula. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. Laboratorio di Sistemi e Reti – Prova scritta del 6 dicembre 2004 3 Cognome ___________________ Nome ___________________ Matricola _______________ Programmazione con le socket in Java [copia da trattenere] Asta elettronica (protocollo richiesto TCP) Si vuole implementare un sistema telematico di mercato elettronico. Il suddetto sistema può essere immaginato come una sorta di asta e può essere modellato in due processi. 3. Nuovo offerente che offre un nuovo oggetto. In questa prima fase avremo un nuovo offerente (rappresentato da una applicazione client) che si presenta al rivenditore dell’asta (rappresentato da una applicazione server) e offre un suo oggetto inviando le specifiche dell’oggetto quali la descrizione, la base d’asta (ossia il prezzo di partenza dell’asta) e il prezzo di vendita incondizionata (prezzo al di sopra del quale l’offerente è disposto a vendere immediatamente l’oggetto ad un altro offerente, senza attendere la fine dell’asta). 4. Richiesta oggetti disponibili al venditore e offerta per un oggetto con probabile vendita. Dopo aver trasmesso un nuovo oggetto da mettere all’asta, l’offerente richiede al venditore tutti gli oggetti che si trovano nell’asta. Se il venditore ha tutte le condizioni necessarie per inviare il catalogo degli oggetti al venditore (esiste almeno un oggetto nell’asta!) trasmette il catalogo al richiedente e attende una nuova offerta riguardante un oggetto dell’asta. Ricevuta l’offerta, formata nel seguente modo [descrizione articolo] [nuovo prezzo proposto] l’offerente controlla il nuovo prezzo offerto per l’articolo e: a. Se il prezzo proposto è maggiore del prezzo di vendita incondizionata (precedentemente indicato dall’offerente dell’oggetto) il venditore effettua la vendita, quindi trasmette la conferma della vendita al richiedente ed elimina l’oggetto dall’asta. b. Se il prezzo proposto è minore del prezzo di vendita incondizionata, il venditore aggiorna il valore dell’ultima offerta per l’oggetto richiesta e comunica all’offerente che il prezzo minimo di vendita incondizionata non è stato raggiunto. Si richiede allo studente di implementare l’applicazione appena descritta seguendo una logica di tipo multithreading, immaginando che più offerenti effettuino operazioni con il rivenditore contemporaneamente. Per l’implementazione si richiede allo studente di scrivere le seguenti classi Java: 5. Offerente.java 6. Rivenditore.java 7. RivenditoreThread.java 8. Asta.java (solo nella parte da fare in laboratorio). La classe Asta.java viene messa a disposizione dello studente nella parte da elaborare in aula, per tale scopo vengono indicati i metodi e i tipi restituiti della suddetta classe. ATTENZIONE!!! Non implementare questi metodi in aula ma utilizzarli quando necessario: public Asta() Istanzia un nuovo oggetto di tipo Asta senza nessun oggetto disponibile. public Asta(String nomefile) Istanzia un nuovo oggetto di tipo Asta e legge gli oggetti disponibili dal file passato come parametro. public void aggiungiOggetto(String oggetto) Aggiunge un nuovo oggetto in memoria, ogni campo della stringa è delimitato da tabulazione: [descrizione] [prezzo iniziale] [prezzo minimo di vendita] public boolean esisteOggetto(String descrizione) Ritorna vero se l’oggetto passato come parametro esiste nell’asta, false altrimenti. Il parametro contiene soltanto la descrizione dell’oggetto. public String offerta(String offertaArticolo) Ritorna una stringa rappresentante l’esito della proposta di acquisto. La stringa offertaArticolo è composta nel seguente modo: [descrizione] [prezzo offerto]. public String getCatalogo() Ritorna una stringa rappresentante tutti gli oggetti in memoria. public void scriviSuFile() Aggiorna il contenuto del file con il catalogo che si trova al momento memorizzato in memoria. La classe Offerente.java dovrà seguire i seguenti passi logici: 6. 7. 8. 9. Importazione dei packages necessari per l’utilizzo delle socket e dell’input output Creazione di un oggetto per leggere da tastiera: [BufferedReader br = new BufferedReader(new InputStreamReader(System.in));] Creazione della socket e degli oggetti per scrivere e leggere sulla socket. Scambio dati: a. Lettura dell’offerta da inviare al rivenditore da tastiera; l’offerta deve rispettare il formato: [descrizione] [prezzo iniziale] [prezzo minimo di vendita] Laboratorio di Sistemi e Reti – Prova scritta del 6 dicembre 2004 4 Cognome ___________________ Nome ___________________ Matricola _______________ b. c. d. Invio offerta al rivenditore. Ricezione del catalogo inviato dal rivenditore e visualizzazione su standard output. Lettura da tastiera della proposta di acquisto da inviare al rivenditore; la proposta di acquisto deve rispettare il formato: [descrizione] [prezzo offerto]. e. Ricezione dell’esito della proposta e visualizzazione su standard output. 10. Chiusura della socket. La classe Rivenditore.java dovrà seguire i seguenti passi logici: 6. 7. 8. 9. Importazione dei packages necessari per l’utilizzo delle socket e dell’input output Crea un nuovo oggetto socket appropriato per ricevere richieste di connessione Crea un nuovo oggetto Asta. Entra in un ciclo while a. Stabilita la connessione, istanzia un nuovo oggetto RivenditoreThread (passando i parametri appropriati) e lo manda in esecuzione. 10. Chiude la socket. La classe RivenditoreThread.java dovrà seguire i seguenti passi logici: 5. 6. 7. 8. Importazione dei packages necessari per l’utilizzo delle socket e dell’input output Definire gli attributi di classe Definire il costruttore Definire il metodo run() a. Leggere sul canale di input appropriato l’offerta iniziale del client e aggiungerla utilizzando il metodo aggiungiOggetto(String Descrizione). b. Inviare sul canale di ouput appropriato il catalogo all’offerente c. Leggere sul canale di input appropriato la proposta di acquisto dell’offerente. d. Inviare sul canale di output appropriato all’offerente il risultato del metodo offerta(String offertaArticolo). e. Chiusura del canale di comunicazione. NELLA SOLA VERSIONE DA REALIZZARE IN LABORATORIO, andrà sviluppata la classe Asta.java (Si ricorda che il server è di tipo concorrente e quindi più Thread possono invocare contemporaneamente alcuni metodi della classe, attenzione alla gestione della sincronizzazione.) Le stampe che consentono di tracciare il comportamento del sistema dovranno essere incluse NELLA SOLA VERSIONE DA SVILUPPARE IN LABORATORIO, ma DOVRANNO ESSERE OMESSE nella versione da sviluppare in aula. Laboratorio di Sistemi e Reti – Prova scritta del 6 dicembre 2004 5 Cognome ___________________ Nome ___________________ Matricola _______________ Programmazione con le socket in C [copia da consegnare] Si riformuli l’esercizio precedente in modo che risulti programmabile in C, continuando a utilizzare il protocollo TCP (e non UDP), e realizzando un server sequenziale invece che concorrente. Le stampe che consentono di tracciare il comportamento del sistema dovranno essere incluse NELLA SOLA VERSIONE DA SVILUPPARE IN LABORATORIO, ma DOVRANNO ESSERE OMESSE nella versione da sviluppare in aula. NELLA SOLA VERSIONE DA SVILUPPARE IN LABORATORIO, oltre all’implementazione di quanto realizzato in aula, dovranno essere realizzate anche tutte le funzioni di libreria utilizzate nella soluzione di cui sopra. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. IMPORTANTE – La soluzione va riportata integralmente sul retro. Quanto eventualmente riportato su questo lato del foglio non verrà considerato ai fini della correzione. Laboratorio di Sistemi e Reti – Prova scritta del 6 dicembre 2004 6 Cognome ___________________ Nome ___________________ Matricola _______________ Programmazione con le socket in C [copia da trattenere] Si riformuli l’esercizio precedente in modo che risulti programmabile in C, continuando a utilizzare il protocollo TCP (e non UDP), e realizzando un server sequenziale invece che concorrente. Le stampe che consentono di tracciare il comportamento del sistema dovranno essere incluse NELLA SOLA VERSIONE DA SVILUPPARE IN LABORATORIO, ma DOVRANNO ESSERE OMESSE nella versione da sviluppare in aula. NELLA SOLA VERSIONE DA SVILUPPARE IN LABORATORIO, oltre all’implementazione di quanto realizzato in aula, dovranno essere realizzate anche tutte le funzioni di libreria utilizzate nella soluzione di cui sopra. Laboratorio di Sistemi e Reti – Prova scritta del 6 dicembre 2004 7