Java RMI (Remote Method Invocation)



Documenti analoghi
Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

Architettura. Java RMI (Remote Method Invocation) Definizioni e generalità

Socket & RMI Ingegneria del Software - San Pietro

Architettura RMI. JAVA RMI (Remote Method Invocation) Definizioni e generalità

RMI. Java RMI RMI. G. Prencipe

Java Remote Method Invocation

Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144

Esercitazione di Sistemi Distribuiti: Java RMI

Programmazione distribuita

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

RMI Remote Method Invocation

Programmazione di sistemi distribuiti

Corso di Reti di Calcolatori L-A

Corso di Reti di Calcolatori T

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Principi, Modelli e Applicazioni per Sistemi Distribuiti M

Introduzione a Java Remote Method Invocation (RMI)

Contesto e motivazioni Architettura e concetti di base Componenti di RMI RMIRegistry Interfacce, eccezioni e classi Lo sviluppo di una applicazione L

Corso di Reti di Calcolatori T

Remote Method Invocation (RMI)

Java RMI. Alcune premesse Interfaccia e Implementazione RMI. Architettura. Esempi interfaccia e implementazione

RMI: metodi equals e hashcode

Corso di Reti di Calcolatori T

Activation In sintesi: è inutile avere attivi degli oggetti se non vengono utilizzati

RPC Birrel Nelson (1984) usate in Xerox, Spice, Sun, HP, etc.

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Programmazione di rete in Java

Corso di Reti di Calcolatori LS

JNDI. Massimo Merro Programmazione di Rete 214 / 229

appunti delle lezioni Architetture client/server: applicazioni client

Corso di Reti di Calcolatori T

Cenni di programmazione distribuita in C++ Mauro Piccolo

Sistemi Operativi (modulo di Informatica II)

URI. Introduzione. Pag. 1

Introduzione alle applicazioni di rete

Architettura Client-Server

Corso di Reti di Calcolatori L-A

Sistemi Distribuiti. Anno Accademico Prof. Flavio De Paoli. Il modello ad oggetti

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

1. RETI INFORMATICHE CORSO DI LAUREA IN INGEGNERIA INFORMATICA SPECIFICHE DI PROGETTO A.A. 2013/ Lato client

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Programmazione dei socket con TCP #2

Sistemi Distribuiti Multiagente A.A Informatica Magistrale Università di Bari

Studi di Settore. Nota Operativa 22/4/2013

RMI. Prova pratica di Sistemi Distribuiti:

Reti di Telecomunicazione Lezione 6

Architettura del. Sintesi dei livelli di rete. Livelli di trasporto e inferiori (Livelli 1-4)

Il client deve stampare tutti gli eventuali errori che si possono verificare durante l esecuzione.

Java: Compilatore e Interprete

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

19. LA PROGRAMMAZIONE LATO SERVER

appunti delle lezioni Architetture client/server: applicazioni server

Corso di Reti di Calcolatori T

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern

Il linguaggio Java. Oggetto remoto. Remote Method Invocation (RMI) Oggetto remoto: oggetto i cui metodi possono essere invocati attraverso la rete

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client

Laboratorio di Sistemi Distribuiti Leonardo Mariani

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Airone Gestione Rifiuti Funzioni di Esportazione e Importazione

Inizializzazione degli Host. BOOTP e DHCP

Servizi Remoti. Servizi Remoti. TeamPortal Servizi Remoti

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Parte II: Reti di calcolatori Lezione 10

SISTEMI OPERATIVI DISTRIBUITI

Intel One Boot Flash Update Utility Guida dell utente

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Java Security Model e RMI

Web Application Libro Firme Autorizzate

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

LPR 2005/2006 Lezione 7. paradigma di interazione domanda/risposta remote procedure call RMI (Remote Method Invocation): API JAVA esercizio

IBM SPSS Statistics per Linux - Istruzioni di installazione (Licenza per sito)

Appunti di Informatica 1

Oggetti Lezione 3. aspetti generali e definizione di classi I

PROVA FINALE Ingegneria del software

PORTALE CLIENTI Manuale utente

Corso di Informatica Modulo T3 B2 - Database in rete

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Corso di Reti di Calcolatori LS

FPf per Windows 3.1. Guida all uso

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Organizzazione della lezione. Lezione 14 Remote Method Invocation - 2. Remote. Il diagramma di RemoteHello

