Вы находитесь на странице: 1из 8

Tecnologa RMI

(Invocacin de Mtodos Remotos)


RMI (Remote Method Invocation) es un mecanismo que permite realizar llamadas a mtodos de
objetos remotos situados en distintas (o la misma) mquinas virtuales de Java, compartiendo as
recursos y carga de procesamiento a travs de varios sistemas.
RMI es un ideal recurrente en tecnologas de Orientacin a Objetos: hacer que un objeto invoque a
otro objeto remoto con independencia de la JVM o el servidor en el que se encuentra, como si fuera un
objeto local. Transparencia respecto a la mquina.
Un concepto fundamental es que el cliente slo puede invocar al objeto remoto a travs de su
interfaz remota. La interfaz remota es el "escaparate" del objeto remoto, es el modo en que el objeto
remoto "exporta" sus servicios. Aquello a lo que el cliente accede est en el interfaz del objeto
remoto. Lo que no significa que el objeto remoto no tenga otros mtodos, claro que puede tenerlos;
pero slo los mtodos que estn en su interfaz son invocados por el cliente.
Arquitectura RMI

La primera capa es la de aplicacin y se corresponde con la implementacin real de las


aplicaciones cliente y servidor. Aqu tienen lugar las llamadas a alto nivel para acceder y exportar
objetos remotos. Cualquier aplicacin que quiera que sus mtodos estn disponibles para su acceso por
clientes remotos debe declarar dichos mtodos en una interfaz que extienda java.rmi.Remote. Dicha
interfaz se usa bsicamente para "marcar" un objeto como remotamente accesible. Una vez que los
mtodos han sido implementados, el objeto debe ser exportado. Esto puede hacerse de forma implcita
si el objeto extiende la clase UnicastRemoteObject (paquete java.rmi.server), o puede hacerse de forma
explcita con una llamada al mtodo exportObject() del mismo paquete.
La capa 2 es la capa proxy, o capa stub-skeleton. Esta capa es la que interacta directamente con la
capa de aplicacin. Todas las llamadas a objetos remotos y acciones junto con sus parmetros y retorno
de objetos tienen lugar en esta capa.
La capa 3 es la de referencia remota, y es responsable del manejo de la parte semntica de las
invocaciones remotas. Tambin es responsable de la gestin de la replicacin de objetos y realizacin
de tareas especficas de la implementacin con los objetos remotos, como el establecimiento de las
persistencias semnticas y estrategias adecuadas para la recuperacin de conexiones perdidas. En esta
capa se espera una conexin de tipo stream (stream-oriented connection) desde la capa de transporte.
1

La capa 4 es la de transporte. Es la responsable de realizar las conexiones necesarias y manejo del


transporte de los datos de una mquina a otra. El protocolo de transporte subyacente para RMI es
JRMP (Java Remote Method Protocol), que solamente es "comprendido" por programas Java.
Toda aplicacin RMI normalmente se descompone en 2 partes estas son:

Un servidor, que crea algunos objetos remotos, crea referencias para hacerlos accesibles, y
espera a que el cliente los invoque.
Un cliente, que obtiene una referencia a objetos remotos en el servidor, y los invoca.

Entonces ahora veamos como podemos aplicar esta tecnologa a un ejemplo sencillo.

Crear un servidor RMI


Un servidor RMI consiste en definir un objeto remoto que va a ser utilizado por los clientes. Para
crear un objeto remoto, se define primeramente una interfaz, y el objeto remoto ser una clase que
implemente dicha interfaz. Veamos como crear un servidor de ejemplo mediante 3 pasos:
1. Definir el interfaz remoto
Caractersticas:
o
o
o

La interfaz debe ser pblico.


Debe extender (heredar de) la interfaz java.rmi.Remote, para indicar que puede llamarse
desde cualquier mquina virtual Java.
Cada mtodo remoto debe lanzar la excepcin java.rmi.RemoteException en su clasula
throws, adems de las excepciones que pueda manejar.

Veamos un ejemplo de interfaz remoto:


Clase Interfaz: InterfaceSuma
import java.rmi.*;
import java.rmi.Remote;
public interface InterfaceSuma extends Remote {
public long suma (long a , long b) throws RemoteException;
}//fin de la interface

Implementar la interfaz remota


Clase Implementadota: ClaseSuma
import java.rmi.*;
public class ClaseSuma implements InterfaceSuma{
public long suma (long a , long b) throws RemoteException{
return a+b;
}
}

La clase ClaseSuma implementa la interfaz InterfaceSuma que hemos definido previamente. En si es


aqu donde se desarrolla todo el cdigo que deseamos poner en el mtodo, y solo sern vistas esos
mtodos que estn en la interfaz, claro que se pueden poner otros mtodos pero estos solo sern de la
ClaseSuma es decir local.

Implementar Clase Servidor


Clase Servidor: ServidorSuma
import
import
import
import

java.io.*;
java.rmi.server.UnicastRemoteObject;
java.rmi.registry.*;
java.rmi.server.*;

