Lezione n.3 LPR - Informatica Applicata



Похожие документы
Lezione n.7 LPR Informatica Applicata Il Protocollo TCP Stream Socket. 20/04/2009 Laura Ricci

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Architettura Client-Server

Socket & RMI Ingegneria del Software - San Pietro

Corso di Reti di Calcolatori L-A

Programmare con le Socket TCP in java. 2: Application Layer 1

Parte II: Reti di calcolatori Lezione 10

Connessioni di rete. Progetto di reti di Calcolatori e Sistemi Informatici - Stefano Millozzi. PdR_ Stefano Millozzi

Tecnologie Web L-A. Java e HTTP. Dario Bottazzi Tel , dario.bottazzi@unibo.it, SkypeID: dariobottazzi. Java e TCP/IP in a Nutshell

appunti delle lezioni Architetture client/server: applicazioni client

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Programmare con le Socket

Introduzione alle applicazioni di rete

Programmazione dei socket con TCP #2

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Corso sul linguaggio Java

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Applicazioni distribuite

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Altri tipi di connessione

Corso di Reti di Calcolatori

Programmare con le Socket TCP

Corso di Reti di Calcolatori. Datagrammi

Cenni di programmazione distribuita in C++ Mauro Piccolo

Il linguaggio Java I file sequenziali

Reti di Calcolatori:

CORSO DI RETI SSIS. Lezione n.2. 2 Novembre 2005 Laura Ricci

Telematica II 12. Esercitazione/Laboratorio 4

I Socket. Laboratorio Software M. Grotto R. Farina

HTTP adaptation layer per generico protocollo di scambio dati

Programmazione distribuita in Java. Socket & Client-Server

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

Esercitazione. Formato di compitini e compiti: domande ed esercizi "closed book" G. Ferrari - Reti di calcolatori.

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Controllo Winsock di Visual Basic

20 - Input/Output su File

Sistemi Operativi (modulo di Informatica II)

UDP. Livello di Trasporto. Demultiplexing dei Messaggi. Esempio di Demultiplexing

Reti di Telecomunicazione Lezione 8

1. RETI INFORMATICHE CORSO DI LAUREA IN INGEGNERIA INFORMATICA SPECIFICHE DI PROGETTO A.A. 2013/ Lato client

Applicazioni web. Parte 5 Socket

I/O su Socket TCP: read()

Server Sequenziale. Server Concorrente. Esercitazione: Socket Java con connessione

J+... J+3 J+2 J+1 K+1 K+2 K+3 K+...

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

appunti delle lezioni Architetture client/server: applicazioni server

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Reti di Telecomunicazione Lezione 6

Esercizio 2. Client e server comunicano attraverso socket TCP

Protocolli applicativi: FTP

Transmission Control Protocol

Nelle reti di calcolatori, le porte (traduzione impropria del termine. port inglese, che in realtà significa porto) sono lo strumento

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

GESTIONE DEI PROCESSI

Reti di Calcolatori. Il software

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Siti web centrati sui dati (Data-centric web applications)

Dal protocollo IP ai livelli superiori

Programmazione di rete in Java

13. Chain of Responsibility

Esercitazione [6] Client/Server con Socket

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Introduzione al Linguaggio C

Introduzione JDBC interfaccia java.sql driver caricare i driver

Comunicazione tra Computer. Protocolli. Astrazione di Sottosistema di Comunicazione. Modello di un Sottosistema di Comunicazione

Indirizzi Internet e. I livelli di trasporto delle informazioni. Comunicazione e naming in Internet

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

R.Focardi Laboratorio di Ingegneria del Software 6. 1

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Corsi di Reti di Calcolatori (Docente Luca Becchetti)

Architettura MVC-2: i JavaBeans

RMI. Java RMI RMI. G. Prencipe

Main System Monitor Keyboard

Reti di Telecomunicazione Lezione 7

Java Socket LSO 2008

Sockets in Java. Lorenzo Gallucci

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Java: Compilatore e Interprete

Applicazioni web centrati sui dati (Data-centric web applications)

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Транскрипт:

Lezione n.3 LPR - Informatica Applicata Il Protocollo TCP: 7/3/2013 Laura Ricci Laura Ricci 1

IL PARADIGMA CLIENT/SERVER La tipica applicazione Internet provede due processi in esecuzione su due host geograficamente distanti Il Client: inizia la comunicazione con il server richiede servizi ad uno specifico server web: client = browser e-mail client = mail-reader Il Server:, fornisce un servizio al client application transport network data link physical ad esempio il server Web invia la pagina web richiesta, il mail server consegna la posta al client request reply application transport network data link physical Laura Ricci 2 2

INTERAZIONE CLIENT SERVER L'astrazione base per la programmazione di rete è il socket Un socket rappresenta l'interfaccia tra l'applicazione ed il livello TCP/IP Laura Ricci 3

SOCKET: DEFINIZIONI GENERALI Socket = presa di corrente Termine utilizzato in tempi remoti in telefonia. La connessione tra due utenti veniva stabilita tramite un operatore che inseriva fisicamente i due estremi di un cavo in due ricettacoli (sockets), ognuno dei quali era assegnato ai due utenti. Socket è una astrazione che indica una presa a cui un processo si può collegare per spedire dati sulla rete. Al momento della creazione un socket viene collegato ad una porta. Socket Socket Application Program Interface(API) JAVA definisce due interfacce diverse per il protocollo TCP ed il protocollo UDP. Laura Ricci 4