Registratori di Cassa

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Comunicazione tra Processi

Comunicazione tra Processi

Java Server farm. M. Danelutto. Progetto conclusivo LPRb A.A Versione 1.0

SOSEBI PAPERMAP2 MODULO WEB MANUALE DELL UTENTE

Reti di Telecomunicazione Lezione 7

Transmission Control Protocol

Organizzazione della lezione. 16. Java Remote Method Invocation (4) Le classi ed interfacce di RMI. Persistenza. Oggetti attivabili

Siti web centrati sui dati (Data-centric web applications)

Progettazione : Design Pattern Creazionali

Architettura MVC-2: i JavaBeans

Reti di Telecomunicazione Lezione 8

Corso di Reti di Calcolatori T

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

Network Services Location Manager. Guida per amministratori di rete

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI

Transcript:

Java RMI (Remote Method Invocation) Accesso ad oggetti remoti In Java non sono possibili riferimenti remoti RPC in JAVA Le RMI introducono la possibilità di richiedere esecuzione di metodi remoti in JAVA integrando il tutto con il paradigma OO C1 instance S1 instance CLASS server S1 S1 instance state operations Definizioni e generalità Insieme di politiche e meccanismi che permettono ad un applicazione Java in esecuzione su una macchina di invocare i metodi di un oggetto di una applicazione Java in esecuzione su una macchina remota Viene creato localmente solo il riferimento ad un oggetto remoto, che è invece effettivamente attivo su un nodo remoto Un programma cliente invoca i metodi attraverso questo riferimento locale Unico ambiente di lavoro come conseguenza del linguaggio Java ma Eterogeneità di ambienti Supporto di INTEGRAZIONE per la DISTRIBUZIONE ma si possono costruire con RMI Remote Method Invocation due proxy, stub dalla parte del cliente, skeleton dalla parte del servitore C1 instance S1 instance C1 Stub CLIENT node S1 Skeleton SERVER node Reti di calcolatori, Java RMI - 1 Reti di calcolatori, Java RMI - 2

RMI System Architettura Registry Client Program Server Program Stubs Skeletons Remote Reference Layer Remote Reference Layer Transport Layer Caratteristiche Modello a oggetti distribuito Nel modello ad oggetti distribuito di Java un oggetto remoto consiste in: - un oggetto i cui metodi sono invocabili da un'altra JVM, potenzialmente in esecuzione su un host differente - un oggetto descritto tramite interfacce remote che dichiarano i metodi accessibili da remoto Stub: proxy locale su cui vengono fatte le invocazioni destinate all oggetto remoto Skeleton: entità remota che riceve le invocazioni fatte sullo stub e le realizza effettuando le corrispondenti chiamate sul server Registry: servizio di nomi che consente al server di pubblicare un servizio e al client di recuperarne il proxy Remote Reference Layer: - fornisce il supporto alle chiamate inoltrate dallo stub - localizza il server RMI relativo all oggetto remoto richiesto Transport Layer: definisce e supporta la semantica dell invocazione e della comunicazione, gestisce le connessioni (TCP/IP, timeout) e le trasmissioni (sequenziali, serializzate), usando un protocollo proprietario Reti di calcolatori, Java RMI - 3 Chiamata locale vs. chiamata remota Il cliente invoca un metodo di un oggetto non locale Sintassi: uguale => trasparenza Chiamata sincrona Semantica: diversa Chiamate locali: affidabilità 100% Chiamate remote: uso di comunicazione possibilità di fallimento semantica at most once con uso TCP Server remoto come locale: Ogni chiamata esegue in modo indipendente e parallelo (?) Reti di calcolatori, Java RMI - 4

