1. Lezione 6: Remote Method
Invocation
Corso di Programmazione in Rete
Laurea Magistrale in Ing. Informatica
Università degli Studi di Salerno
1
2. Outline
✦ Middleware
✦ Remote Method Invocation
✦ Definizione e uso di oggetti remoti
2
3. Modelli distribuiti
✦ Molte applicazioni di rete possono essere
realizzate usando un paradigma Client-
Server
• il client invia la richiesta di un’operazione a un
server
• il server elabora la richiesta
• il server fornisce una risposta al client
✦ Esempi
• Il protocollo HTTP per il World Wide Web
• La posta elettronica
• Il nostro sistema di chat
3
4. Modelli distribuiti
✦ Java permette una gestione semplificata
dei socket, con il quale il programmatore
è in grado di realizzare un meccanismo di
comunicazione.
✦ I socket risolvono solo il problema di
fondo “come instaurare la connessione”,
ma non definiscono le modalità di
comunicazione.
• codifica delle informazioni
• estensibilità dei protocolli
4
• gestione efficiente delle connessioni
5. Middleware
✦ Un middleware è uno strato di software
che gestisce i meccanismi di
comunicazione tra più processi, situati
possibilmente su macchine diverse,
presentando allo sviluppatore
un’astrazione di livello più elevato, che gli
consenta di ignorare una serie di
problemi legati alla comunicazione
• Semplicità di sviluppo
• Indipendenza dagli specifici meccanismi di
comunicazione
5
6. Middleware
Client Server
Middleware Middleware
Connessione
Trasporto Trasporto
6
7. Middleware
✦ Esistono delle forti analogie concettuali
tra un sistema distribuito client-server e
la programmazione orientata agli oggetti
Invocazione metodo
Oggetto Oggetto
Risultato
Richiesta
Client Server
Risposta
✦ I middleware object-oriented usano queste
analogie per presentare allo sviluppatore
un modello “familiare”
7
8. Middleware
✦ In un middleware orientato agli oggetti,
gli oggetti di un processo possono
accedere ai servizi di un altro processo
usando l’astrazione di oggetti remoti
✦ L’invocazione di metodi su oggetti remoti
in realtà comporta la trasmissione di un
messaggio al server che implementa tali
oggetti, e l’attesa della risposta di tale
server (comunicazione sincrona)
8
9. Remote Method Invocation
✦ Gli oggetti remoti sono gestiti attraverso
riferimenti (Remote Reference) che si
comportano, dal punto di vista dello
sviluppatore, come riferimenti a oggetti
locali (o quasi). L’unica differenza è il
modo con cui vengono ottenuti questi
riferimenti.
✦ La soluzione full-Java per l’esecuzione di
codice remoto è conosciuta con il nome di
RMI (Remote Method Invocation)
9
10. Architettura RMI
✦ quando un oggetto desidera invocare un metodo
di un altro oggetto, deve prima ricavarne un
riferimento (indirizzo), istanziandolo
direttamente o ricevendone l’indirizzo
dall’esterno, e successivamente eseguire un
istruzione del tipo:
nome_oggetto.nome_metodo(lista_parametri)
10
11. Architettura RMI
✦ Nel caso distribuito si deve ricavare il riferimento
all’oggetto remoto e invocare i metodi a distanza
• la soluzione proposta da RMI consiste nello
scaricare in locale un “rappresentante”
dell’oggetto remoto e di considerarlo come se si
trattasse a tutti gli effetti di un oggetto locale
nome_ogg_remoto.nome_metodo(lista_parametri)
11
12. Architettura RMI
Lo strato più alto è costituito su entrambi i lati
(client/server) dall’applicazione che viene eseguita
sulla Java-Machine
✦ RMI Client
‣ applicazione che effettua le chiamate ai metodi degli
oggetti remoti residenti sul lato server
✦ RMI Server
‣ Applicazione che gestisce gli oggetti serventi
12
13. Architettura RMI
…sotto il livello applicazione si trovano i due
protagonisti di tutto il meccanismo RMI, lo stub e lo
skeleton, due rappresentanti della stessa entità.
Compiti dello stub sul client: Compiti dello skeleton sul
• inizia una chiamata via RRL server:
‣ invia i parametri (serializzazione)
• attende richieste
• invoca il metodo via RRL • riceve i dati dal client
‣ attende il completamento dell’operazione
‣ deserializzazione dei parametri
• completa la chiamata • chiama l’effettiva
‣ riceve e deserializza il risultato
• ritorna implementazione del metodo
• trasmette la risposta al client
‣ serializza il risultato
13
14. Architettura RMI
…i lati server e client sono collegati con il
sottostante Remote Reference Layer (RRL) che a
sua volta si appoggia al Transport Layer (TL)
Al livello RRL viene instaurato un collegamento
virtuale fra i due lati, client e server, mentre
fisicamente la connessione avviene al livello
sottostante
(RRL) basato su protocollo generico ed indipendente dal particolare tipo di
stub/skeleton
14
15. Architettura RMI
…i lati server e client sono collegati con il
sottostante Remote Reference Layer (RRL) che a
sua volta si appoggia al Transport Layer (TL)
Quando il TL riceve una richiesta di connessione da
parte del client, localizza il server RMI relativo
all’oggetto remoto richiesto:
localizzazione del server RMI
connessione per mezzo di un socket appositamente creato per
il servizio
passa la connessione al lato client del RRL ed aggiunge un
riferimento dell’oggetto remoto nella tabella opportuna
controllo dello stato delle connessioni (es. timeout)
15
16. Architettura RMI
RMI Client RMI Server
Stub Skeleton
Connessione virtuale
RRL RRL
TL TL
socket socket
TCP TCP
IP IP
Network Connessione fisica
Network
16
17. Definizione e uso di oggetti remoti
✦ I passi da seguire sono:
• definire un’interfaccia remota
• definire un’implementazione dell’interfaccia
• creare un’applicazione server che istanzi
l’implementazione e la renda pubblicamente
accessibile
• creare un client che ottenga un riferimento
remoto e lo usi per richiedere le operazioni al
server
17
18. Interfaccia remota
✦ Per ogni oggetto che deve essere
utilizzato come oggetto remoto occorre
definire una interface detta interfaccia
remota
• l’interfaccia remota deve estendere Remote
• ogni metodo deve dichiarare che può sollevare
l’eccezione RemoteException
• Sia Remote che RemoteException sono definite
nel package java.rmi
18
19. Interfaccia remota
✦ Esempio:
• supponendo che l’oggetto remoto che vogliamo
realizzare svolga le operazioni aritmetiche
fondamentali
import java.rmi.*;
public interface Calculator extends Remote {
double add(double a, double b) throws RemoteException;
double subtract(double a, double b) throws RemoteException;
double divide(double a, double b) throws RemoteException;
double multiply(double a, double b) throws RemoteException;
}
19
20. Interfaccia remota
✦ I parametri e il valore di ritorno dei
metodi dell’interfaccia remota possono
appartenere solo a un insieme ristretto di
tipi:
• tipi atomici (es. int)
• classi serializzabili
• interfacce remote (anche diverse da quella che
contiene il metodo)
• array i cui elementi appartengono ai tipi
sopraindicati
20
21. Implementazione
✦ La classe che contiene l’effettiva
implementazione dell’oggetto remoto:
• deve essere derivata da
java.rmi.server.UnicastRemoteObject
• deve dichiarare che implementa l’interfaccia
remota
• inoltre deve avere un costruttore (anche vuoto)
che dichiara di sollevare RemoteException
✦ Per convenzione, il nome della classe
termina generalmente con “Impl”
21
22. Implementazione
✦ Esempio
import java.rmi.*;
import java.rmi.server.*;
public class CalculatorImpl extends UnicastRemoteObject implements Calculator {
public CalculatorImpl() throws RemoteException {
// Costruttore vuoto
}
public double add(double a, double b) {
return a+b;
}
public double divide(double a, double b) {
return a/b;
}
public double multiply(double a, double b) {
return a*b;
}
public double subtract(double a, double b) {
return a-b;
}
}
22
23. Stub e skeleton
✦ Tradizionalmente, una volta definita la
classe di implementazione, occorreva
richiamare il tool rmic per effettuare la
generazione dello stub e dello skeleton
corrispondenti
✦ Da Java 1.2, lo skeleton viene generato
dinamicamente in modo automatico
✦ Da Java 1.5, anche lo stub viene generato
dinamicamente
23
24. Applicazione server
✦ L’applicazione server ha il compito di:
• creare una o più istanze delle classi che
implementano le interfacce remote
• rendere accessibili al client i riferimenti remoti a
queste istanze
‣ come fa il client a ottenere un riferimento remoto dal
server?
24
25. Applicazione server
✦ Il modo principale con cui un client
ottiene un remote reference è attraverso
il valore di ritorno di un metodo remoto
• se il client ha un riferimento a un oggetto remoto
A, l’oggetto può fornirgli il riferimento a un altro
oggetto remoto B, che a sua volta può fornirgli il
riferimento a C e così via
✦ Problema: “bootstrap”
• come fa il client a ottenere il riferimento al primo
oggetto remoto?
25
26. Registry
✦ Per risolvere il problema del bootstrap il
Java Development Kit mette a
disposizione l’applicazione rmiregistry
• name server che associa nomi simbolici (o più
precisamente URL) a riferimenti remoti
• il server registra i riferimenti agli oggetti di
bootstrap (quelli da cui il client deve partire per
accedere all’applicazione)
• il client consulta il name server usando un
protocollo ad hoc (già implementato da una classe
della libreria standard)
26
27. Registrazione di un riferimento
✦ Occorre usare il metodo statico rebind
della classe Naming:
‣ static void rebind(String name, Remote obj)
throws RemoteException, MalformedURLException
• name è il nome assegnato all’oggetto (parte finale
dell’URL)
• obj è l’istanza della classe di implementazione
• l’oggetto viene registrato su un rmiregistry che si
trova sulla stessa macchina
27
28. Applicazione server
✦ Esempio
import java.net.*;
import java.rmi.*;
public class CalculatorServer {
public static void main(String args[])
throws RemoteException, MalformedURLException {
Calculator calc=new CalculatorImpl();
Naming.rebind("calc", calc);
}
}
28
29. Il client
✦ Il client ottiene un riferimento agli oggetti
registrati usando il metodo lookup della
classe Naming:
• static Remote lookup(String url)
throws NotBoundException,
MalformedURLException,
RemoteException
✦ Il formato dell’URL è:
• rmi://host/name
29
30. Il client
✦ Una volta ottenuto un riferimento (dal
registry o da un altro oggetto remoto), il
client lo usa come se fosse un oggetto
“normale”
• occorre ricordare che ogni metodo dell’interfaccia
remota può sollevare un’eccezione controllata
RemoteException
30
31. Il client
✦ Esempio
import java.net.*;
import java.rmi.*;
public class CalculatorClient {
public static void main(String args[])
throws RemoteException, MalformedURLException, NotBoundException {
Calculator calc=(Calculator)Naming.lookup("rmi://localhost/calc");
System.out.print("9 per 9 fa "+calc.multiply(9,9));
}
}
31