Sei sulla pagina 1di 6

Laboratorio de Informática Distribuida -1-

13.1 INTRODUCCIÓN A LA INVOCACIÓN DE MÉTODOS


REMOTA (RMI)

JAVA RMI es una especificación básica de programación para la distribución de objetos,


que se comunican de forma dinámica, entre distintas máquinas dentro de un entorno
distribuido. Por tanto, el modelo de invocación de métodos remotos que desarrolla JAVA,
permite que los objetos que se ejecutan en una máquina invoquen a los métodos de objetos
que se ejecutan en otras máquinas distintas. Podemos definir que el objeto que hace la
invocación del método se denomina objeto cliente o local y el objeto cuyos métodos se
están invocando se llama objeto servidor o remoto. El objeto cliente nunca hace una
invocación directa al método remoto sino que hace una referencia a la interfaz remota que
implementa el objeto servidor. Sus objetivos principales son los siguientes:

• Permitir la invocación de métodos de objetos de forma remota.


• Conservar las características de seguridad de JAVA.
• Simplificar de forma considerable el desarrollo de aplicaciones distribuidas.

La arquitectura RMI se implementa en tres niveles o capas, como se muestra en la siguiente


figura:
Modelo RMI

Figura 12.1 Arquitectura RMI

RMI
Laboratorio de Informática Distribuida -2-

El nivel de aplicación se apoya como es lógico sobre este modelo de tres capas. Los límites
entre cada nivel están definidos por una interfaz y protocolos específicos. Para transmitir
transparentemente objetos de un espacio de memoria a otro se usa la técnica de
"Serialización de Objetos". Cuando un cliente invoca un método de un objeto servidor
remoto, hace uso de un PROXY o STUB para llegar hasta el objeto remoto, dicho STUB se
encarga de enviar las solicitudes de invocación de los métodos a través de la interfaz de
referencia remota. La capa de referencia remota es la responsable de llevar a cabo la
semántica de invocación a los objetos. Por último la capa de transporte es la responsable de:

• Establecer conexiones a JVM (Máquina virtual JAVA) remotas.


• Administrar las conexiones.
• Escuchar las llamadas entrantes.
• Mantener una tabla de objetos remotos que residen en la JVM.
• Establecer una conexión para una llamada entrante.

12.1 CLASES SKELETON Y STUB

Estas clases son generadas por el compilador rmic, se obtienen dos nuevas clases en los
ficheros nombreclase_Skel.class y nombreclase_Stub.class, donde nombreclase indica el
nombre de la clase a distribuir

El Stub de un objeto remoto es el proxy del cliente para el objeto remoto, y realiza las
siguientes tareas:

• Inicializar una llamada al objeto remoto.


• Marshaling de argumentos a un marshal stream, obtenido de la capa de referencia
remota.
• Informa a la capa de referencia remota que la llamada debe ser invocada.
• Unmarshaling al valor de retorno o excepción desde un marshal stream.
• Informar al nivel de referencia remota que la llamada esta completa.

El Skeleton de un objeto remoto es una entidad del servidor que contiene un método que
despacha las llamadas a la implementación del objeto remoto. Sus tareas fundamentales son
las siguientes:

• Unmarshaling a los argumentos desde el marshal stream.


• Hacer la llamada a la implementación del objeto remoto.
• Marshaling al valor de retorno de la llamada

RMI
Laboratorio de Informática Distribuida -3-

12.2 DESARROLLO DE APLICACIONES DISTRIBUIDAS

Cualquier aplicación debe cumplir una serie de requisitos para todo funcione como es
debido:

1. La clase objeto debe implementar una interfaz que amplíe la interfaz


Remote.

public interface IHolaMundo extends ja va.rmi.Remote

2. La clase objeto debe ampliar la clase UnicastRemoteObject.

public class CHolaMundo extends UnicastRemoteObject


implements IHolaMundo

3. Las clases stub y skel serán generadas por el compilador rmic.


4. La clase, interfaz y las clases stub y skel deberán incorporarse al
CLASSPATH.
5. El rmiregistry deberá estar lanzado.
6. Se debe registrar el objeto remoto, usando los métodos bind() y rebind() de
la clase Naming. También se debe instalar un administrador de seguridad.

