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-Server Un Programma Client richiede servizi messi a disposizione da un programma Server (anche sulla stessa macchina) Richieste Risposte Server Esempi Telnet: Permette di operare su un computer remoto come se fosse locale X-Window: ogni applicazione per accedere al display chiede servizi al server X-window Vengono scambiati solo dati
Architettura Client/Server Programmabile. Remote Evaluation Un programma X usa le risorse sulla macchina in cui risiede un programma Y, fornendo ad Y il codice per usarle. Architettura Client/Server Programmabile. Word Comandi Output Desiderato Esempio: Uso di una periferica Word usa le risorse della periferica inviando i comandi necessari per produrre l’output desiderato
Code On Demand Un programma X ha le risorse da utilizzare e chiede ad un programma Y le istruzioni da eseguire Richieste Risposte con codice Web Server Browser Esempio: Il browser ha le risorse (monitor, primitive grafiche) Il server cerca il documento richiesto e lo invia al browser Il browser interpreta il documento e lo presenta all’utente
Agenti Mobili Un 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 -Remote Method Invocator RMI Classi utilizzabili dall’utente per scrivere facilmente applicazione Client/Server -Remote Method Invocator RMI Permette ad oggetti su computer diversi di comunicare tra loro -Downloading dinamico della classi Gli Applet sono un esempio di code-on-demand -Serializzazione degli oggetti Anche 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? Accept Server Client Richiesta connessione: 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.. Accept Server Client Richiesta connessione: Host name + port number
Cosa è un Socket? Client Server Client Richiesta connessione: 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 remota Richiesta connessione: Host name + port number Client Accept Server Client 2 Socket diversi con la stessa porta locale!
Implementazione di Socket 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. Aggiungere un oggetto Socket ad un applicativo consente la comunicazione con altri applicativi!
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 Server 3 Passi fondamentali: a) Mettere un Socket in Ascolto specificando un numero di porta ServerSocket 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(new InputStreamReader(i)); PrintWriter output = new PrintWriter(o); Server output o in (InputStreamReader) i
Cosa succede quando si accetta un 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. Server Client
Esempio: L’Echo Client 3 Operazioni fondamentali: a) Fare una richiesta di connessione ad un server Socket 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(new InputStreamReader(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.