Cosa una applicazione distribuita Pi programmi in esecuzione
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 -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 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 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 Inet. Address: rappresentazione degli indirizzi IP • Un programma che parla con un altro: approccio Client/Server • Le Classi Socket e Server. Socket • Esempi: Echo. Client, 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. Server. Socket(int port) Server. Socket(int port, int count) Socket(String host, int port) Socket(Inet. Address adr, int port) Server. Socket: 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 Inet. Address Si puo’ passare dall’una all’altra rappresentazione molto semplicemente; l’utente non deve occuparsi di nulla (es. Interrogazione DNS) Inet. Address
Esempio: uso di Inet. Address • • class IPDemo{ public static void main(String[] args) throws Exception { Inet. Address a, my; • • //Metodi propri: si applicano ad un oggetto di //tipo Inet. Address String host. IP = a. get. Host. Address(); String host = a. get. Host. Name(); • • //Metodi statici: non si riferiscono ad un //oggetto in particolare a = Inet. Address. get. By. Name("www. tti. unipa. it"); my = Inet. Address. get. Local. Host(); String myhost String my. IP = my. get. Host. Name(); = my. get. Host. Address(); } } 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 Server. Socket listen = new Server. Socket(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): Input. Stream i = client. get. Input. Stream(); Output. Stream o = client. get. Output. Stream(); Buffered. Reader in = new Buffered. Reader(new Input. Stream. Reader(i)); Print. Writer output = new Print. Writer(o); Server output in (Input. Stream. Reader) 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): Input. Stream i = client. get. Input. Stream(); Output. Stream o = client. get. Output. Stream(); Buffered. Reader in = new Buffered. Reader(new Input. Stream. Reader(i)); Buffered. Reader std. In = new Buffered. Reader( new Input. Stream. Reader(System. in)); Print. Writer output = new Print. Writer(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 String. Buffer 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.
- Slides: 18