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.
Scarica

Diapositiva 1