SERVIZIO REMOTO RMI Interfacce e Implementazione Separazione tra definizione del comportamento => interfacce implementazione del comportamento => classi Per realizzare componenti utilizzabili in remoto: 1. definizione del comportamento metodi disponibili in interfaccia che - estende java.rmi.remote e - propaga java.rmi.remoteexception 2. implementare comportamento il server specificato in una classe che - implementa l interfaccia definita - estende java.rmi.unicastremoteobject Uso di RMI Per sviluppare un applicazione distribuita usando RMI si deve: 1. Definire interfacce e implementazioni dei server utilizzabili in remoto (implementazioni?) 2. Compilare le classi (con javac) e generare stub e skeleton (con rmic) delle classi utilizzabili in remoto 3. Pubblicare il servizio - attivare il registry - registrare il servizio (il server deve fare una bind sul registry) 4. Il cliente deve ottenere il riferimento all oggetto remoto tramite il name service, facendo una lookup sul registry A questo punto l interazione tra il cliente e il server può procedere N.B.: questa è una descrizione di base, dettagli sul registry e sul caricamento dinamico delle classi saranno dati in seguito Reti di calcolatori, Java RMI - 5 Reti di calcolatori, Java RMI - 6

Esempio: servizio di echo remoto Definizione dell interfaccia del servizio public interface EchoInterface extends java.rmi.remote String getecho(string echo) throws java.rmi.remoteexception; Implementazione del Server public class EchoRMIServer extends java.rmi.server.unicastremoteobject implements EchoInterface // Costruttore public EchoRMIServer() throws java.rmi.remoteexception super(); // Implementazione del metodo remoto dichiarato nell'interfaccia public String getecho(string echo) throws java.rmi.remoteexception return echo; public static void main(string[] args) // Registrazione del servizio try EchoRMIServer serverrmi = new EchoRMIServer(); Naming.rebind("EchoService", serverrmi); catch (Exception e) e.printstacktrace(); System.exit(1); Reti di calcolatori, Java RMI - 7 Reti di calcolatori, Java RMI - 8

Implementazione del Client public class EchoRMIClient // Avvio del Client RMI public static void main(string[] args) BufferedReader stdin= new BufferedReader( new InputStreamReader(System.in)); try // Connessione al servizio RMI remoto EchoInterface serverrmi = (EchoInterface) java.rmi.naming.lookup("echoservice"); // Notare l uso di cast // Interazione con l'utente String message, echo; System.out.print("Messaggio? "); message = stdin.readline(); // Richiesta del servizio remoto echo = serverrmi.getecho(message); System.out.println("Echo: "+echo+"\n"); catch (Exception e) e.printstacktrace(); System.exit(1); Compilazione javac EchoInterface.java EchoRMIClient.java EchoRMIServer.java Creazione dello Stub e dello Skeleton Con il compilatore RMI (con opzione vcompat in Java 1.5): rmic [-vcompat] EchoRMIServer Che genera i file: EchoRMIServer_Stub.class EchoRMIServer_Skel.class Esecuzione 1. Avviamento del registry: rmiregistry 2. Avviamento del server: java EchoRMIServer 3. Avviamento del client: java EchoRMIClient Reti di calcolatori, Java RMI - 9 Reti di calcolatori, Java RMI - 10

Passaggio di parametri Tipo Metodo Locale Metodo Remoto Tipi primitivi Per valore Per valore Oggetti Per riferimento Per valore (deep copy) Oggetti Remoti Esportati Per riferimento Shallow Copy vs Deep Copy Per riferimento remoto Passaggio per valore => Serializable Objects Passaggio per riferimento => Remote Objects Serializable Objects Oggetti la cui locazione non è rilevante per lo stato sono passati per valore: ne viene serializzata l istanza che sarà deserializzata a destinazione per crearne una copia locale. Remote Objects Oggetti la cui funzione è strettamente legata alla località in cui eseguono (server) sono passati per riferimento: ne viene serializzato lo stub, creato automaticamente dal proxy (stub o skeleton) su cui viene fatta la chiamata in cui compaiono come parametri Serializzazione Trattamento dei parametri tra pari Marshalling: processo di codifica degli argomenti e dei risultati per la trasmissione Unmarshalling: processo inverso di decodifica di argomenti e risultati ricevuti In Java questo problema è risolto attraverso la semplice serializzazione, fatta in maniera trasparente dal supporto (copia dei dati trasformati in una sequenza e un messaggio e trasferiti tra le JVM) Serializzazione: trasformazione di oggetti complessi in semplici sequenze di byte => metodo writeobject() su uno stream di output Deserializzazione: decodifica di una sequenza di byte e costruzione di una copia dell oggetto originale => metodo readobject() da uno stream di input Utilizzo: - storage - trasmissione (parametri e valori di ritorno in RMI) Reti di calcolatori, Java RMI - 11 Reti di calcolatori, Java RMI - 12

