Java RMI (Remote Method Invocation)
Diamo un attimo uno sguardo ad una delle tecnologie che SUN offre per implementare software di rete.
RMI è l’acronimo di Remote Method Invocation ed è uno dei modi che Java offre nativamente per utilizzare oggetti remoti. Vediamo quindi come RMI funziona.
Come potete vedere abbiamo due diverse entità, client e server. Il client conosce soltanto l’interfaccia del servizio, mentre la vera e propria implementazione è disponibile sul server. Con RMI è possibile avere un vero e proprio riferimento all’oggetto remoto, nonostante questo sia presente su una JVM diversa dalla nostra.
In questo modo è possibile progettare in maniera distribuita un’applicazione, spezzettando la logica in diversi componenti distribuiti. Vediamo quindi le diverse fasi per sviluppare un’applicazione standard utilizzando RMI.
Registrazione del server
Prima di tutto dobbiamo definire l’interfaccia remota che il client conoscerà.
1 2 3 4 5 6 |
import java.rmi.Remote; import java.rmi.RemoteException; public interface CalcolatriceServer extends Remote { int addizione(int a,int b) throwsRemoteException; } |
Ora dobbiamo scrivere una classe che implementa questa interfaccia.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.rmi.*; import java.rmi.server.*; public class CalcolatriceServerImpl extends UnicastRemoteObject implements CalcolatriceServer{ public CalcolatriceServerImpl() throwsRemoteException{ super(); } public int addizione(int a,int b) throwsRemoteException{ return a+b; } } |
Adesso dobbiamo compilare questi due file utilizzando javac. Dopo aver fatto ciò dobbiamo utilizzare il comando rmic, presente nella cartella bin del SDK standard di Java. Questo compilatore crea lo stub e lo skeleton relativi alla nostra classe.
Lo stub è quello che viene utilizzato dal client, mentre lo skeleton dal server. Per completare l’inizializzazione lato server dobbiamo far partire rmiregistry ovvero il registro che permette di collegare istanze di oggetti Java per i client remoti.
1 2 3 |
C:\> start rmiregistry (l'eseguibile è sempre disponibile nella cartella bin dell'SDK della SUN). |
Ora rimane da effettuare il vero e proprio bind del nostro oggetto.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import java.rmi.*; import java.rmi.server.*; public class Registrazione{ public static void main(String args[]) { try{ CalcolatriceServerImpl obj= new CalcolatriceServerImpl(); Naming.rebind("calcolatrice", obj); } catch (Exception e) { e.printStackTrace(); } } } |
Dal punto di vista del server abbiamo fatto tutto. Ora passiamo al client
Client
Nel client dobbiamo avere a disposizione lo stub che abbiamo creato nella fase precedente. Per fare ciò dobbiamo semplicemente copiarlo nel CLASSPATH del client. Procediamo quindi alla vera e propria chiamata.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.rmi.Naming; import java.rmi.RemoteException; public class CalcolatriceClient { public static void main(String[] arg){ try { CalcolatriceServer obj =(CalcolatriceServer) Naming.lookup("rmi://ip/calcolatrice"); int risultato = obj.addizione(1,1); System.out.println("1+1="+risultato); } catch (Exception e){ e.printStackTrace(); } } } |
Ecco quindi completato il nostro breve esempio. Chiaramente l’utilizzo di RMI và ben oltre far 1+1, però come esempio iniziale dovrebbe aver reso bene l’idea. Infatti pensando oltre questo banale esempio potremmo costruire un’architettura di chat su RMI o altri programmini sfiziosi.
Buon divertimento 🙂