COMUNICAZIONE CONNECTION ORIENTED VS. CONNECTIONLESS Comunicazione Connection Oriented (TCP) (come una chiamata telefonica) creazione di una connessione (canale di comunicazione dedicato) tra mittente e destinatario invio dei dati sulla connessione chiusura della connessione Comunicazione Connectionless (UDP) (come l'invio di una lettera) non si stabilisce un canale di comunicazione dedicato mittente e destinatario comunicano mediante lo scambio di pacchetti Laura Ricci 5

COMUNICAZIONE CONNECTION ORIENTED VS. CONNECTIONLESS Indirizzamento: Connection Oriented: l indirizzo del destinatario (indirizzo IP+ porta) è specificato al momento della apertura connessione Connectionless: l indirizzo del destinatario (indirizzo IP + porta) viene specificato in ogni pacchetto (per ogni send) Ordinamento dei dati scambiati: Connection Oriented: ordinamento dei messaggi garantito Connectionless: nessuna garanzia sull ordinamento dei messaggi Utilizzo: Connection Oriented: grossi streams di dati Connectionless : invio di un numero limitato di dati Laura Ricci 6

COMUNICAZIONE: CONNECTION ORIENTED VS. CONNECTIONLESS Protocollo UDP = connectionless, trasmette pacchetti dati = Datagrams ogni datagram deve contenere l indirizzo del destinatario datagram spediti dallo stesso processo possono seguire percorsi diversi ed arrivare al destinatario in ordine diverso rispetto all ordine di spedizione Protocollo TCP = trasmissione connection-oriented o stream oriented viene stabilita una connessione tra mittente e destinatario su questa connesione si spedisce una sequenza di dati = stream di dati per modellare questo tipo di comunicazione in JAVA si possono sfruttare i diversi tipi di stream definiti dal linguaggio. Laura Ricci 7

TCP SOCKET PROGAMMING Il client contatta il server che deve essere in esecuzione al momento della richiesta di contatto Il server deve aver creato un welcoming socket che consente di ricevere la richiesta di contatto del client crea un TCP socket specificando l'indirizzo IP e la porta associata al processo (servizio) in esecuzione sul Server Quando accetta la richiesta di connessione crea un nuovo connection socket per comunicare con quel client quando il client crea il socket, viene inviata una richiesta di connessione con il server

TCP SOCKET PROGRAMMING 9

SCHEMA DEL COMPORTAMENTO DEL SERVER Create ServerSocket(6789) connsocket = accept() read request from connsocket Serve the request -Welcome socket close connsocket (Server Socket) : la stanza d'aspetto -ConnectionSocket:la stanza del servizio

IL PROTOCOLLO TCP: JAVA STREAM SOCKETS Il protocollo TCP supporta un modello computazionale di tipo client/server, in cui il server riceve dai clients richieste di connessione, le schedula e crea connessioni diverse per ogni richiesta ricevuta ogni connessione supporta comunicazioni bidirezionali, affidabili La comunicazione connection-oriented prevede due fasi: il client richiede una connessione al server quando il server accetta la connessione, client e server iniziano a scambiarsi i dati In JAVA, ogni connessione viene modellata come uno stream continuo di bytes non esiste il concetto di 'pacchetto di dati' stream sockets: al socket sono associati stream di input/output l'invio dei dati corrisponde alla scrittura/lettura da uno stream Laura Ricci 11

IL PROTOCOLLO TCP: JAVA STREAM SOCKETS esistono due tipi di socket TCP: Welcome (passive, listening) sockets: utilizzati dal server per accettare le richieste di connessione Connection(active) sockets: supportano lo streaming di byte tra client e server il server utilizza un listening socket per accettare le richieste di connessione dei clients il client crea un active socket per richiedere la connessione quando il server accetta una richiesta di connessione, crea a sua volta un proprio active socket che rappresenta il punto terminale della sua connessione con il client la comunicazione vera e propria avviene mediante la coppia di active socket presenti nel client e nel server Laura Ricci 12

IL PROTOCOLLO TCP: JAVA STREAM SOCKET Indirizzo IP del Server= SIP Client 1 Active Socket Listening Socket PR = Porta Remota PL=Porta Locale Client 2 Active Socket PL=Porta Locale Richiesta di apertura di connessione. Il client crea un active socket S e lo associa alla sua porta locale PL collega S al listening socket presente sul server pubblicato all'indirizzo (SIP,PR) Laura Ricci 13

IL PROTOCOLLO TCP: JAVA STREAM SOCKET Client 1 Server, indirizzo IP= SIP Active Socket PL=Porta Locale Listening Socket Active Socket PR = Porta Remota Client 2 Active Socket Active Socket PL=Porta Locale Apertura di una connessione il server accetta la richiesta di connessione e crea un proprio active socket che rappresenta il suo punto terminale della connessione tutti i segmenti TCP scambiati tra client e server vengono trasmessi mediante la coppia di active sockets creati Laura Ricci 14

IL PROTOCOLLO TCP: JAVA STREAM SOCKETS Il server pubblica un proprio servizio associandolo al listening socket, creato sulla porta remota PR il client C che intende usufruire del servizio deve conoscere l'indirizzo IP del server, SIP, ed il riferimento alla porta remota, PR, a cui è associato il servizio la richiesta di creazione del socket produce in modo atomico la richiesta di connessione al server il protocollo di richiesta della connessione viene completamente gestito dal supporto quando la richiesta di connessione viene accettata dal server, il supporto in esecuzione sul server crea in modo automatico un nuovo active socket AS. AS è utilizzato per l interazione con il client. Tutti i messaggi spediti dal client vengono diretti automaticamente sul nuovo socket creato. Laura Ricci 15

STREAM SOCKET JAVA API: LATO CLIENT Classe java.net.socket : costruttori public socket(inetaddress host, int port) throws IOException crea un active socket e tenta di stabilire, tramite esso, una connessione con l host individuato da InetAddress, sulla porta port. Se la connessione viene rifiutata, lancia una eccezione di IO public socket (String host, int port) throws UnKnownHostException, IOException Come il precedente, l host è individuato dal suo nome simbolico (interroga automaticamente il DNS) Laura Ricci 16

PORT SCANNER: INDIVIDUAZIONE SERVIZI SU UN SERVER import java.net.*; import java.io.*; public class PortScanner { public static void main(string args[ ]) { String host; try { host = args[0]; } catch (ArrayIndexOutOfBoundsException e) {host="localhost"; }; for (int i = 1; i< 1024; i++) {try { Socket s = new Socket(host, i); System.out.println("Esiste un servizio sulla porta"+i); } catch (UnknownHostException ex) {System.out.println("Host Sconosciuto"); break; } catch (IOException ex) {System.out.println("Non esiste un servizio sulla porta"+i);}}}} Laura Ricci 17

PORT SCANNER: INDIVIDUAZIONE SERVIZI TCP ATTIVI SU UN HOST Nella classe PortScanner il client richiede la connessione tentando di creare un socket su ognuna delle prime 1024 porte di un host nel caso in cui non vi sia alcun servizio attivo, il socket non viene creato e viene invece sollevata un'eccezione osservazione: il programma effettua 1024 interrogazioni al DNS, una per ogni socket che tenta di creare Per ottimizzare il comportamento del programma: utilizzare il costruttore public Socket(InetAddress host, int port) throws IOException il DNS viene interrogato una sola volta, prima di entrare nel ciclo di scanning, dalla InetAddress.getByName viene utilizzato l InetAddress invece del nome dell host per costruire i sockets Laura Ricci 18

STREAM SOCKET API Altri costruttori della Classe java.net.socket public Socket (String H, int P, InetAddress IA, int LP) tenta di creare una connessione verso l host H, sulla porta P. dalla interfaccia locale IA dalla porta locale LP Laura Ricci 19

STREAM BASED COMMUNICATION Per operare su un socket occorre associare al socket uno stream di input o di output public InputStream getinputstream( ) throws IOException public OutputStream getoutputstream( ) throws IOException metodi che, applicati ad un oggetto di tipo Socket, restituiscono uno stream di input o di output associato al socket ogni valore scritto su uno stream di output associato al socket viene copiato nel Send Buffer ogni valore letto dallo stream viene prelevato dal Receive Buffer Il client legge dallo stream un byte/ una sequenza di bytes.e li trasforma in una sequenza di caratteri o di dati strutturati, utilizzando i filtri offerti da JAVA Laura Ricci 20

STREAM BASED COMMUNICATION Dopo che la richiesta di connessione viene accettata, client e server associano streams di bytes di input/output all'active socket poichè gli stream sono unidirezionali uno stream di input ed uno di output per lo stesso socket la comunicazione avviene mediante lettura/scrittura di dati sullo stream utilizzo di filtri associati agli stream Descriptor: Local port, Local IP, Remote Port, Remote IP OutputStream InputStream Send Buffer Receive Buffer Struttura del Socket TCP Laura Ricci 21

STREAM BASED COMMUNICATION public class InputStreamExample { public static void main(string args[]) throws Exception { }} Socket socket = new Socket(); socket.connect(newinetsocketaddress("localhost",80)); InputStream istream = socket.getinputstream(); System.out.println("available bytes"+ socket.close(); istream.available()); connect connette il socket ad un server. Riuso dello stesso oscket per connessioni diverse available restituisce il numero di bytes che possono essere letti dall'inpustream Laura Ricci 22

RICHIAMI: IL CONCETTO DI STREAM IN JAVA Streams: introdotti per modellare l interazione del programma con i dispositivi di I/O (console, files, connessioni di rete, ) JAVA Stream I/O: basato sul concetto di stream: si può immaginare uno stream come una condotta tra una sorgente ed una destinazione (dal programma ad un dispositivo o viceversa), da un estremo entrano dati, dall'altro escono Write.... Read L applicazione può inserire dati ad un capo dello stream I dati fluiscono verso la destinazione e possono essere estratti dall altro capo dello stream Esempio: l'applicazione scrive su un FileOutputStream. Il dispositivo legge i dati e li memorizza sul file Laura Ricci 23

RICHIAMI: IL CONCETTO DI STREAM IN JAVA Caratteristiche principali degli streams: mantengono l ordinamento FIFO read only o write only accesso sequenziale bloccanti: quando un applicazione legge un dato dallo stream (o lo scrive) si blocca finchè l operazione non è completata (ma le ultime versioni di JAVA introducono l I/O non bloccante non è richiesta una corrispondenza stretta tra letture/scritture esempio: una unica scrittura inietta 100 bytes sullo stream, che vengono letti con due write successive 'all'altro capo dello stream', la prima legge 20 bytes, la seconda 80 bytes) Laura Ricci 24

RICHIAMI: IL CONCETTO DI STREAM IN JAVA Streams di bytes: public abstract class OutputStream Metodi di base: public abstract void write (int b) public void write(byte [ ] data) throws IOException; throws IOException; public void write(byte [ ] data, int offeset, int length) throws IOException; write (int b) scrive su un OuputStream il byte corrispondente all intero passato Gli ultimi due metodi consentono la scrittura di gruppi di bytes. Analogamente la classe InputStream definisce metodi per la lettura dallo stream Laura Ricci 25

JAVA: STREAM DI BASE La classe OutputStream ed il metodo write sono dichiarati astratti. le sottoclassi definiscono stream legati a particolari dispositivi di I/O (file, console, ). l implementazione del metodo write può richiedere codice nativo (es: scrittura su un file ). Stream di base: classi utilizzate *Stream utilizzate per la trasmissione di bytes *Reader o *Writer: utilizzate per la trasmissione di caratteri InputStremReader: per la trasformazione di bytes in caratteri BufferedReader: ottimizza gli accessi al dispositivo di I/O OutputStreamWriter: trasforma caratteri in bytes BufferedWriter: ottimizza gli accessi al dispositivo di I/O Laura Ricci 26

STRUTTURA DEL SERVER Struttura di un Server sequenziale: crea un connection socket CS sulla porta associata al servizio pubblicato. si mette in ascolto su CS (si blocca fino al momento in cui arriva una richiesta di connessione) quando accetta una richiesta di connessione da parte di un client C, crea un nuovo Active Socket su cui avviene la comunicazione con C associa all' Active Socket uno o più stream (di input e/o di output) su cui avverrà la comunicazione con il client quando l interazione con il client è terminata, chiude il data socket e torna ad ascoltare su CS ulteriori richieste di connessione Laura Ricci 27

STREAM MODE SOCKET API LATO SERVER Classe java.net.serversocket: costruttori public ServerSocket(int port)throws BindException, IOException public ServerSocket(int port,int length) throws BindException, IOException costruisce un listening socket, associandolo alla porta p. Length indica la lunghezza della coda in cui vengono memorizzate le richieste di connessione. (lunghezza massima della coda stabilita dal sistema operativo). Se la coda è piena, eventuali ulteriori richieste di connessione vengono rifiutate. publicserversocket(intport,intlength,inetaddress bindaddress)... permette di collegare il socket ad uno specifico indirizzo IP locale. utile per macchine dotate di più schede di rete, ad esempio un host con due indirizzi IP, uno visibile da Internet, l altro visibile solo a livello di rete locale Se voglio servire solo le richieste in arrivo dalla rete locale, associo il connection socket all indirizzo IP locale Laura Ricci 28

PORT SCANNER LATO SERVER Esempio: ricerca dei servizi attivi sull host locale import java.net.*; public class LocalPortScanner { public static void main(string args[]) {for (int port= 1; port<= 1024; port++) try {ServerSocket server = new ServerSocket(port);} catch (BindException ex) {System.out.println(port + "occupata");} catch (Exception ex) {System.out.println(ex);} } } Laura Ricci 29

STREAM MODE SOCKET API LATO SERVER Accettare una nuova connessione dal connection socket public Socket accept( ) throws IOException metodo della classe ServerSocket. Comportamento: quando il processo server invoca il metodo accept( ), pone il server in attesa di nuove connessioni. se non ci sono richieste, il server si blocca (possibile utilizzo di time-outs) se c è almeno una richiesta, il processo si sblocca e costruisce un nuovo socket S tramite cui avviene la comunicazione effettiva tra cliente server Laura Ricci 30

IL SERVER MATH si vuole realizzare un semplice server in grado di svolgere semplici operazioni matematiche richieste dai clients. il server deve essere in grado di servire richieste provenienti sa client implementati mediante diversi linguaggi di programmazione Per garantire l'interoperabilità il client ed il server interagiscono scambiando bytes Classi per trasformare bytes in caratteri e viceversa Laura Ricci 31

IL MATH SERVER Richiesta la definizione di un protocollo di interazione tra client e server Il protocollo: specifica la modalità di codifica/decodifica dei dati diverso se sia client che server sono implementati in JAVA/ sono implementati in linguaggi diversi Nel nostro caso semplice protocollo a basso livello operatore : primo valore : secondo valore Laura Ricci 32

IL CLIENT import java.io.*; import java.net.socket; public class MathClient { public static void main(string [] args){ String hostname = "localhost"; int port = 10000; if(args.length!= 2){ System.out.println("Use default setting..");} else { hostname = args[0]; port = Integer.parseInt(args[1]);} try { Socket socket = new Socket(hostname, port); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())); writer.write("+:12:21"); writer.newline(); writer.flush() BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); System.out.println(reader.readLine()); reader.close(); writer.close(); } catch (Exception e) { e.printstacktrace(): }}} Laura Ricci 33