Interazione con stream per TX/RX Esempio di storage Record record = new Record(); FileOutputStream fos = new FileOutputStream( data.ser ); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(record); FileInputStream fis = new FileInputStream( data.ser ); ObjectInputStream ois = new ObjectInputStream(fis); record = (Record)ois.readObject(); Esempio Riprendendo il server di echo messaggio come oggetto anziché come stringa public class Message implements Serializable String content; // altri eventuali campi Si possono serializzare soltanto istanze di oggetti serializzabili, ovvero che: - implementano l interfaccia Serializable - contengono esclusivamente oggetti (o riferimenti a oggetti) serializzabili NOTA BENE: NON viene trasferito l oggetto vero e proprio ma solo le informazioni che caratterizzano l istanza => no metodi, no costanti, no variabili static, no variabili transient Al momento della deserializzazione sarà ricreata una copia dell istanza trasmessa usando il.class (che deve quindi essere accessibile!!!) dell oggetto e le informazioni ricevute. public Message(String msg) content=msg; public String tostring() return content; Reti di calcolatori, Java RMI - 13 Reti di calcolatori, Java RMI - 14

Stub e Skeleton Stub e Skeleton garantiscono una parziale trasparenza e sono oggetti generati dal compilatore RMI che gestiscono il supporto RMI via serializzazione/deserializzazione e comunicazione tra client e server Procedura di comunicazione: 1. il client ottiene un istanza dello stub 2. il client chiama metodi sullo stub 3. lo stub: - crea una connessione con lo skeleton (o ne usa una già esistente) - fa la serializzazione delle informazioni per la chiamata (id del metodo e argomenti) - invia le informazioni allo skeleton 4. lo skeleton: - fa deserializzazione dei dati ricevuti - effettua la chiamata sull oggetto che implementa il server - fa serializzazione del valore di ritorno e invio allo allo stub 5. lo stub: - fa deserializzazione del valore di ritorno e restituzione del risultato al client Stub Estende java.rmi.server.remotestub Implementa java.rmi.remote InterfacciaRemotaServer (es. EchoInterface) Realizza le chiamate ai metodi dell interfaccia remota del server usando il metodo invoke( ) di java.rmi.server.remoteref public final class EchoRMIServer_Stub extends java.rmi.server.remotestub implements EchoInterface, java.rmi.remote // implementazione di getecho public Message getecho(message message) throws java.rmi.remoteexception try // creazione della chiamata java.rmi.server.remotecall remotecall = super.ref.newcall(this, operations, 0, 0xca41fff3e3260b7aL); // serializzazione dei parametri try ObjectOutput objectoutput = remotecall.getoutputstream(); objectoutput.writeobject(message); // cattura eccezioni di marshalling Reti di calcolatori, Java RMI - 15 Reti di calcolatori, Java RMI - 16

Stub segue // invio della chiamata super.ref.invoke(remotecall); // deserializzazione del valore di ritorno Message message1; try ObjectInput objectinput = remotecall.getinputstream(); message1 = (Message)objectinput.readObject(); // cattura eccezioni di unmarshalling // segnalazione chiamata andata a buon fine finally super.ref.done(remotecall); // restituzione del risultato return message1; // cattura varie eccezioni Skeleton Implementa java.rmi.server.skeleton Inoltra le richieste al server usando il metodo dispatch( ) public final class EchoRMIServer_Skel implements Skeleton public void dispatch(remote remote, RemoteCall remotecall, int opnum, long hash) throws Exception // validazione e verifica di errori EchoRMIServer echormiserver = (EchoRMIServer)remote; switch(opnum) case 0: // '\0' Message message; try // deserializzazione dei parametri di invocazione ObjectInput objectinput = remotecall.getinputstream(); message = (Message)objectinput.readObject(); catch(ioexception ioexception1) throw new UnmarshalException("error unmarshalling arguments", ioexception1); catch(classnotfoundexception classnotfoundexception) throw new UnmarshalException("error... unmarshalling arguments", classnotfoundexception); finally remotecall.releaseinputstream(); Reti di calcolatori, Java RMI - 17 Reti di calcolatori, Java RMI - 18

