ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Un ejemplo tonto de RMI (Remote Method Invocation o Invocación de Métodos Remotos)


Enviado por   •  4 de Diciembre de 2012  •  Trabajos  •  2.105 Palabras (9 Páginas)  •  562 Visitas

Página 1 de 9

Un ejemplo tonto de RMI (Remote Method Invocation o Invocación de Métodos Remotos)

Al igual que con los RPC (Remote Procedure Call o Llamada a Procedimientos Remotos) de C en linux, es posible hacer que un programa en java llame a métodos de objetos que están instanciados en otro programa distinto, incluso que estén corriendo en otra máquina conectada en red. Estos métodos, aunque los llamemos desde este ordenador, se ejecutan en el otro. Como se comentó en el RPC, este sistema tiene la ventaja de que si, por ejemplo, tenemos un ordenador capaz de realizar cuentas muy deprisa y otro capaz de dibujar gráficos maravillosos y además necesitamos hacer un programa con muchas cuentas y muchos gráficos, podemos implementar en el ordenador de las cuentas aquellas clases que echan cuentas, en el ordenador de gráficos aquellas clases de pintado y hacer que cada ordenador haga lo que mejor sabe hacer. Cuando al hacer un gráfico necesitemos echar cuentas, llamaremos a la clase remota que echa las cuentas, y estas se harán en el ordenador de las cuentas, devolviendo el resultado al de los gráficos.

Vamos a hacer un ejemplo muy tonto de rmi, para introducirnos en cómo funciona. Harémos una clase capaz de sumar ni más ni menos que dos enteros. Haremos que esta clase quede registrada como objeto remoto, por lo que podrá ser llamada desde otros ordenadores. Harémos un cliente capaz de llamar a esa clase para sumar 2 + 3.

¿Qué cosas tenemos que hacer?

Vamos a ver qué clases necesitamos para hacer nuestros clientes y servidores de rmi, sin extendernos demasiado. Luego veremos cada uno de estos puntos por detallado.

• 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 elrmiregistry. 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.

La interface de la clase remota

Lo primero que tenemos que hacer es una interface con los métodos que queremos que se puedan llamar remotamente. Esta interface sería como la siguiente:

import java.rmi.Remote;

public interface InterfaceRemota extends Remote

{

public int suma (int a, int b) throws java.rmi.RemoteException;

}

Tiene que heredar de la interface Remote de java, si no el objeto no será remoto. Añade además los métodos que queramos, pero todos ellos deben lanzar la excepción java.rmi.RemoteException, que se producirá si hay algún problema con la comunicación entre los dos ordenadores o cualquier otro problema interno de rmi o en el servidor.

Todos los parámetros y valores devueltos de estos métodos deben ser tipos primitivos de java o bien clases que implementen la interface Serializable de java. De esta forma, tanto los parámetros como el resultado podrán "viajar" por red del cliente al servidor y al revés. También se admiten los que implementen la interface Remote, pero ya lo veremos más adelante. De momento, para este ejemplo, nos conformamos con tipos primitivos, en concreto, unos int.

El objeto remoto

Hay que hacer una clase que implemente esa InterfaceRemota, es decir, que tenga los métodos que queremos llamar desde un cliente rmi. El servidor de rmi se encargará de instanciar esta clase y de ponerla a disposición de los clientes. Esa clase es la que llamamos "objeto remoto".

Esta clase remota debe implementar la interface remota que hemos definido (y por tanto implementará también la interfaceRemote de java), pero también debe hacer ciertas cosas bien. Debe definir métodos como hashCode(), toString(),equals(), etc de forma adecuada a un objeto remoto. También debe tener métodos que permita obtener referencias remotas, etc, etc. Es decir, una serie de cosas más o menos complejas y de las que afortunadamente no tenemos que preocuparnos. La forma sencilla de hacer esto es hacer que la clase herede de UnicastRemoteObject. Sería más o menos la siguiente:

import java.io.Serializable;

public class ObjetoRemoto extends UnicastRemoteObject implements InterfaceRemota

{

public int suma(int a, int b)

{

System.out.println ("sumando " + a + " + " + b + "...");

return a+b;

}

}

Otra opción es no hacerlo heredar de UnicastRemoteObject, pero luego la forma de registrarlo varía un poco y además debemos encargarnos de implementar adecuadamente todos los métodos indicados (y algunos más).

La clase

...

Descargar como (para miembros actualizados)  txt (13.7 Kb)  
Leer 8 páginas más »
Disponible sólo en Clubensayos.com