Rmi

RMI

RMI (Java Remote Method Invocation) es un mecanismo ofrecido en Java para invocar un método remotamente. Al ser RMI parte estándar del entorno de ejecución Java, usarlo provee un mecanismo simple en una aplicación distribuida que solamente necesita comunicar servidores codificados para Java. Si se requiere comunicarse con otras tecnologías debe usarse CORBA o SOAP en lugar de RMI.

Por medio de RMI, un programa Java puede exportar un objeto. A partir de esa operación este objeto está disponible en la red, esperando conexiones en un puerto TCP. Un cliente puede entonces conectarse e invocar métodos. La invocación consiste en el "marshalling" de los parámetros (utilizando la funcionalidad de "serialización" que provee Java), luego se sigue con la invocación del método (cosa que sucede en el servidor). Mientras esto sucede el llamador se queda esperando por una respuesta. Una vez que termina la ejecución el valor de retorno (si lo hay) es serializado y enviado al cliente. El código cliente recibe este valor como si la invocación hubiera sido local.

Metas del Sistema RMI de Java

Las metas que se pretenden alcanzar al soportar objetos distribuidos en Java, son:

* Proporcionar invocación remota de objetos que se encuentran en MVs diferentes.

* Integrar el modelo de objetos distribuidos en el lenguaje Java de una manera natural, conservando en medida de lo posible la semántica de los objetos Java.

* Hacer tan simple como sea posible la escritura de aplicaciones distribuidas.

* Preservar la seguridad proporcionada por el ambiente Java.

* Proporcionar varias semánticas para las referencias de los objetos remotos (persistentes, no persistentes y de "activación retardada" ). En este se describen los modelos de seguridad que implementan los sistemas en tiempo de ejecución Java.

Una aplicación servidora que utiliza RMI, generalmente crea cierto número de objetos remotos, permite que se creen referencias a dichos objetos y espera a que algún cliente invoque de manera remota los métodos de dichos objetos. Una aplicación cliente típica obtiene referencias de uno o más objetos remotos, e invoca sus métodos por medio del sistema RMI de Java, el que se encarga de proporcionar los mecanismos mediante los cuales, tanto clientes como servidores, pueden comunicarse.

¿Qué cosas tenemos que hacer?

* InterfaceRemota. Es una interface java con todos los métodos que queramos poder invocar de forma remota, es decir, los métodos que queremos llamar desde el cliente, pero que se ejecutarán en el servidor.

* ObjetoRemoto. Es una clase con la implementación de los métodos de InterfaceRemota. A esta clase sólo la ve el servidor de rmi.

* ObjetoRemoto_Stub. Es una clase que implementa InterfaceRemota, pero cada método se encarga de hacer una llamada a través de red al ObjetoRemoto del servidor, esperar el resultado y devolverlo. Esta clase es la que ve el cliente y no necesitamos codificarla, java lo hace automáticamente para nosotros a partir de ObjetoRemoto.

En el pc/máquina servidor de rmi deben correr dos programas

•rmiregistry. Este es un programa que nos proporciona java (está en JAVA_HOME/bin, siendo JAVA_HOME el directorio en el que tengamos instalado java). Una vez arrancado, admite que registremos en él objetos para que puedan ser invocados remotamente y admite peticiones de clientes para ejecutar métodos de estos objetos.
•Servidor. Este es un programa que debemos hacernos nosotros. Debe instanciar el ObjetoRemoto y registrarlo en el rmiregistry. Una vez registrado el ObjetoRemoto, el servidor no muere, sino que queda vivo. Cuando un cliente llame a un método de ObjetoRemoto, el código de ese método se ejecutará en este proceso.

En el pc/máquina del cliente debe correr el programa

•Cliente. Este programa debemos hacerlo nosotros. Pide al rmiregistry del pc/máquina servidor una referencia remota al ObjetoRemoto. Una vez que la consigue (en realidad obtiene un ObjetoRemoto_Stub), puede hacer las llamadas a sus métodos. Los métodos se ejecutarán en el Servidor, pero Cliente quedará bloqueado en cada llamada hasta que Servidor termine de ejecutar el método.


import java.rmi.*;

public class Servidor
{
public Servidor() {
try
{

System.setProperty("java.rmi.server.codebase","file:/C:/Users/Jonatan/Documents/rmi/");

InterfaceRemota objetoRemoto = new ObjetoRemoto();
Naming.rebind ("//localhost/ObjetoRemoto", objetoRemoto);

}
catch (Exception e)
{
e.printStackTrace();
}
}

public static void main(String[] args) {
new Servidor();
}
}


import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class ObjetoRemoto extends UnicastRemoteObject implements InterfaceRemota
{

public ObjetoRemoto () throws RemoteException
{
super();
}

public int suma(int a, int b)
{
System.out.println ("Sumando " + a + " + " + b +"…");
return a+b;
}

}


import java.rmi.*;
import java.io.Serializable;

public interface InterfaceRemota extends Remote
{
public int suma (int a, int b) throws RemoteException;
}


import java.rmi.*;

public class Cliente {

public Cliente()
{
try
{

InterfaceRemota objetoRemoto = (InterfaceRemota)Naming.lookup ("//localhost/ObjetoRemoto");

System.out.print ("2 + 3 = ");
System.out.println (objetoRemoto.suma(2,3));
}
catch (Exception e)
{
e.printStackTrace();
}
}

public static void main(String[] args) {
new Cliente();
}

}

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License