Skeleton segue // effettiva invocazione del metodo sul server Message message1 = echormiserver.getecho(message); try // serializzazione del valore di ritorno ObjectOutput objectoutput = remotecall.getresultstream(true); objectoutput.writeobject(message1); catch(ioexception ioexception) throw new MarshalException("error marshalling return", ioexception); break; default: throw new UnmarshalException("invalid..."); Chi genera i thread che devono operare sull oggetto server, se non lo skeleton? Questo si lega al fatto che skeleton e stub sono generati non come sorgenti, ma come class? Interazione Client/Server: Socket e Thread Client L invocazione di un metodo remoto implica una connessione TCP (Socket stream) con l oggetto remoto Condivisione delle connessioni tra la JVM client e la JVM server: richiesta di connessione per una stessa JVM - se c è una connessione aperta riuso - se non c è una connessione aperta nuova Al completamento di una operazione la connessione viene liberata e rimane attiva fino allo scadere di un intervallo di timeout RMI permette a più thread clienti di accedere ad uno stesso oggetto server gestendo in modo automatico la concorrenza delle operazioni l implementazione del cliente non deve preoccuparsi In caso di richieste da parte della stessa JVM, il canale di comunicazione unico può produrre effetti di sequenzializzazione (era ciò che accadeva nelle prime implementazioni) Reti di calcolatori, Java RMI - 19 Reti di calcolatori, Java RMI - 20

Server Dipende tutto dall implementazione. Nel seguito consideriamo una possibile e semplice implementazione concorrente. L esportazione di un oggetto remoto provoca la creazione di diversi thread per la gestione delle richieste (Server Socket) un thread che riceve le richieste (Listener Thread) associati all oggetto remoto Condivisione delle server socket e dei listener: server in esecuzione nella stessa JVM possono condividere la porta d ascolto (soluzione di default se non la specificano) e il listener che ne gestisce le richieste Ogni richiesta viene gestita da un thread che esegue la richiesta (Server Thread) Condivisione dei server thread: allocazione di un pool di thread; all accettazione di una nuova richiesta un Server Thread viene estratto ed utilizzato. E se i thread del pool vengono tutti allocati? Soluzioni possibili? In ogni caso: RMI permette a più thread di accedere ad uno stesso oggetto server (gestione concorrente delle richieste) l implementazione dei metodi remoti deve essere thread-safe RMI Registry Localizzazione del servizio: un client in esecuzione su una macchina ha bisogno di localizzare un server a cui vuole connettersi, che è in esecuzione su un altra macchina. Tre possibili soluzioni: Il client conosce staticamente dov è il server L utente dice all applicazione client dov è il server Un servizio standard (naming service) in una locazione ben nota, che il client conosce, funziona come sistema di nomi Java RMI utilizza un naming service: RMI Registry Mantiene un insieme di coppie name, reference Name: stringa arbitraria non interpretata Name Echo Daytime Login Reference Trasparenza alla locazione?!? Echo Server Login Server Daytime Server Reti di calcolatori, Java RMI - 21 Reti di calcolatori, Java RMI - 22

Operazioni Metodi della classe java.rmi.naming: public static void bind(string name, Remote obj) public static void rebind(string name, Remote obj) public static void unbind(string name) public static String[] list(string name) public static Remote lookup(string name) name -> combina la locazione del registry e il nome logico del servizio, nel formato: //registryhost:port/logical_name A default: registryhost = macchina su cui esegue il programma che invoca il metodo port = 1099 Il Registry è un server RMI in esecuzione su registryhost in ascolto su port Ognuno di questi metodi crea una connessione (socket) con il registry identificato da host e porta Implementazione del Registry Il Registry è un server RMI Classe d implementazione: sun.rmi.registry.registryimpl Interfaccia: java.rmi.registry.registry public interface Registry extends Remote public static final int REGISTRY_PORT = 1099; public Remote lookup(string name) throws RemoteException, NotBoundException, AccessException; public void bind(string name, Remote obj) throws RemoteException, AlreadyBoundException, AccessException; public static void rebind(string name, Remote obj) throws RemoteException, AccessException; public static void unbind(string name) throws RemoteException, NotBoundException, AccessException; public static String[] list(string name) throws RemoteException, AccessException; Remote è il riferimento remoto Perchè usare anche la classe Naming? Reti di calcolatori, Java RMI - 23 Reti di calcolatori, Java RMI - 24