L'INTERFACCIA MATHSERVICE public interface MathService { public double add(double firstvalue, double secondvalue); public double sub(double firstvalue, double secondvalue); public double div(double firstvalue, double secondvalue); public double mul(double firstvalue, double secondvalue); } Laura Ricci 34

LA CLASSE PLAINMATHSERVICE public class PlainMathService implements MathService { public double add(double firstvalue, double secondvalue) { return firstvalue+secondvalue; } public double sub(double firstvalue, double secondvalue) { return firstvalue-secondvalue; } public double mul(double firstvalue, double secondvalue) { return firstvalue * secondvalue;} public double div(double firstvalue, double secondvalue) { if (secondvalue!= 0) return firstvalue / secondvalue; return Double.MAX_VALUE; } } Laura Ricci 35

IL MATH SERVER import java.io.*; import java.net.*; public class MathServer{ protected MathService mathservice; protected Socket socket; public void setmathservice(mathservice mathservice) { this.mathservice = mathservice; } public void setsocket(socket socket) { this.socket = socket; } Laura Ricci 36

IL MATH SERVER public void execute() { try {BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); String line = reader.readline(); double result = parseexecution(line); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())); writer.write(""+result); writer.newline(); writer.flush(); reader.close(); writer.close(); } catch (Exception e) { e.printstacktrace( ); } } Laura Ricci 37

