|
RMI consente di gestire un oggetto remoto, ed è una sorta di client/server
trasparente: infatti invece di definire un protocollo e una codifica dei dati
per far comunicare client e server, sul server “gira” un oggetto che viene
“pilotato” dal client, invocando i suoi metodi. Il passaggio dei paramatri
e il ritorno di risultati avviene utilizzando la serializzazione, che consente
di scrivere e rileggere da uno stream un qualsiasi oggetto Java che supporti
la serializzazione. Per prima cosa dobbiamo prendere un oggetto che vogliamo
gestire da remoto, e suddividerlo in una interfaccia e una implementazione.
L’interfaccia descrive l’oggetto dal punto di vista del client, mentre l’implementazione
è l’oggetto effettivo che gira sul server. In realtà l’interfaccia è una istanza
di uno stub che si trova sul client (istanziata quando viene aperta la connessione)
la quale comunica con uno skel che gira sul server e invoca effettivamente
i metodi dell’implementazione. Rimando ad un articolo introduttivo su RMI
per meglio chiarire questa architettura. Quello che dobbiamo fare in pratica
è definire l’interfaccia della nostra funzione di inversione:
package reverse;
public interface Reverse
extends java.rmi.Remote
{
public String reverse(String s)
throws java.rmi.RemoteException;
}
Notiamo subito due cose: innanzitutto dobbiamo implementare java.rmi.Remote.
Si tratta di una interfaccia la cui definizione è vuota. Come in altri casi
simili (come java.io.Serializable) questa interfaccia serve da marcatore,
che consente di dichiarare che una classe supporta una determinata caratteristica.
In questo caso il programmatore specifica che l’interfaccia è utilizzabile
per accedere ad un oggetto remoto. Una altra cosa da notare è che tutti i
metodi sollevano una eccezione speciale, RemoteException, in grado di propagarsi
attraverso la rete, trasportando eventuali eccezioni che si sono verificate
sul server.
|