BOOTSTRAP Problema di bootstrapping anche per localizzare il registry uso delle classi Naming e LocateRegistry Naming: metodi statici, no istanza LocateRegistry implementa i metodi public static Registry createregistry(int port) public static Registry createregistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) public static Registry getregistry() public static Registry getregistry(int port) public static Registry getregistry(string host) public static Registry getregistry(string host, int port) public static Registry getregistry(string host, int port, RMIClientSocketFactory csf) Uso del Registry Due possibilità: 1. Usare il programma rmiregistry di Sun, lanciato specificando o meno la porta: rmiregistry rmiregistry 10345 istanza separata della JVM struttura e comportamento standard 2. Creare all interno del codice un proprio registry: public static Registry createregistry(int port) stessa istanza della JVM struttura e comportamento personalizzabile (es. organizzazione gerarchica) Soluzione al bootstrapping per il registry: 1. Naming. metodo() con host e porta 1. Invocazione di LocateRegistry.getRegistry() che restituisce lo stub del registry 2. Invocazione di metodo() sullo stub Reti di calcolatori, Java RMI - 25 Reti di calcolatori, Java RMI - 26

Sicurezza del registry Problema: accedendo al registry (individuabile interrogando tutte le porte di un host) è possibile ridirigere per scopi maliziosi le chiamate ai server RMI registrati (es. list()+rebind()) Soluzione: i metodi bind(), rebind() e unbind() sono invocabili solo dall host su cui è in esecuzione il registry non si accettano modifiche della struttura client/server da nodi esterni sull host in cui vengono effettuate le chiamate al registry deve essercene almeno uno in esecuzione Organizzazione gerarchica Registry Un registry è un server RMI => è possibile registrarlo in un altro registry Registry ourregistry = LocateRegistry.createRegistry(OUR_PORT); Registry preexistingregistry = LocateRegistry.getRegistry(1099); preexixtingregistry.rebind ( secondary registry, ourregistry); Name Registro Stampanti Registro Installazioni... Primary Registry Reference Printer Registry Name Reference Postscript Pdf... Program Registry Name Reference Antivirus IDE... Ma Tutti i registry si trovano sulla stessa macchina dove è attivato il primary registry Lato client devo gestire una duplice interrogazione RMI registry non supporta in alcun modo la negoziazione dei servizi... Reti di calcolatori, Java RMI - 27 Reti di calcolatori, Java RMI - 28

Distribuzione delle classi In una applicazione RMI è necessario che siano disponibili gli opportuni file.class nelle località che lo richiedono (per l esecuzione o per la deserializzazione) Il Server deve poter accedere a: interfacce che definiscono il servizio implementazione del servizio stub e skeleton delle classi di implementazione altre classi utilizzate dal server Il Client deve poter accedere a: interfacce che definiscono il servizio stub delle classi di implementazione del servizio classi del server usati dal client (es. valori di ritorno) altre classi utilizzate dal client È necessario: 1. localizzare il codice (in locale o in remoto) 2. effettuare il download (se in remoto) 3. eseguire in modo sicuro il codice scaricato Classpath ed Esecuzione Rmiregistry, server e client devono poter accedere alle classi necessarie per l esecuzione. Si presti quindi particolare attenzione al direttorio dove vengono lanciati l rmiregistry, il server e il client In particolare, ipotizzando di avere tutti i file.class nel direttorio corrente (. ), e di lanciare rmiregistry, client, e server dal direttorio corrente, bisogna aggiungere al CLASSPATH tale direttorio Sotto Linux: ciò è possibile aggiungendo nella propria directory HOME il file ".profile" (creandolo se non esiste). In particolare, il file.profile deve contenere le seguenti linee per aggiungere il direttorio corrente al CLASSPATH: CLASSPATH=.:$CLASSPATH export CLASSPATH E se volessimo lanciare il client, il server, e l rmiregistry in direttori diversi? Si noti che questa è la modalità standard in Linux per aggiungere/modificare una variabile di ambiente. Nelle FAQ del corso, si veda anche il caso della variabile di ambiente PATH Reti di calcolatori, Java RMI - 29 Reti di calcolatori, Java RMI - 30