IL MATH SERVER protected double parseexecution(string line) throws IllegalArgumentException { double result = Double.MAX_VALUE; String [] elements = line.split(":"); if (elements.length!= 3) throw new IllegalArgumentException("parsingerror!"); double firstvalue = 0; double secondvalue = 0; try { firstvalue = Double.parseDouble(elements[1]); secondvalue = Double.parseDouble(elements[2]); } catch(exception e){throw new IllegalArgumentException( "Invalid arguments!");} Laura Ricci 38

IL MATHSERVER switch (elements[0].charat(0)) { case '+': result = mathservice.add(firstvalue, secondvalue);break; case '-': result = mathservice.sub(firstvalue, secondvalue);break; case '*': result = mathservice.mul(firstvalue, secondvalue);break; case '/': result = mathservice.div(firstvalue, secondvalue);break; default: throw new IllegalArgumentException("Invalid math operation!"); } return result; } Laura Ricci 39

IL MATH SERVER public static void main(string [] args)throws Exception{ int port = 10000; if (args.length == 1) { try { port = Integer.parseInt(args[0]);} catch(exception e){ } } System.out.println("Math Server is running..."); ServerSocket serversocket = new ServerSocket(port); while(true){ Socket socket = serversocket.accept(); MathServer mathserver = new MathServer(); mathserver.setmathservice(new PlainMathService()); mathserver.setsocket(socket); mathserver.execute();} } Laura Ricci 40

