Código
Lo primero para implementar una aplicación remota es definir una interfaz que describa cuales metodos estan disponibles para su ejecucion en el servidor y cual podria ser su posible retorno o exception.
import java.rmi.*;
public interface InterfazRemota extends Remote {
public void Metodo1() throws java.rmi.RemoteException;
public int Metodo2() throws java.rmi.RemoteException;
}
El segundo paso es crear una clase que implemente la interfaz anterior teniendo en cuenta que los metodos que se adieran a los por la interfaz definidos, no podran ser accedidos remotamente.
import java.rmi.server.*;
import java.rmi.*;
public class ClaseRemota
extends UnicastRemoteObject
implements InterfazRemota {
public ClaseRemota() throws RemoteException {
// Código del constructor
}
public void Metodo1() throws RemoteException {
// Aquí ponemos el código que queramos
System.out.println("Estoy en miMetodo1()");
}
public int Metodo2() throws RemoteException {
return 5; // Aquí ponemos el código que queramos
}
public void otroMetodo() {
// Si definimos otro método, éste no podría llamarse
// remotamente al no ser pertenecer a la interfaz remota.
}
}
Por último la clase remota debe ser agregada a un "DNS" desarrollado para RMI llamado rmiregistry. Este paso fue agregado en una clase aparte ya que se pueden inscribir mas de una clase por aplicacion e incluso se pueden inscribir varias instancias de una misma clase bajo distintos nombres.
import java.rmi.Naming;
public class Servidor {
public Servidor() {
try {
IterfazRemota remoto = new ClaseRemota();
// En la proxima linea deben ir la IP y puerto
// donde esté funcionando el rmiregisry. En este
// caso se uso el host local y el puerto por
// omisión de rmitregistry. Ademas se puede
// elegir arbitrariamente el nombre con que se
// quiere registrar.
Naming.rebind("rmi://localhost:1099/CR1", remoto);
}
catch (Exception e) {
System.out.println("Problema: " + e);
}
}
public static void main(String args[]) {
new Servidor();
}
}
Una vez que el servidor está completo se compila de la forma usual pero una vez echo esto se debe ejecutar la herramiente rmic con la o las clases remotas como argumento, esto generará una clase Stub y una clase Squel (esto varía de versión a versión de java). Finalmente se debe correr en background el demonio de registro RMI
javac *.java
rmic ClaseRemota
rmiregistry PUERTO
java Servidor
En Windows el registro se corre con la linea:
start rmiregistry PUERTO
La implementación del Cliente es casi transparente, lo único que se debe saber es que maquina esta corriendo el rmiregistry.
import java.net.MalformedURLException;
import java.rmi.*;
public final class Cliente {
public Cliente() {
try {
// En la proxima linea deben ir la IP y puerto
// donde esté funcionando el rmiregisry. En este
// caso se uso el host local y el puerto por
// omisión de rmitregistry. El nombre sin embargo
// que uno debe buscar es el nombre con que el
// servidor registró la clase.
IterfazRemota remoto = (IterfazRemota)
Naming.lookup("rmi://localhost:2001/CR1");
}
catch (MalformedURLException murle) {
System.out.println("Problema: " + murle);
}
catch (RemoteException re) {
System.out.println("Problema: " + re);
}
catch (NotBoundException nbe) {
System.out.println("Problema: " + nbe);
}
}
public static void main(final String[] args) {
new Cliente();
}
}
Por parte de cliente y si todo está corriendo bien la compilación y ejecución son las normales.
javac *.java
java Cliente