cosa è una applicazione distribuita? più programmi in esecuzione su computer diversi che...
TRANSCRIPT
Cosa è una applicazione distribuita?
Più programmi in esecuzione su computer diversi che collaborano scambiandosi dati o anche codice
Esempi: World Wide Web, Ftp, Telnet
Prestazioni dipendenti da banda e latenza, piuttosto che da potenza (memoria, velocità processore) del singolo computer
Paradigmi di programmazione
Interazione tra i vari componenti indipendente dalla locazione fisica e trasparente per l’utente.
Approcci:
CLIENT/SERVER
REMOTE EVALUATION
CODE ON DEMAND
AGENTI MOBILI
Client-ServerUn Programma Client richiede servizi messi a disposizione da un programma Server (anche sulla stessa macchina)
Esempi Telnet: Permette di operare su un computer remoto come se fosse localeX-Window: ogni applicazione per accedere al display chiede servizi al server X-window
Vengono scambiati solo dati
Clie nt PCs
Server
Richieste
Risposte
Remote EvaluationUn programma X usa le risorse sulla macchina in cui risiede un programma Y, fornendo ad Y il codice per usarle.
Architettura Client/Server Programmabile.
Esempio: Uso di una periferica
Word usa le risorse della periferica inviando i comandi necessari per produrre l’output desiderato
Clie nt PCs
Word
Comandi
Output Desiderato
Code On DemandUn programma X ha le risorse da utilizzare e chiede ad un programma Y le istruzioni da eseguire
Esempio:
1) Il browser ha le risorse (monitor, primitive grafiche)
2) Il server cerca il documento richiesto e lo invia al browser
3) Il browser interpreta il documento e lo presenta all’utente
Clie nt PCs
Web ServerBrowser
Richieste
Risposte con codice
Agenti MobiliUn programma X si trasferisce su un altro computer con i suoi dati e continua la sua esecuzioni lì.
Es. La macchina su cui risede X non ha la potenza di calcolo necessaria. X si trasferisce su un computer potente, effettua le operazioni e infine ritorna sul computer da cui era partito
Conseguenze:
Riduzione utilizzo della rete (solo 2 comunicazioni) rispetto alla chiamata di diversi servizi su server
Cosa offre JAVA-Socket
Classi utilizzabili dall’utente per scrivere facilmente applicazione Client/Server
-Remote Method Invocator RMIPermette ad oggetti su computer diversi di comunicare tra loro
-Downloading dinamico della classiGli Applet sono un esempio di code-on-demand
-Serializzazione degli oggettiAnche i threads sono oggetti che possono essere spediti: remote-evaluation(N.B. Lo stato di esecuzione del thread non può essere serializzato; artifici per gli agenti mobili)
Punto di forza: Indipendenza dalla piattaforma!Anche il codice può essere scambiato.
Esercitazione JAVA:Socket (25/01)
Sommario: java.net
• La classe InetAddress: rappresentazione degli indirizzi IP
• Un programma che parla con un altro: approccio Client/Server
• Le Classi Socket e ServerSocket• Esempi: EchoClient, HTTP Client
Cosa è un Socket?Il Socket il punto di ingresso/uscita di un programma verso un altro programma.
Come si indirizza un programma? Macchina su cui corre (host name o IP) + identificativo del programma (numero di porta)
Da un punto di vista astratto..
Server Client
Richiesta connessione:Host name + port number
Accept
Cosa è un Socket?Supponiamo arrivi un altro client..
Il server ha adesso 2 Socket attivi (due collegamenti con applicativi esterni..). Ogni Socket e’ individuato da 4 parametri:
IP + porta locale
IP + porta remotaRichiesta connessione:Host name + port numberAccept
Server Client
Client
2 Socket diversi con la stessa porta locale!
Implementazione di Socket
Aggiungere un oggetto Socket ad un applicativo consente la comunicazione con altri applicativi!
Nel package java.net esistono due diverse classi che implementano il concetto di Socket: una per il socket nel programma Server e l’altra per il socket nel programma Client.
ServerSocket(int port) ServerSocket(int port, int count)
Socket(String host, int port) Socket(InetAddress adr, int port)
ServerSocket: occorre specificare porta di ascolto e/o numero max di client;
Server (Client): occorre specificare host di destinazione (nome host o IP) e numero di porta del server.
Rappresentazione di un Host
•2 Modi possibili: Concetto: Nome host -> Implementazione: String Concetto: Indirizzo IP -> Implementazione: Classe InetAddress Si puo’ passare dall’una all’altra rappresentazione molto semplicemente; l’utente non deve occuparsi di nulla (es. Interrogazione DNS)
InetAddress
Esempio: uso di InetAddress• class IPDemo{• public static void main(String[] args) throws Exception {• InetAddress a, my;•• //Metodi statici: non si riferiscono ad un• //oggetto in particolare• a = InetAddress.getByName("www.tti.unipa.it");• my = InetAddress.getLocalHost();
• //Metodi propri: si applicano ad un oggetto di• //tipo InetAddress• String hostIP = a.getHostAddress();• String host = a.getHostName();•• String myhost = my.getHostName();• String myIP = my.getHostAddress();
• }• }
Consente di ottenere la risoluzione dei nomi e degli indirizzi
Esempio: L’Echo Server3 Passi fondamentali:
a) Mettere un Socket in Ascolto specificando un numero di portaServerSocket listen = new ServerSocket(port);
b) Aspettare l’arrivo del cliente (istruzione bloccante)Socket client = listen.accept();
c) Collegare opportunamete gli stream di ingresso e di uscita per eseguire il servizio (tutto quello che arriva da in deve andare su out):
InputStream i = client.getInputStream();OutputStream o = client.getOutputStream();
BufferedReader in = new BufferedReader(newInputStreamReader(i));
PrintWriter output = new PrintWriter(o);
o
i
output
(InputStreamReader)inServer
Cosa succede quando si accetta un Client?
Server Client
L’utente non deve preoccuparsi di nulla. Astraendo completamente da tutto quello che succede sotto, tra server e client puo’ semplicemente considerare instaurato un condotto di bit in entrambe le direzioni.
Esempio: L’Echo Client3 Operazioni fondamentali:
a) Fare una richiesta di connessione ad un serverSocket server = new Socket(“localhost”, port);
b) Verificare che la richiesta sia accolta (non si generano eccezioni: es. Host sconosciuto, connessione rifiutata, etc. )
try… catch(Exception e) c) Collegare opportunamete gli stream di ingresso e di uscita per
attivare la fruizione del servizio (stream verso i socket e verso la tastiera):
InputStream i = client.getInputStream();OutputStream o = client.getOutputStream();
BufferedReader in = new BufferedReader(newInputStreamReader(i));
BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in));PrintWriter output = new PrintWriter(o);
Esercizi
• Scrivere un programma che legga da tastiera il nome di un host e restituisca l’indirizzo IP dell’host.
• Dopo aver visto in funzione Echo Client ed Echo Server, provare ad implementare un server che restituisca l’echo invertito (usare la classe StringBuffer e il metodo reverse).
• Scrivere un programma server che letto da client il nome di un file testo del suo archivio, provvede ad inviarlo al cliente.