JAVA: STREAMS DI BASE E WRAPPERS Per non lavorare direttamente a livello di bytes o di caratteri JAVA fornisce una serie di wrappers che consentono di 'avvolgere uno stream intorno all'altro' (come un tubo composto da più guaine...) l'oggetto più interno è uno stream di base che 'avvolge' la sorgente dei dati (ad esempio il file, la connessione di rete,...). i wrappers sono utilizzati per il trasferimento di oggetti complessi sullo stream, per la compressione di dati, per la definizione di strategie di buffering (per rendere più veloce la trasmissione) Laura Ricci 41

JAVA: STREAMS DI BASE E WRAPPERS Per estendere le funzionalità degli streams di base: classi wrapper DataOutputStream consente di trasformare dati di un tipo primitivo JAVA in una sequenza di bytes da iniettare su uno stream. DataOutputStream do = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( data.txt ))) applicazione writeint(5) DataOutputStream BufferedOutputStream FileOutputStream bytes buffered bytes file (data.txt) WRAPPER Laura Ricci 42

LA CLASSE DATAOUTPUT/INPUT STREAM Alcuni metodi definiti nella classe DataOutputStream public final void writeboolean(boolean b) throws IOException; public final void writeint (int I) throws IOException; public final void writedouble (double d) throws IOException; Il filtro produce una sequenza di bytes che rappresentano il valore del dato. Rappresentazioni utilizzate: interi 32 bit big-endian, complemento a due float 32 bit IEEE754 floating points Formati utilizzati dalla maggior parte dei protocolli di rete Nessun problema se i dati vengono scambiati tra programmi JAVA. Altri filtri verranno definiti in seguito Laura Ricci 43