public class ServidorSuma {


public static void main (String args[]){
try{
// Se crea un objeto Remoto de forma Poli formica
InterfaceSuma ir=new ClaseSuma();
// Se prepara el mecanismo para recibir peticiones
InterfaceSuma refstub=(InterfaceSuma) UnicastRemoteObject.exportObject(ir);
// Se localiza el registro de nombres
Registry r=LocateRegistry.getRegistry("localhost",1099);
//otra manera de hacer la comunicacin
// java.net.InetAddress.getLocalHost().getHostAddress()+
//java.rmi.Naming.rebind("//localhost:1099/ServicioCalculador",refstub);
//se da de alta al Servidor
r.rebind("ServicioCalculador",refstub);
// Entrada estndar
BufferedReader rdr= new BufferedReader(new InputStreamReader(System.in));
while (true){

System.out.println("Teclee Exit para salir");


if("Exit".equals(rdr.readLine())){
System.out.println("Tecnologia..RMI SIS258..FIN");
break;}
}
//Se da de baja el servicio
java.rmi.Naming.unbind("ServicioCalculador");
//Se cierra la comunicacin
UnicastRemoteObject.unexportObject(ir,true);
}
catch(Exception e){}
}
}

Es en esta clase donde se realiza las operaciones que el servidor debe realizar, algunas de ellas son:

crear un objeto Remoto


preparar el mecanismo para recibir peticiones
localizar el registro de nombres
dar de alta al Servicio
dar de baja el Servicio
cerrar la comunicacin

Implementar la clase cliente


Vamos ahora a definir un cliente que acceder a el/los objeto/s remoto/s que creemos. Para ello
seguimos los siguientes pasos:
1. Definir la clase para obtener los objetos remotos necesarios
La siguiente clase obtiene un objeto de tipo InterfaceSuma, implementado en nuestro servidor
Clase Cliente: ClienteSuma
import
import
import
import
import

java.io.*;
java.rmi.Naming;
java.rmi.RemoteException;
java.net.MalformedURLException;
java.rmi.NotBoundException;

public class ClienteSuma {


public static void main (String [] args){
String dir = args.length <=0 ? localhost : args[0];
long res1,res2=0;
try{
// Se localiza el servicio
InterfaceSuma ir= (InterfaceSuma) Naming.lookup("//dir:1099/ServicioCalculador");

InputStreamReader isr = new InputStreamReader(System.in);


BufferedReader Entrada = new BufferedReader(isr);
System.out.println("INTRODUSCA PRIMER NUMERO");
res1=Integer.parseInt (Entrada.readLine());
System.out.println("INTRODUSCA SEGUNDO NUMERO");
res2=Integer.parseInt (Entrada.readLine());
// Invocamos a los mtodos del servicio de forma completamente
transparente
System.out.println("EL RESULTADO DE LA SUMA ES: "+res1+"+"+res2+"=
"+ir.suma(res1,res2));
}
}

catch (Exception e){}

Como se puede observar, simplemente consiste en buscar el objeto remoto en el registro RMI de la
mquina remota. Para ello usamos la clase Naming y su mtodo lookup(...).

Compilar y ejecutar el servidor


Ya tenemos definido el servidor. Ahora tenemos que compilar sus clases mediante los
siguientes pasos:
o

Compilamos el InterfaceSuma.
javac InterfazSuma.java

Luego, compilamos las clases que implementen los interfaces. Y para cada una de ellas
generamos los ficheros Stub y Skeleton para mantener la referencia con el objeto
remoto, mediante el comando rmic:
javac ClaseSuma.java
rmic ClaseSuma

Observamos en nuestro directorio de trabajo que se han generado automticamente dos ficheros
.class (ClaseSuma_Skel.class y ClaseSuma_Stub.class) correspondientes a la capa stubskeleton de la arquitectura RMI.
Para ejecutar el servidor, seguimos los siguientes pasos:
o

Se arranca el registro de RMI para permitir registrar y buscar objetos remotos. El


registro se encarga de gestionar un conjunto de objetos remotos a compartir, y buscarlos
ante las peticiones de los clientes. Se ejecuta con la aplicacin rmiregistry distribuida
con Java, a la que podemos pasarle opcionalmente el puerto por el que conectar (por
defecto, el 1099):

start rmiregistry
Lo mas importante de esto es llevar los archivos generados al cliente y al servidor con lo cual se
realizara la comunicacin.
Arvhivos cliente:

ClaseSuma_Stub.class : Este archivo es el que realmente hace la tarea de comunicacin entre las
maquinas. No olvidemos que este archivo lo genera el compilador rmic
ClienteSuma : Este archivo lo ejecuta el cliente para la comunicacin de tareas
InterfaceSuma : archivo donde se encuentran los mtodos remotos a ejecutar
Los dems archivos generados deben estar del lado del servidor:

Veamos la ejecucin del ejemplo


Todo esto lo hacemos del lado del servidor.

1. ejecutamos el comando rmiregistry


se ejecuta una ventana nueva

2. Ejecutamos ServidorSuma se realiza la espera de que algn cliente se comunique


Ahora ejecutaremos el lado Cliente

En este lado tan solo nos queda ejecutar el archivo ClienteSuma y como se observa se hace la
llamada remota al servidor, ejecutando los mtodos que se encuentran en el mismo.

Bibliografa.
www.monografias.com
www.proactiva-calidad.com/java
www.adictosaltrabajo.com/tutoriales
7

www.sun.com

Вам также может понравиться