Programmazione con le socket in C [copia da consegnare]

annuncio pubblicitario
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
Scarica