ECHO CLIENT TCP import java.net.*; import java.io.*; import java.util.*; public class EchoClient { public static void main (String args[]) throws Exception {Scanner console = new Scanner(System.in); InetAddress ia=inetaddress.getbyname("localhost"); int port=8; Socket echosocket=null; try{ echosocket = new Socket (ia, port);} catch (Exception e){system.out.println(e);return;} InputStream is = echosocket.getinputstream( ); DataInputStream NetworkIn = new DataInputStream(is); OutputStream os =echosocket.getoutputstream(); DataOutputStream NetworkOut = new DataOutputStream(os); Laura Ricci 44

ECHO CLIENT TCP boolean done=false; while (! done) {String linea = console.nextline( ); System.out.println (linea); if (linea.equals("exit")) {NetworkOut.writeUTF(linea); else NetworkOut.flush( ); done = true; echosocket.close ( ); } {NetworkOut.writeUTF (linea); NetworkOut.flush( ); String echo=networkin.readutf( ); System.out.println (echo); } } } } Laura Ricci 45

ECHO SERVER TCP Echo Server si mette in attesa di richieste di connessione dopo aver accettato una connessione, si mette in attesa di una stringa dal client e gliela rispedisce quando riceve la stringa exit chiude la connessione con quel client e torna ad accettare nuove connessioni Laura Ricci 46

ECHO SERVER TCP import java.net.*; import java.io.*; public class EchoServer { public static void main (String args[ ]) throws Exception{ int port=...; while (true) {Socket sdati = ss.accept( ); ServerSocket ss= new ServerSocket(port); InputStream is = sdati.getinputstream( ); DataInputStream networkin = new DataInputStream(is); OutputStream out=sdati.getoutputstream( ); DataOutputStream networkout = new DataOutputStream(out); boolean done=false; while (!done){ String echo= networkin.readutf( ); if (echo.equals("exit")) {System.out.println("finito"); done=true;} else {networkout.writeutf(echo);} } } } } Laura Ricci 47

PROTOCOLLO HTTP Messaggio di richiesta HTTP GET /dir/requestpage.html HTTP/1.1 Host: www.dipinf.edu Connection: close User-agent: mozilla/4.0 Accept-languare:it Messaggio di risposta HTTP/1.0 200 ok Connection: close Date:... Server: Apache/1.3.0 Content Length:6821 Content-Type: text/html <dati><dati><dati><dati><dati> Laura Ricci 48

