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 Client PCs 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 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. Comandi Client PCs Output Desiderato Word 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 Client PCs Browser Web Server 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 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 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? 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? 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 Accept Server 2 Socket diversi con la stessa porta locale! Client Richiesta connessione: Host name + port number Client 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 propri: si applicano ad un oggetto di //tipo InetAddress String hostIP = a.getHostAddress(); String host = a.getHostName(); • • //Metodi statici: non si riferiscono ad un //oggetto in particolare a = InetAddress.getByName("www.tti.unipa.it"); my = InetAddress.getLocalHost(); String myhost String myIP = my.getHostName(); = 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 in (InputStreamReader) o 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.