Localizzazione del codice Sia il cliente sia il servitore devono avere a disposizione le classi di supporto per la interazione Le informazioni relative a dove reperire il codice delle classi - se non disponibile localmente - sono memorizzate sul server e passate al client by need Utilizzo del codebase Il codebase viene usato dal client per scaricare le classi necessarie relative al server (interfaccia, stub, oggetti restituiti come valori di ritorno) server RMI mandato in esecuzione specificando nell opzione java.rmi.server.codebase l URL da cui prelevare le classi necessarie. L URL può essere: una directory del file system locale (file://) l indirizzo di un server ftp (ftp://) l indirizzo di un server http (http://) Il codebase viene usato dal server per scaricare le classi necessarie relative al client (oggetti passati come parametri nelle chiamate) Il codebase è una proprietà del server che viene annotata nel reference pubblicato sul registry Le classi vengono cercate sempre prima nel CLASSPATH locale, solo in caso di insuccesso vengono cercate nel codebase Reti di calcolatori, Java RMI - 31 Reti di calcolatori, Java RMI - 32

CODEBASE Sia il server che il client devono essere lanciati specificando il codebase che indica dove sono disponibili le rispettive classi Esempio con client e server sullo stesso host e classi in direttori diversi: java java Djava.rmi.server.codebase = file://c:\ \RMIdir\ServerDir\ EchoRMIServer Djava.rmi.server.codebase = file://c:\ \RMIdir\ClientDir\ EchoRMIClient localhost server&client_host ESEMPIO Client e Server su host diversi e classi scaricabili via http: java java Djava.rmi.server.codebase = http://server_host_name/ /RMIdir/ServerDir EchoRMIServer Djava.rmi.server.codebase = http://client_host_name/ /RMIdir/ClientDir EchoRMIClient server_host_name server_host JVM 1 RMIregistry RMIregistry JVM 2 RMI RMI Server Server client_host JVM 3 RMI RMI Client Client JVM 1 JVM 2 JVM 3 EchoRMIServer_stub EchoInterface rmiregistry rmiregistry RMI RMI Server Server RMI RMI Client Client EchoRMIServer_stub Message EchoRMIServer_stub EchoInterface Message EchoRMIServer_stub Web Web server server Web Web server server c:\ \ServerDir\ c:\ \ClientDir\ File System Reti di calcolatori, Java RMI - 33 Reti di calcolatori, Java RMI - 34

Ambienti separati e protetti Ogni JVM definisce ambienti di esecuzione differenziati e protetti per diverse parti, in particolare da remoto Si usano ClassLoader come separatori associati a SecurityManager per la specifica di protezione Download del codice Utilizzo di RMIClassLoader usato dal supporto RMI per caricare le classi Esecuzione del codice Utilizzo di RMISecurityManager Istanziato all interno dell applicazione RMI, sia client che server, come controllore degli accessi, per bloccare quelli non autorizzati if (System.getSecurityManager() == null) System.setSecurityManager( new RMISecurityManager()); Sia il server che il client devono essere lanciati specificando il file con le autorizzazioni che il security manager deve caricare Esempio java -Djava.security.policy = echo.policy EchoRMIServer java -Djava.security.policy = echo.policy EchoRMIClient remotehost FILE di POLICY Il file di policy a cui il Secutiry Manager fa riferimento per il controllo degli accessi contiene le autorizzazioni consentite Esempio: grant permission java.net.socketpermission "*:1024-65535", "connect, accept, resolve"; ; permission java.net.socketpermission "*:80", "connect"; permission java.io.filepermission "/home/lfoschini/*", "read"; Il primo permesso consente al client e al server di instaurare le connessioni necessarie all interazione remota (host qualunque, porta utente qualunque, primitive consentite) Il secondo permesso consente di prelevare il codice da un server http (host qualunque, porta 80, connect) Il terzo permesso consente di accedere in lettura ad un qualsiasi direttorio del file system locale che sia sottodirettorio di /home/lfoschini (concessa solo lettura) Reti di calcolatori, Java RMI - 35 Reti di calcolatori, Java RMI - 36

Bibliografia Sito della Sun: http://java.sun.com/products/jdk/rmi/ W.Grosso, Java RMI, Ed. O Reilly (2002) E. Pitt, K. McNiff, java.rmi, The Remote Methode Invocation Guide, Ed. Addison Wesley (2001) R. Öberg, Mastering RMI, Developing Enterprise Applications in Java and EJB, Ed. Wiley (2001) Reti di calcolatori, Java RMI - 37