Remote Method Invocation Perché RMI? L’obiettivo è di permettere ad una applicazione in esecuzione su una macchina locale di invocare i metodi di un oggetto.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Java base V: La gestione delle Eccezioni
Costruttori e Distruttori
Recupero debito quarto anno Primo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Java2 Esercitazioni del corso di Sistemi Informativi Marina Mongiello
Fondamenti di Informatica
Come programmare servizi di rete?
2 luglio 2006URM2 – ING- OOP0304 OL G. Cantone e A. Lomartire 1 Programmazione Orientata agli Oggetti Processi, task e thread Java (ed esempi) Università
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Introduzione al linguaggio Java
Derivazione tra classi
Overriding.
Perché.Net e non più COM/DCOM ? Superamento dei problemi di COM: Richiede una infrastruttura "non semplice" da ogni applicazione (ad esempio Class Factory.
Gestione di Progetti Software 2 (A.A. 2004/2005) - Lezione 2 1 JAVA: obiettivi di progetto del linguaggio Nota storica: Il linguaggio JAVA (inizialmente.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Ingegneria del software I
La Riflessione computazione Elisa Ferrando. Cos è la Riflessione La Riflessione Sistema riflessivo Sistema computazionale.
Approfondimento delle classi
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Sistemi Operativi GESTIONE DEI PROCESSI.
Java base IV: Java e la programmazione O.O.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Progetto di una architettura per lesecuzione distribuita e coordinata di azioni Progetto per lesame di Reti di Calcolatori L-S Prof. Antonio Corradi Finistauri.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Programmazione in Java (9) Mauro Lorenzutti. 30/09/2005Corso Java - Mauro Lorenzutti2 Scaletta I/O Evoluto Serializzazione Comunicazioni via socket JUnit.
Cosa è una applicazione distribuita?
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
Java Remote Method Invocation (RMI)
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
1 Applet ed HTML Fondamenti di Informatica Corso D.
I metodi F. Bombi Campi e metodi Abbiamo visto che una classe può contenere – Campi – Metodi stato I campi sono utilizzati per memorizzare.
Laboratorio di Servizi Web - servlet - Ardissono 1 Java Servlet API package javax.servlet: include classi e interfacce di gestione di servlet indipendenti.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
© Copyright NTT DATA Italia – All Rights Reserved The information contained in this document is the property of NTT DATA Italia S.p.A. and the addressee.
Gestione dei thread in Java
TW Asp - Active Server Pages Nicola Gessa. TW Nicola Gessa Introduzione n Con l’acronimo ASP (Active Server Pages) si identifica NON un linguaggio di.
Producer – Consumer System Di Carlo Matteo CdLS Ingegneria Informatica (0234) Reti di Calcolatori LS A.A. 2004/2005.
Supporto per la replicazione attiva di servizi Progetto per il corso di Reti di Calcolatori LS Montanari Mirko Matr:
Remote Method Invocation Perché RMI? L’obiettivo è di permettere ad una applicazione in esecuzione su una macchina locale di invocare i metodi di un oggetto.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Java & JESS Ettore Colombo 10 Gennaio 2007 Ingegneria della Conoscenza e Sistemi Esperti.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Cose nuove di Java (prima a chiacchiera, poi formalmente)
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Alex Marchetti Infrastruttura di supporto per l’accesso a un disco remoto Presentazione del progetto di: Reti di calcolatori L-S.
La Programmazione ad Oggetti
Fondamenti di informatica T-A Esercitazione 3 : Classi, metodi, visibilità, metodi statici AA 2012/2013 Tutor : Domenico Di Carlo.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
13/08/02Input 1 Interagire con il computer Da tastiera Da riga di comando Funzioni di conversione.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Programmazione orientata agli Oggetti Introduzione a Java.
Socket programming in Java La realizzazione di un server in Java consente di scrivere una sola versione eseguibile su diverse piattaforme. Il linguaggio.
Gestire i dati: download e salvataggio. L’importanza dei dati La quasi totalità delle applicazioni hala necessità di gestire varie funzionalità relative.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Socket programming in Java La realizzazione di un server in Java consente di scrivere una sola versione eseguibile su diverse piattaforme. Il linguaggio.
Transcript della presentazione:

Remote Method Invocation Perché RMI? L’obiettivo è di permettere ad una applicazione in esecuzione su una macchina locale di invocare i metodi di un oggetto in esecuzione su un altro computer remoto. Si colloca quindi del mondo della programmazione distribuita. Si definisce client il programma chiamante che ottiene riferimento all’oggetto remoto, server il programma che crea gli oggetti remoti. Tali applicazioni sono anche denominate distributed object application Nicola Gessa

Quali vantaggi? miglioramento delle prestazione complessive semplicità nella gestione delle risorse distribuite incremento della potenza operativa es: suddivisione di una computazione pesante in sottoroutine più piccole, eseguite tutte su macchine diverse diminuendo in tal modo il tempo complessivo di esecuzione

Sistema distribuito…. …. quindi si deve disporre di un meccanismo di comunicazione Java implementa il meccanismo dei socket in maniera semplice e risolve il problema di come instaurare la connessione ma coi socket... non definisce le modalità di invocazione di metodi non definisce protocolli per lo scambio di informazioni

Caratteristiche di RMI Utilizzando la libreria RMI di Java è possibile per un oggetto in esecuzione su una JVM di richiedere l’esecuzione di un metodo di un oggetto in esecuzione su un’altra JVM RMI richiede l’utilizzo esclusivo di Java come linguaggio di sviluppo -> difficile integrazione con altri linguaggi semplicità e velocità nello sviluppo meno potenzialità e scalabilità Dynamic Code Loading:possibilità di scaricare il bytecode di una classe se la classe non è definita nella virtual machine del ricevente, mantenendo la definizione dei tipi e il loro “comportamento”. In questo modo una applicazione può estendere le sue funzionalità ricevendo delle nuove classi da utilizzare durante l’esecuzione.

La serializzazione Il meccanismo alla base utilizzato da RMI per la trasmissione dei dati fra client e server è quello della serializzazione che permette il flusso di dati complessi all’interno di stream (può venir usata indipendentemente da applicazioni RMI) La serializzazione consiste nella trasformazione automatica di oggetti e strutture in sequenze di byte manipolabili coi vari stream del package java.io Gli stream sono associabili sia a socket che a file es: Record record = new Record() ObjectOutputStream oos = new ObjectOutputStream(myos) oos.writeObject(record);

La serializzazione Un oggetto è serializzabile se implementa l’interfaccia Serializable Si possono serializzare oggetti con struttura e complessità arbitraria, senza particolari differenze, a patto che l’oggetto si serializzabile (implementi l’interfaccia Serializable) es: public class Record implements Serializable{ private String Nome; public Record(String Nome){ this.Nome = Nome }

La serializzazione La serializzazione è ricorsiva ( un oggetto serializzabile deve contenere oggetti serializzabili) La maggior parte delle classi del JDK è serializzabile (eccetto alcune che adottano strutture dati binarie dipendenti dall piattaforma)

Architetture di RMI La struttura di un’applicazione RMI è organizzata in strati orizzontali sovrapposti RMI Client Stubs Remote Reference Layer Transport Layer RMI Server Skeleton Remote Reference Layer Transport Layer Simuazione locale sul client Oggetto reale eseguito sul server Java Virtual Machine Connessione fisica Connessione virtuale

Architetture di RMI Lo strato più alto è costituito da applicazioni (client e server) eseguite dalla Java Virtual Machine Lo stub e lo skeleton forniscono la rappresentazione dell’oggetto remoto: lo stub gestisce la simulazione locale sul client e agendo come proxy consente la comunicazione con l’oggetto remoto, lo skeleton ne consente l’esecuzione sul server Il client esegue i metodi dell’oggetto remoto in modo del tutto analogo alla chiamata locale: ris = OggettoRemoto.nomeMetodo(par1, par2,..) senza preoccuparsi dei dettagli della comunicazione Il client ha solo in minima parte la sensazione di usare un oggetto remoto

Passaggio di parametri Percorso dei parametri Serializzati dalla Virtual Machine Inviati sotto forma di stream al server Deserializzati del server che li utilizza all’interno del corpo del metodo invocato Il risultato segue il percorso inverso fino ad arrivare al client

Gli strati RRL e TL Il Remote Reference Layer (RRL) ha il compito di instaurare un connessione virtuale fra il client e il server ( esegue operazioni di codifica e decodifica dei dati). Questo adotta un protocollo generico e indipendente dal tipo di stub o skeleton utilizzato Il Transport Layer esegue la connessione vera e propria tra le macchine utilizzando le specifiche standard di networking di Java, e quindi i socket con il protocollo TCP/IP Si occupano della gestione “a basso livello” ( all’interno dell’architettura RMI) della comunicazione

Il Transport Layer Il TL è responsabile del controllo dello stato delle vari connessioni I dati vengono visti come sequenze di byte da inviare o da leggere IL TL si incarica di localizzare il server RMI relativo all’oggetto remoto richiesto Esegue la connessione per mezzo di un socket

Security manager La possibilità di scaricare codice è controllata e regolata da un security manager che opera in accordo ad una policy Il client e il server devono essere eseguiti con una policy adeguata alle loro esigenze e alle esigenze di sicurezza del sistema specificando il parametro –Djava.security.policy=java.policy al momento del lancio dell’esecuzione. Java.policy è il nome del file dove viene specificata la politica di sicurezza.

I file java.policy Esempi di tali file possono essere: grant { permission java.security.AllPermission; }; grant { permission java.net.SocketPermission “*: ”, “connect,accept”; permission java.net.SocketPermission “*:80”, “connect”; };

Programmare con RMI Le classi e i metodi sono contenuti nei package java.rmi e java.rmi.server Si definisce oggetto remoto un oggetto che implementi l’interfaccia Remote i cui metodi possono essere eseguiti da un‘applicazione client posta su un’altra macchina virtuale Un oggetto diventa remoto se implementa un’interfaccia remota, ossia un’interfaccia che estende l’interfaccia java.rmi.Remote

Le classi di oggetti remoti Una classe può implementare un numero a piacere di interfacce remote. Una classe può estendere una classe che implementa una interfaccia remota. Una classe può definire anche dei metodi che non fanno parte delle interfacce remote e che pertanto sono chiamabili solo in locale La classe deve supportare accessi concorrenti perché più client potrebbero usarla contemporaneamente. (Bisogna usare metodi/blocchi synchronized dove serve)

Client e server in RMI? Sia il “client” che il “server” di una applicazione possono allocare degli oggetti remoti ed esportarli con un nome sul registry oppure possono passarli come parametri di altri oggetti remoti. Dal punto di vista del singolo oggetto remoto il server è chi lo alloca e lo esporta mentre il client è chi richiede un riferimento ad un oggetto remoto. In definitiva quindi con RMI tutte le parti di una applicazione distribuita possono agire sia come client che come server.

Come trasformare un oggetto in un oggetto remoto? public class MyServer{ public String concat(String a, String b){ return a+b; } public interface MyServerInterface extend Remote{ public String concat (String a, String b)throws RemoteException; } public class MyServerImpl implements MyServerInterface extends UnicastRemoteObject{ public MyServerImpl() throws RemoteException{} public String concat (String a, String b)throws RemoteException{ return a+b;} } Oggetto “classico” Corrispettiva implementazione remota

Hello World con RMI Scrivere l’intefaccia dell’oggetto remoto : Hello.java Scrivere il client che richiede l’accesso all’oggetto remoto : HelloClient.java Scrivere il server che implementa l’interfaccia e la rende accessibile : HelloImpl.java da cui in seguito generare stub e skeleton

Hello World con RMI - l’interfaccia L’interfaccia remota deve dichiarare tutti i metodi che si vuole poter richiamare in maniera remota –deve essere dichiarata public –deve estendere l’interfaccia java.rmi.Remote –ogni metodo deve dichiarare java.rmi.RemoteException nella sezione throws per proteggere l’applicazione da anomalie derivanti dall’utilizzo di risorse remote //l’interfaccia dell’oggetto remoto package hello; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote{ String sayHello() throws RemoteException; }

Implementazione dell’oggetto remoto deve implementare almeno un’interfaccia remota deve definire i costruttori dell’oggetto remoto deve fornire l’implementazione dei metodi invocati da remoto creare e installare il security manager creare una o più istanza dell’oggetto identificare e registrare l’istanza dell’oggetto con un nome nel rmiregistry

Implementare l’interfaccia remota public class HelloImpl extends UnicastRemoteObject implements Hello{ dichiara che implementa l’intefaccia Hello ( con tutti i sui metodi) estende la classe UnicastRemoteObject per consentire la creazione di un oggetto remoto che adotta i protocolli di comunicazione di default di RMI basata sui socket e TCP rimane costantemente attivo

Definire i costruttori il metodo super() chiama il costruttore della classe UnicastRemoteObject che esegue le inizializzazioni necessarie per consentire di rimanere in attesa (listen) di richieste remote su una porta e poterle gestire (accept) potrebbe generare l’eccezione RemoteException se la connessione non fosse possibile public HelloImpl()throws RemoteException{ super(); }

Implementazione dei metodi remoti devono essere implementati tutti i metodi dell’interfaccia gli argomenti dei metodi e i risultati restituiti devono essere oggetti serializzabili public String sayHello(){ return "Hello World"; }

Il security manager Il metodo main deve creare e installare un security manager, che può essere il RMISecurityManager o definito in altro modo Il S.M. garantisce che le classi che vengono caricate non eseguano operazioni per le quali non siano abilitate se il S.M non è specificato non è permesso nessun caricamento di classi da parte sia del client ( stub ) che del server if(System.getSecurityManager() == null){ System.setSecurityManager(new RMISecurityManager()); } Chi garantisce che il codice scaricato da remoto non esegua operazioni pericolose?

Istanziare gli oggetti remoti Nel metodo main si devono creare una o più istanze dell’oggetto che fornisce il servizio Una volta creato, l’oggetto è pronto per accettare richieste remote HelloImpl obj = new HelloImpl();

Registrare l’oggetto remoto Naming.rebind("//localhost/HelloServer",obj); Il client deve poter ottenere un riferimento all’oggetto remoto: RMI fornisce un registry degli oggetti per creare un’associazione (bind) fra un nome URL-formatted e un oggetto l’RMI registry è un name-service che consente ai client di ottenere riferimenti agli oggetti: una volta registrato l’oggetto i client possono farne richiesta attraverso il nome e invocarne i metodi nessun protocollo deve essere specificato nel primo argomento la porta di default su cui risponde il RMIregistry è la 1099, ma può essere cambiata

Registrare l’oggetto remoto Un applicazione puo’ creare un’associazione solo sul RMIregistry del host locale I client possono invece eseguire la propria ricerca di oggetti su qualunque host L’operazione di registrazione può generare varie eccezioni –AlreadyBoundException, se il nome logico è gia utilizzato –MalformedURLException, per errori nella sintassi dell’URL –RemoteException negli altri casi

// implementazione dell’oggetto remoto package hello; import java.rmi.RemoteException; import java.rmi.Naming; import java.rmi.server.UnicastRemoteObject; import java.rmi.RMISecurityManager; public class HelloImpl extends UnicastRemoteObject implements Hello{ public HelloImpl()throws RemoteException{ super(); } public String sayHello(){ return "Hello World"; } public static void main(String args[]){ if(System.getSecurityManager() == null){ System.setSecurityManager(new RMISecurityManager()); } try { HelloImpl obj = new HelloImpl(); Naming.rebind("//localhost/HelloServer",obj); System.out.println("Hello Server bound in registry"); }catch(Exception e){ System.out.println("HelloImpl err: "+e.getMessage()); }}}

Un client per richiamare gli oggetti remoti Deve ottenere un riferimento all’oggetto remoto che vuole richiamare dal RMIregistry eseguito sul server, utilizzando un’istanza dello stub a cui passare hostname ( ed eventualmente porta) e nome dell’oggetto obj= (Hello)Naming.lookup("//localhost/HelloServer"); Richiama i metodi dell’oggetto secondo la sintassi solita message= obj.sayHello();

// il client per richiamare l’oggetto remoto Hello import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; public class HelloClient{ public static void main(String args[]) { String message=""; Hello obj=null; if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { obj = (Hello)Naming.lookup("//localhost/HelloServer"); message= obj.sayHello(); System.out.println(message); } catch (Exception e) { System.err.println("Hello Server exception: " + e.getMessage()); e.printStackTrace(); }

Compilazione ed esecuzione Compilare i file.java col javac per creare i file.class Generare stub e skeleton col comando rmic sul file che contiene l’implementazione dell’oggetto remoto (HelloImpl.class) rmic hello.HelloImpl questo genera i file HelloImpl_Stub.class e HelloImpl_Skel.class Lanciare in background sul server l’RMIregistry col comando rmiregistry &. Questo utilizza per default la porta 1099; per utilizzarne un’altra specificarla come parametro (es. rmiregistry 2001 &). Ogni volta che viene modificata un’interfaccia remota deve essere rieseguito Lanciare il server Lanciare il client

Compilazione ed esecuzione Compilare i file.java col javac per creare i file.class Generare stub e skeleton col comando rmic sul file che contiene l’implementazione dell’oggetto remoto (HelloImpl.class) rmic hello.HelloImpl questo genera i file HelloImpl_Stub.class e HelloImpl_Skel.class Lanciare in background sul server l’RMIregistry col comando rmiregistry &. Questo utilizza per default la porta 1099; per utilizzarne un’altra specificarla come parametro (es. rmiregistry 2001 &). Ogni volta che viene modificata un’interfaccia remota deve essere rieseguito Lanciare il server Lanciare il client javac hello\Hello.java javac HelloClient.java javac hello\HelloImpl.java rmic hello.HelloImpl rmiregistry & java -Djava.security.policy=java.policy hello.HelloImpl java -Djava.security.policy=java.policy HelloClient

Esempio sulla concorrenza:l’oggetto remoto Creiamo un’interfaccia remota che consenta di incrementare un valore è proviamo a chiamarla da client diversi. Cosa succede? Se vogliamo proteggere parti di codice dei metodi degli oggetti remoti da accessi concorrenti pericolosi dobbiamo definire questo codice all’interno di blocchi synchronized

Esempio sulla concorrenza:l’oggetto remoto package ValNumero; import java.rmi.Remote; import java.rmi.RemoteException; public interface newValNumero extends Remote{ int getValore() throws RemoteException; int setValore(int i) throws RemoteException; int incValore() throws RemoteException; } synchronized public int incValore() { int j; //val++; funziona senza gestire la concorrenza con synchronized! j=this.getValore(); this.setValore(j+1); return 1; } Implementazione del metodo che incrementa il valore

Esempio:Implementare un Compute Engine Un compute engine è un oggetto remoto che consente ad un server di ricevere dei task dai client, eseguirli e restituire il risultato. Il task viene definito dal client ma viene eseguito sulla macchina del server. Il task può variare indipendentemente dal server, l’importante è che rispetti una determinata interfaccia Il compute engine scarica dal client il codice del task e lo esegue all’interno della propria Java virtual machine

Interfacce utilizzate Per implementare un compute engine servono due interfacce L’interfaccia Compute, che consenta ai client di inviare task all’engine L’interfaccia Task, che consenta all’engine di eseguire i task

Interfaccia Compute package compute; import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote { Object executeTask(Task t) throws RemoteException; } Questa intefaccia definisce i metodi che possono essere chiamati da altre virtual machine. Gli oggetti che implementano questa interfaccia diventano oggetti remoti.

Interfaccia Task package compute; import java.io.Serializable; public interface Task extends Serializable { Object execute(); } Questa interfaccia è usata come argomento nel metodo executeTask dell’interfaccia Compute (definito precedentemente) e fornisce al Compute Engine il meccanismo per eseguire il task. Non è un interfaccia remota, quindi non è associata ad oggetti remoti. Il metodo execute deve essere presente in ogni implementazione di questa interfaccia.

//oggetto remoto per l’esecuzione dei task package engine; import java.rmi.*; import java.rmi.server.*; import compute.*; public class ComputeEngine extends UnicastRemoteObject implements Compute { public ComputeEngine() throws RemoteException { super(); } public Object executeTask(Task t) { return t.execute(); } // metodo main } Implementazione del Compute Engine

public static void main(String[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } String name = "//host/Compute"; try { Compute engine = new ComputeEngine(); Naming.rebind(name, engine); System.out.println("ComputeEngine bound"); } catch (Exception e) { System.err.println("ComputeEngine exception: ” + e.getMessage()); } Metodo main del ComputeEngine

package client; import java.rmi.*; import java.math.*; import compute.*; public class ComputePi { public static void main(String args[]) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMIS...()); } try { String name = "//" + args[0] + "/Compute"; Compute comp = (Compute) Naming.lookup(name); Pi task = new Pi(Integer.parseInt(args[1])); BigDecimal pi = (BigDecimal) (comp.executeTask(task)); System.out.println(pi); } catch (Exception e) { System.err.println("ComputePi exception: " + e.getMessage()); }}} Implementazione del client

Implementazione dell’interfaccia Task package client; import compute.*; import java.math.*; public class Pi implements Task { /** costante usata nel calcolo di pi */ private static final BigDecimal ZERO = BigDecimal.valueOf(0); /** **/ public Pi(int digits) { this.digits = digits; } /*** Calcola pi.*/ //Poiché implementa l’interfaccia Task deve esserci questo public Object execute() { return computePi(digits); } public static BigDecimal computePi(int digits) { }

Riassunto degli elementi necessari Due interfacce : –compute.java –task.java Il server che implementa l’interfaccia compute e comprende il metodo main per l’esecuzione: ComputeEngine.java L’implementazione del task da far eseguire: Pi.java Il client che richiede l’esezuzione del task al server: ComputePi.java In più vengono generati i file per lo stub e lo skeleton: ComputeEngine_stub.java ComputeEngine_skel.java