Inscripción de Salas

Código

Interfaz Remota

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; }
Clase Remota

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. } }
Servidor

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(); } }
Compilación y Ejecución del 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
Cliente

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(); } }
Compilación y Ejecución del Cliente

Por parte de cliente y si todo está corriendo bien la compilación y ejecución son las normales.

javac *.java java Cliente

Diagramas

Documentación

Fuentes

Binarios