UN SERVER HTTP (SEMPLIFICATO) import java.io.*; import java.net.*; import java.util.*; public class HttpWelcome { private static int port = 80; // ipotesi: il welcome message contiene il contenuto della pagina richiesta private static String HtmlWelcomeMessage () { return "<html>\n"+" <head>\n"+ " <title>unipi - Corso di LaureainInformatica</title>\n"+ " </head>\n"+ " <body>\n"+ " <h2 align=\"center\">\n"+ " <font color=\"#0000ff\">benvenuti al Corso di"+ " Laboratorio di Programmazione di Rete</font>\n"+ " </ h2>\n"+ " </body>\n"+ "</html>"; }; Laura Ricci 49

UN SERVER HTTP (SEMPLIFICATO) public static void main (String args[ ]) { try { ServerSocket server = new ServerSocket(port); System.out.println("HTTP server running on port: "+port); while (true) { Socket client = server.accept(); DataInputStream in = new DataInputStream(client.getInputStream()); DataOutputStream out = (new DataOutputStream(client.getOutputStream())); String request = in.readutf(); System.out.println("Request: "+request); StringTokenizer st = new StringTokenizer(request," "); Laura Ricci 50

UN SERVER HTTP (SEMPLIFICATO) if (st.nexttoken(" ").equals("get") && st.nexttoken("").equals("message")) { String message = HtmlWelcomeMessage(); out.writeutf("http/1.0 200 OK"+"Content-Length: " + message.length()+ "Content-Type: text/html"+""+message); } else {out.writeutf("400 Bad Request");} out.flush(); client.close(); } } catch (Exception e) {System.err.println(e);}} Laura Ricci 51

import java.io.*; import java.net.*; UN CLIENT HTTP (SEMPLIFICATO) public class httpclient { public static void main (String args [ ])throws Exception {InetAddress ia=inetaddress.getlocalhost(); Socket s =new Socket(ia,80); DataOutputStream out = (new DataOutputStream(s.getOutputStream())); out.writeutf("get"+" "+"message"+" "+"HTTP/1.0"+" "); DataInputStream in = new DataInputStream(s.getInputStream()); String reply = in.readutf(); System.out.println(reply);} } Laura Ricci 52

CHIUSURA DEI SOCKETS Un socket (oggetto della classe Socket) viene chiuso automaticamente a causa di: garbage collection terminazione del programma In certi casi (esempio un web browser) il numero di sockets aperti può essere molto alto il numero massimo di sockets supportati può essere raggiunto prima della garbage collection può essere necessario chiudere esplicitamente alcuni sockets che non vengono più utilizzati chiusura esplicita di un socket s : s.close( ) Laura Ricci 53

SOCKETS: CHIUSURA for (int i = 1; i< 1024; i++) {try{s = new Socket(host, i); System.out.println("Esiste un servizio sulla porta"+i);} catch (UnknownHostException ex) {System.out.println("Host Sconosciuto");} catch (IOException ex) {System.out.println("Non esiste un servizio sulla porta"+i);} finally{ try{if (s!=null){s.close(); s=null; System.out.println("chiuso");} } catch(ioexception ex){ }; } } richiami: il blocco finally viene sempre eseguito all'uscita del blocco try( ). Il blocco finally viene eseguito anche se si verifica una eccezione nel blocco try( ). Laura Ricci 54

SOCKETS: CHIUSURA ShutdownInput, ShutdownOutput consentono di chiudere indipendentemente gli stream di ingresso/ uscita associati al socket Esempio: un client non deve inviare ulteriori dati al socket, ma deve attendere una risposta dal socket stesso il client può chiudere lo stream di output associato al socket e mantenere aperto lo stream di input per ricevere la risposta La lettura di un dato da un socket il cui corrispondente OutputStream è stato chiuso, restituisce il valore -1, che può essere quindi utilizzato come simbolo di fine sequenza Laura Ricci 55

ESERCIZI SU SOCKET TCP Sviluppare i seguenti programmi in cui un certo numero di client stabiliscono connessioni TCP con un server. Calcolatrice TCP: ogni client invia al server una serie di righe di testo, contenenti numeri interi (uno per riga); l ultima riga contiene lo zero. Il server effettua la somma dei valori ricevuti e la ritrasmette al client; una riga contenente il valore 0 indica fine sequenza. MiniFTP: Il client invia al server il nome di un file (di testo), preso dalla riga di comando. Il server risponde spedendo al client il contenuto, riga per riga, di tale file. Gestire situazioni particolari (file not found, etc.) Laura Ricci 56