Aparte de los requisitos anteriores, para desarrollar una aplicación distribuida con JAVA
RMI son necesario los siguientes pasos:

• Definición de la interfaz remota.


• Implementación de la aplicación servidor.
• Implementación de la aplicación cliente.
• Generación de las clases stub y skeleton.

Una vez realizado los puntos anteriores y para que los métodos del objeto remoto puedan
ser invocados por distintos clientes deberemos:

• Iniciar el registro de objetos remotos


• Iniciar la aplicación servidor.
• Iniciar la aplicación cliente.

Pero, ¿que significa realmente la iniciación del registro de objetos remotos?, no es más que
un mecanismo que controle todos los objetos que deseamos hacer exportables, conocido
también como registro de nombres, permitirá conseguir referencias de dichos objetos a los
clientes que lo invoquen. Para realizar esta tarea JAVA dispone del comando rmiregistry,
cuya sintaxis es:

rmiregistry [ port]

RMI
Laboratorio de Informática Distribuida -4-

El comando rmiregistry comienza y crea el registro de objetos remotos sobre un


puerto de comunicaciones. La especificación del puerto es opcional, si se omite el
puerto es el 1099. Este comando no produce ninguna salida y lo normal es
ejecutarlo en background. Ejemplo:
start rmiregistry

También debemos hablar de una de las características más importantes que se implementan
en la programación RMI que es la recolección de basura distribuida. Cada objeto exportado
de la JVM mantiene una lista de referencia “Reference list”, que tiene los clientes que
poseen referencias al objeto distribuido, por tanto se podrá, usando métodos como dirty y
clean, mantener el orden y la coherencia en la lista.

12.3 EJEMPLO

Vamos crear la típica aplicación del “HolaMundo” en entorno distribuido, para ello el
primer paso será crear la interfaz remota que en nuestra aplicación será:
public interface I HolaMundo extends java.rmi.Remote {
String Soy ( String nombre) throws java.rmi.RemoteException;
}

Fichero: IHolaMundo.java

El siguiente paso será crear una clase que implemente la interfaz remota que acabamos de
definir. Esta nueva clase será CHolaMundo y el código será el siguiente:

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;

public class CHolaMundo extends UnicastRemoteObject implements IHolaMundo


{
public CHolaMundo() throws Remo teException
{
super();
}

public String Soy(String n) throws RemoteException


{
return "Hola "+n;
}

public static vo id main(String args[])


{
// Crea e instala el administrador de seguridad
System.setSecurityManager(new RMISecurityManager());

try {

RMI
Laboratorio de Informática Distribuida -5-

CHolaMun do obj = new CHolaMundo();


Naming.rebind("//127.0.0.1/ObjetoHola",obj);
System.out.println("Objeto Hola registrado");
} catch (Exception e)
{
System.out.println(" Error: " + e.getMessage());
e.printStackTrace();
}
}
}

Fichero: CHolaMundo.java

Ahora podríamos crear las clases stub y skel, utilizando para ello el compilador rmic (rmic
CHolaMundo), el compilador creará los siguientes dos archivos, CholaMundo_Stub.class y
CholaMundo_Skel.class.

La parte final será la creación de la aplicación cliente, el código que escribimos para esta
implementación es el siguiente:
import java.rmi.*;

public class SaludosSoy


{
public static void main (String args [])
{
String nombre="";
try {
IHolaMundo obj=(IHolaMundo)Naming.lookup("//127.0.0.1/ObjetoHo la");
mensaje=obj.Soy(args[0]);
System.out.println(nombre);
}catch (Exception e)
{
System.out.println("Excepción : " + e.getMessage());
e.printStackTrace();
}
}
}

Fichero: SaludosSoy.java

12.4 CONCLUSIONES DE RMI


Es un entorno de programación donde podemos destacar los siguientes punto:

• Podemos desarrollar una aplicación distribuida sin necesidad de manejar nada que no esté
en el compilador JDK.

RMI
Laboratorio de Informática Distribuida -6-

• Es muy fácil de usar.


• Una de las pegas que podemos comentar, es la imposibilidad de comunicación con
lenguajes que no sean JAVA.
• Desarrollo de aplicaciones distribuidas usando la potencia de la Orientación a Objetos que
nos provee el lenguaje JAVA.
• Recolección de basura distribuida.

RMI

Potrebbero piacerti anche