Post on 16-Aug-2020
Vittorio Scarano
Corso di Programmazione Distribuita
Laurea di I livello in Informatica
Università degli Studi di Salerno
13. Java Remote 13. Java Remote MethodMethodInvocationInvocation
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
2
Organizzazione della lezioneOrganizzazione della lezione
• Remote Method Invocation
• Le classi ed interfacce di RMI
• La architettura a strati di RMI
• Una suddivisione funzionale di RMI
• Il processo di creazione
• Un esempio di uso: HelloWorld
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
3
Organizzazione della lezioneOrganizzazione della lezione
• Remote Method Invocation
• Le classi ed interfacce di RMI
• La architettura a strati di RMI
• Una suddivisione funzionale di RMI
• Il processo di creazione
• Un esempio di uso: HelloWorld
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
4
Remote Remote MethodMethod InvocationInvocation (RMI)(RMI)
• RMI è un modello ad oggetti distribuito offerto da Java
• Il modello mantiene le caratteristiche di Java...– …e si integra all'interno della semantica di Java.
• Il principio: "Write once, Run anywhere"
• Estensione "ad oggetti" di Remote Procedure Call– fornisce la visione astratta di una chiamata di procedura
remota verso altri processi
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
5
Gli scopi di RMI Gli scopi di RMI -- 11
• Supportare in maniera trasparente invocazioni remote di metodi su oggetti su differenti JVM
• Integrare in maniera naturale il modello distribuito all'interno di Java mantenendo le caratteristiche del linguaggio
• Rendere evidenti le differenze tra il modello distribuito e quello locale
• Rendere facile (compatibilmente con gli altri scopi) la realizzazione di applicativi distribuiti in Java
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
6
Gli scopi di RMI Gli scopi di RMI -- 22
• Preservare il type-safety di Java
• Supportare la semantica dei riferimenti (persistenza, lazy activation etc.)
• Mantenere la sicurezza offerta da Java con i securitymanager e i class loader
• Supportare le callback da server verso applet
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
7
Applicazioni ad oggetti distribuiteApplicazioni ad oggetti distribuite
• Applicazioni composte da server e client– Il server:
• crea un certo numero di oggetti • li rende accessibili da remoto• attende le invocazioni dei client sugli oggetti
– Il client:• preleva la reference ad uno o più oggetti remoti• invoca i loro metodi
• Ruolo tra client e server spesso “confuso”– “servent” in una architettura peer-to-peer
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
8
Ed RMI?Ed RMI?
• RMI fornisce il meccanismo attraverso il quale server e client comunicano
• Una applicazione distribuita deve, quindi, poter:– Localizzare oggetti remoti
• attraverso un registro
– Comunicare con oggetti remoti• nascondere per quanto possibile i dettagli della invocazione remota
– Poter caricare dinamicamente classi dalla rete• tra i parametri passati possono esserci anche oggetti
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
9
Uno schema di funzionamento per RMIUno schema di funzionamento per RMI
Client
Server
Registry
Web ServerWeb Server
1. Registrazione oggetto con un nome sul registry da parte del server
2. Il client ricerca il nome sul registry ed ottiene un riferimento remoto
3. Il client invoca il metodo remoto sull’oggetto
• Possibile caricare classi dinamicamente (da Web server)
12
3
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
10
Somiglianze tra il modello distribuito e localeSomiglianze tra il modello distribuito e locale
• Un riferimento ad un oggetto remoto può essere passato come argomento (o restituito) da una invocazione di un metodo (locale o remoto)
• Un oggetto remoto può essere soggetto a casting
• L'operatore istanceof può essere usato per testare le interfacce supportate da un oggetto remoto
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
11
Differenze tra il modello distribuito e localeDifferenze tra il modello distribuito e locale
• I client interagiscono con le interfacce remote non con la loro implementazione
• Argomenti non remoti e risultati sono passati per copia non per riferimento
• Un oggetto remoto è passato per sempre per riferimento
• Alcuni metodi di Object hanno semantica diversa per gli oggetti remoti (equals, hashCode,toString, clone)
• Esistono alcune eccezioni remote addizionali
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
12
Organizzazione della lezioneOrganizzazione della lezione
• Remote Method Invocation
• Le classi ed interfacce di RMI
• La architettura a strati di RMI
• Una suddivisione funzionale di RMI
• Il processo di creazione
• Un esempio di uso: HelloWorld
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
13
Le classi ed interfacce di RMILe classi ed interfacce di RMI
RemoteObject
<<interface>>Remote
RemoteServer
Activatable UnicastRemoteObject
IOException
RemoteException
Object
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
14
Le interfacce remoteLe interfacce remote
• Una interfaccia remota dichiara metodi che possono essere invocati da una JVM remota
• Requisiti di una interfaccia remota– deve derivare (direttamente o indirettamente) da
java.rmi.Remote• una interfaccia marker (definita vuota)
– tutti i metodi dichiarati devono essere remoti• devono indicare che lanciano java.rmi.RemoteException o una delle
superclassi java.io.IOException o java.lang.Exception)
• parametri remoti devono essere dichiarati tramite la corrispondente interface
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
15
Uso delle Uso delle interface interface in RMIin RMI
• Interface: comportamento
• Classe: implementazione
Client Program Server Program
Interface Implementazione
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
16
Le classi ed interfacce di RMILe classi ed interfacce di RMI
RemoteObject
<<interface>>Remote
RemoteServer
Activatable UnicastRemoteObject
IOException
RemoteException
Object
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
17
Le eccezioni remoteLe eccezioni remote
• La classe java.rmi.RemoteException rappresenta le eccezioni che possono essere generate a runtime
• Alcuni possibili motivi:– malfunzionamento della comunicazione
• server non raggiungibile
• server rifiuta connessioni
• connessione chiusa dal server
– errore durante il trasferimento dei parametri o dei valori di ritorno
– errori del protocollo RMI
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
18
Le classi ed interfacce di RMILe classi ed interfacce di RMI
RemoteObject
<<interface>>Remote
RemoteServer
Activatable UnicastRemoteObject
IOException
RemoteException
Object
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
19
Gli oggetti remoti (server)Gli oggetti remoti (server)
• Le classi sono:– java.rmi.server.RemoteObject
• superclasse (astratta): implementa hashCode(), equals() e toString()
– java.rmi.server.RemoteServer• superclasse (astratta) per server (gestione log, etc.)
– java.rmi.server.UnicastRemoteObject• superclasse (astratta) per un oggetto remoto il cui riferimento è
valido solo se è attivo il server
– java.rmi.activation.Activatable• superclasse (astratta) per oggetti attivabili: cominciano la loro
esecuzione all’atto della chiamata e possono “chiudersi” se necessario (run on-demand)
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
20
Organizzazione della lezioneOrganizzazione della lezione
• Remote Method Invocation
• Le classi ed interfacce di RMI
• La architettura a strati di RMI
• Una suddivisione funzionale di RMI
• Il processo di creazione
• Un esempio di uso: HelloWorld
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
21
La architettura a strati di RMILa architettura a strati di RMI
Transport Layer
Remote Reference Layer
Stub&Skeleton Layer
Remote Reference Layer
Stub&Skeleton Layer
Client Program Server Program
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
22
Il Il layerlayer Stub&SkeletonStub&Skeleton
• Usa un Design Pattern chiamato Proxy– un oggetto in un contesto viene rappresentato da un altro
oggetto (detto proxy) in un altro contesto
– il proxy sa come fare il forward delle chiamate di metodi tra gli oggetti
Proxy
+request()
RealObj
+request()
<<interface>>Obj
+request()Stub
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
23
Il Il LayerLayer Remote Remote ReferenceReference
• Definisce il comportamento delle chiamate RMI
• Fino a JDK 1.2 esistevano stub (proxy lato client) e skeleton (lato server)
• Da JDK 1.3 in poi, basta solo lo stub:– Lo stub usa il metodo invoke() (reflection) per chiamare il
metodo remoto
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
24
Il Il LayerLayer di Trasportodi Trasporto
• Connessioni basate su stream TCP/IP
• RMI usa un protocollo wire-level chiamato Java Remote Method Protocol (JRMP)
• Possibile usare (con RMI-IIOP) il protocollo Internet Inter-ORB Protocol (IIOP) di Corba– integrazione di RMI con Corba
– alcune modifiche necessarie alla semantica di RMI
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
25
Organizzazione della lezioneOrganizzazione della lezione
• Remote Method Invocation
• Le classi ed interfacce di RMI
• La architettura a strati di RMI
• Una suddivisione funzionale di RMI
• Il processo di creazione
• Un esempio di uso: HelloWorld
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
26
I livelli visti ortogonalmenteI livelli visti ortogonalmente
• Tre strati (layers):– stub/skeleton layer
• interfaccia tra oggetti cliente server per interagire
– remote reference layer• gestisce i riferimenti remoti
ad oggetti
– transport protocol layer• protocollo dati binario per
trasmettere richieste/risposte
Oggetto
Client
Oggetto
Server
Stub
Skeleton
Remote ReferenceManager
Remote ReferenceManager
RMI TransportLayer
Stub/S
keletonL
ayer
Rem
ote
Ref
eren
ceL
ayer
Server
Client
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
27
Passaggio di parametri (1)Passaggio di parametri (1)
• Parametro – argomento o valore restituito da un metodo
• Attraverso RMI, i parametri possono essere qualsiasi oggetto serializzabile– serializzabile = trasformabile in un flusso di byte
• tipi primitivi,
• oggetti remoti
• oggetti non-remoti che implementino la interface Serializable
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
28
Passaggio di parametri (2)Passaggio di parametri (2)
• Passaggio di parametri non remoti per copia– cioè l'oggetto è serializzato e trasmesso
• Passaggio di parametri remoti: si trasmette lo stub
JVM1 JVM2
A A
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
29
Passaggio di parametri (3)Passaggio di parametri (3)
• Integrità referenziale: – due riferimenti allo stesso oggetto, passati nella stessa
invocazione, si riferiranno ad una stessa copia dell'oggetto sulla destinazione
JVM1 JVM2A
B
A
B
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
30
Passaggio di parametri (4)Passaggio di parametri (4)
• Annotazione di classi: – insieme all'oggetto, il sistema annota il descrittore di classe
con il nome ed altre informazioni (URL) che ne permetta il caricamento dinamico
JVM1 JVM2
AA
Class C
istanceof
Nome ed URL della Classe C
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
31
Localizzazione di oggetti remotiLocalizzazione di oggetti remoti
• Necessario un servizio di naming (directory service)
• Diverse possibilità– Java Naming and Directory Interface (JNDI)
– Registry di RMI (semplice servizio fornito con RMI)
• Il registry di RMI viene acceduto con i metodi offerti dalla classe statica java.rmi.Naming
• Fornisce 5 metodi:public static String[ ] list(String name) public static Remote lookup(String name) public static void bind(String name, Remote obj) public static void rebind(String name, Remote obj) public static void unbind(String name)
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
32
Uso di Uso di java.rmi.Namingjava.rmi.Naming
• Gli argomenti ai metodi di Naming accettano una String che è una URL con il seguente formato:
rmi://host:port/name
• Default: host vale localhost, port vale 1099
• Name è il nome (human-readible) dell’oggetto
Metodi usati:• public static Remote lookup(String name)
– restituisce un riferimento ad un oggetto remoto con quella identificazione presso il registry
• public static void bind(String name, Remote obj) – effettua il bind dell’oggetto obj con la identificazione name
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
33
Architettura di RMI: funzionamento (1)Architettura di RMI: funzionamento (1)
• Client fa la richiesta chiamando un metodo sullo stub
• Lo stub ha un riferimento all’oggetto remoto ed invia la richiesta al layer del riferimento remoto facendo il marshalling degli argomenti:– convertire oggetti locali in forma portabile a remoto
• oggetti locali vengono serializzati (interface Serializable)
• oggetti remoti (interface Remote): riferimento remoto
• .....
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
34
Architettura di RMI: funzionamento (2)Architettura di RMI: funzionamento (2)
• Il remote reference layer del server riceve la richiesta e la trasforma in una richiesta allo skeleton
• Lo skeleton converte la richiesta nel metodo chiamato facendo l’unmarshalling i parametri e passandoli all’oggetto
• Eccezioni e valori restituiti dal metodo vengono passate al client attraverso skeleton e stub
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
35
Organizzazione della lezioneOrganizzazione della lezione
• Remote Method Invocation
• Le classi ed interfacce di RMI
• La architettura a strati di RMI
• Una suddivisione funzionale di RMI
• Il processo di creazione
• Un esempio di uso: HelloWorld
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
36
RMI: Il processo di creazioneRMI: Il processo di creazione1 1 -- Definizione della interface remotaDefinizione della interface remota
• Il server dichiara i servizi offerti attraverso un interface remota
• La interface deve estendere java.rmi.Remote
• Ogni metodo deve lanciare la eccezionejava.rmi.RemoteException
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
37
RMI: Il processo di creazione RMI: Il processo di creazione 2 2 -- Implementazione della interface remotaImplementazione della interface remota
• Il server implementa la interface remota
• Gli oggetti remoti devono derivare dajava.rmi.UnicastRemoteObject
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
38
RMI: Il processo di creazioneRMI: Il processo di creazione3 3 -- Compilazione con Compilazione con javacjavac
• La classe server viene compilata con javac
• La compilazione genera la classe Server
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
39
RMI: Il processo di creazioneRMI: Il processo di creazione4 4 -- Compilazione con lo Compilazione con lo stubstub compilercompiler rmicrmic
• rmic viene eseguito sulla classe server
• Genera – un client stub– un server skeleton
• Lo stub (client proxy)– invia le chiamate remote verso
il server– effettua il marshalling dei
parametri
• Lo skeleton (server proxy)– riceve le chiamate remote– unmarshal parametri– chiama i metodi dell'oggetto
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
4
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
40
RMI: Il processo di creazioneRMI: Il processo di creazione5 5 -- Lanciare Lanciare rmiregistryrmiregistry
• Servizio di Naming non persistente
• Permette la registrazione e il retrieve di oggetti per nome
• Un server può anche implementare il proprio registry
• Deve essere localizzato sulla macchina del server
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
41
RMI: Il processo di creazioneRMI: Il processo di creazione6 6 -- Lanciare oggetti del serverLanciare oggetti del server
• Il server viene lanciato
• Crea gli oggetti che devono essere acceduti da remoto
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
42
RMI: Il processo di creazioneRMI: Il processo di creazione7 7 -- Registrazione degli oggetti del serverRegistrazione degli oggetti del server
• Ogni oggetto da accedere da remoto deve essere registrato sul registry
• Si usano i metodi di java.rmi.Naming per effettuare il binding di nomi ad oggetti
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
7
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
43
RMI: Il processo di creazioneRMI: Il processo di creazione8 8 -- Implementazione del Implementazione del ClientClient
• Il client viene implementato
• Di norma, non richiede molte modifiche
• Usa i metodi di java.rmi.Naming per localizzare un oggetto remoto
• L'invocazione dei metodi usa lo stub come intermediario
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
7
8
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
44
RMI: Il processo di creazioneRMI: Il processo di creazione9/10 9/10 -- Compilazione ed esecuzione del Compilazione ed esecuzione del ClientClient
• Il Client viene compilato ed eseguito.
• L'accesso agli oggetti remoti viene effettuato attraverso gli stub
• Gli stub possono anche essere caricati a run-time
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
7
8
9
10
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
45
Le classi generateLe classi generate
Remote Interface
Implementazione dellaRemote Interface
ClientObjects
ClientObjects
ClientObjects
Implementazioni delRemote Obj
Implementazioni delRemote Obj
Implementazioni delRemote Obj
Stub Class Skeleton Class
Stub Object Skeleton Object
Generate da rmic
Scrittodal
programmatore
Implementazione del Client
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
46
Organizzazione della lezioneOrganizzazione della lezione
• Remote Method Invocation
• Le classi ed interfacce di RMI
• La architettura a strati di RMI
• Una suddivisione funzionale di RMI
• Il processo di creazione
• Un esempio di uso: HelloWorld
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
47
Un esempio di uso: l'oggetto remoto Un esempio di uso: l'oggetto remoto HelloHello
• Definizione della Interface Remota • definizione derivata da java.rmi.Remote• ogni metodo deve lanciare java.rmi.RemoteException
• Scrivere la implementazione della Classe Server• specificare la interface remota• specificare il/i costruttore/i dell'oggetto remoto• implementare i metodi remoti• creare ed installare un security manager• creare una o più istanze di oggetti remoti• registrare gli oggetti al registry.
• Scrivere la Classe Client• ottenere un riferimento remoto all'oggetto remoto dal registro
• invocare il/i metodo remoto
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
48
Il diagramma di Il diagramma di RemoteHelloRemoteHello
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
49
RMI: Il processo di creazioneRMI: Il processo di creazione1 1 -- Definizione della interface remotaDefinizione della interface remota
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
50
La interface remota dell'oggetto: il file La interface remota dell'oggetto: il file Hello.javaHello.java
package hello;
public interface Helloextends java.rmi.Remote {
String dimmiQualcosa(String daChi) throws java.rmi.RemoteException;
}
• Dichiarazione di package
• Interface– eredita da
java.rmi.Remote
• Metodo dimmiQualcosadichiarato
• Lancia RemoteException
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
51
RMI: Il processo di creazione RMI: Il processo di creazione 2 2 -- Implementazione della interface remotaImplementazione della interface remota
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
52
La implementazione dell'oggetto remoto: La implementazione dell'oggetto remoto: il file il file HelloImpl.javaHelloImpl.java (1)(1)
package hello;import java.rmi.*;import java.rmi.server.UnicastRemoteObject;
public class HelloImplextends UnicastRemoteObjectimplements Hello {
public HelloImpl() throws java.rmi.RemoteException {}
public String dimmiQualcosa(String daChi) throws RemoteException {
System.out.println("Saluto "+daChi);return "Ciao "+daChi+"!";
}// continua……
• Derivato da … • … e implementa la
interface remota• Il costruttore (vuoto)
dell'oggetto remoto – con chiamata
implicita al costruttore della superclasse
• Implementazione del metodo remoto
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
53
La implementazione dell'oggetto remoto: La implementazione dell'oggetto remoto: il file il file HelloImpl.javaHelloImpl.java (2)(2)
// continua … … public static void main(String args[]) {System.setSecurityManager(new
RMISecurityManager());try {
HelloImpl obj = new HelloImpl();Naming.rebind("HelloServer", obj);System.out.println("Pronto!");
} catch (Exception e) {e.printStackTrace();
}} // end main} // end classe HelloImpl
• Crea ed installa un security manager– utile per poter caricare
classi dinamicamente se non sono presenti sul CLASSPATH
• crea una istanza di oggetto remoto obj
• registra l'oggetto sul registry
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
54
RMI: Il processo di creazioneRMI: Il processo di creazione3/4 3/4 -- Compilazione con Compilazione con javacjavac
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
ServerClient
4
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
55
La compilazione del server La compilazione del server HelloImplHelloImpl
• Compilazione della interface:– javac Hello.java
• Compilazione del server:– javac HelloImpl.java
• Generazione stub e skeleton:– rmic hello.HelloImpl
che genera i file:– HelloImpl_Stub.class– HelloImpl_Skel.class P
rogr
amm
azio
ne D
istr
ibui
ta.
Vi.t
tori
oSc
aran
o
56
RMI: Il processo di creazioneRMI: Il processo di creazione5/6/7 5/6/7 -- Lanciare Lanciare rmiregistryrmiregistry e server e server
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
7
8
9
10
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
57
RMI: Il processo di creazioneRMI: Il processo di creazione8 8 -- Implementazione del Implementazione del ClientClient
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
7
8
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
58
Il Il ClientClient: il file : il file HelloClient.javaHelloClient.java
package hello;import java.rmi.*;public class HelloClient {public static void main(String args[]) {String host = “localhost”;String nome = “Pippo”;if (args.length > 0 ) host = args[0];if (args.length > 1 ) nome = args[1];try {Hello obj = (Hello)
Naming.lookup(”rmi://”+host+”/HelloServer");
System.out.println("Ricevuto:"+ obj.dimmiQualcosa(nome));
} catch (Exception e) {e.printStackTrace();
}}// fine main}// fine classe HelloClient
• Prende (se c’è) il primo parametro come host e il secondo come nome
• Ottiene un riferimento remoto all'oggetto remoto dal registro
• Hostname
• Invocare il metodo remoto
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
59
Le classi generate nell’esempioLe classi generate nell’esempio
Hello
HelloImpl
ClientObjects
ClientObjectsHelloClient
HelloImplHelloImplHelloImpl
HelloImpl_Stub.class HelloImpl_Skel.class
Stub Object Skeleton Object
Generate da rmic
Scrittodal
programmatoreHelloClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
60
RMI: Il processo di creazioneRMI: Il processo di creazione99-- Compilazione del Compilazione del ClientClient
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
7
8
9
10
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
61
La compilazione del La compilazione del clientclient HelloClientHelloClient
• Avendo a disposizione lo stub
– HelloImpl_Stub.class
• Compilazione del client:
– javac HelloClient.java
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
62
RMI: Il processo di creazioneRMI: Il processo di creazione10 10 -- Lanciare il Lanciare il clientclient
Definire la interface remota
Implementare la interface
javac
rmic
Serverclass
ServerskeletonClient
StubImplementare
il client
javac
Lanciareil client
Lanciare rmiregistry
Lanciare oggetti server
Registrare oggetti server
1
2
3
5
4
6
7
8
9
10
ServerClient
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
63
Un ultimo passo: la Un ultimo passo: la securitysecurity policypolicy
• Necessario settare la security policy della JVM– scrivendo un file che caratterizza i permessi dati a ciascuna
operazione
• Possibile scegliere politiche – per tutte le macchine virtuali– per singolo utente– per applicazione
• Esempio: scrivere nel file policyall (nella directory dove si lancia la JVM) la policy più “liberale” (!)
grant {permission java.security.AllPermission;
};
Pro
gram
maz
ione
Dis
trib
uita
. V
i.tto
rio
Scar
ano
64
Esecuzione di Esecuzione di HelloHello
• Sulla macchina del server (serverhost):– lanciare il registry sulla porta di default 1099
• rmiregistry & (Unix)
• start rmiregistry (Windows)
– lanciare il programma server con la policy:• java -Djava.security.policy=policyall hello.HelloImpl
• Sulla macchina del client:– lanciare il programma client:
• java hello.HelloClient serverhost Topolino