Vous êtes sur la page 1sur 5

Aplicaciones prcticas con RMI (Remote Method Invocation)

En este apartado se explicar, con un ejemplo concreto, los pasos seguidos para elaborar
una aplicacin con objetos distribuidos RMI. Esta aplicacin ejemplo proporcionar un
servicio que acepta peticiones de tareas concretas especificadas por parte de los clientes.
Es decir, cada cliente puede especificar la tarea que desea que el servidor le realice,
utilizando para ello el paso de objetos serializados.
La figura A.1 muestra un esquema del proceso paso por paso en la elaboracin de una
aplicacin RMI.[6]

Figura: Secuencia de pasos para programar aplicaciones RMI


La secuencia indicada en la figura A.1 es la siguiente theenumialph@enumi theenumi)
1. En primer lugar se escribe la interfaz remota del servidor, que en este caso se
llamar ejecutor. Toda interfaz remota debe declararse como public y debe extender
la interfazjava.rmi.Remote. Adems, esta interfaz debe definir los mtodos que
sern accesibles remotamente. Por ltimo cada uno de estos mtodos debe manejar
la excepcinjava.rmi.RemoteException. La segunda interfaz necesitada para este
ejemplo define el tipo Tarea. Este tipo es utilizado como un argumento del
mtodo ejecutar del interfazejecutor. Esta segunda interfaz permite definir desde el
lado cliente la tarea (Tarea) que debe realizar el servidor y ser pasada
dinmicamente como argumento del mtodo remoto. Observamos que la
interfaz Tarea extiende el interfaz java.io.Serializable. RMI utiliza el mecanismo de
serializacin de objetos para transportar objetos entre mquinas virtuales. Tarea no
es un objeto accesible remotamente, sino que es enviada por el cliente como
argumento al servidor. En definitiva el objeto ejecutor del lado servidor queda a
disposicin de ejecutar tareas Tarea que le soliciten los clientes.
El cdigo de la interfaz remota ejecutor es el siguiente:

pg. 1

package callback;
import java.rmi.*;
public interface ejecutor
extends Remote{
public String ejecutar(Tarea t) throws RemoteException;
}
El cdigo de la interfaz Tarea es el siguiente:
package callback;
import java.io.Serializable;
public interface Tarea extends Serializable{
public String recado();
}
La interfaz ejecutor contiene un nico mtodo ejecutar, que recibe como argumento
un objeto de la clase Tarea, que es la interfaz definida por el cliente. De esta forma
el cliente implementa la tarea (de clculo, por ejemplo) que desea realice el servidor.
Para ello define el mtodo recado.
2. Se implementa la interfaz remota. La clase que la implementa debe heredar
de RemoteServer y lo habitual es hacerlo heredando de UnicastRemoteObject. El
cdigo de la implementacin ejecutor_Imp es el siguiente:
3. package callback;
4. import java.rmi.*;
5. import java.rmi.server.*;
6.
7. public class ejecutor_Imp extends UnicastRemoteObject
8.
implements ejecutor {
9.
protected ejecutor_Imp() throws RemoteException {
10.
super();
11.
}
12.
public String ejecutar(Tarea t) throws RemoteException {
13.
return t.recado();
14.
}
15. }
sta es la implementacin desde el lado servidor de la interfaz ejecutor. Utiliza el
constructor de la clase de la que hereda, UnicastRemoteObject y define el
mtodoejecutar(Tarea t), que devuelve la resolucin del mtodo recado() del
objeto Tarea que ha sido pasado como parmetro.
16. Se generan los archivos stub y skeleton a partir de la clase que implementa la
interfaz remota. Para ello se utiliza el compilador rmic. Para ejecutarlo hacemos rmic
nombre_claseo bien rmic -d directorio nombre_clase para especificar una ubicacin
destino concreta.
Como resultado de esta operacin se obtienen dos archivos:
o

pg. 2

ejecutor_Imp_Stub.class

o ejecutor_Imp_Skel.class
17. Se inicia el servicio de registro RMI, rmiregistry. Un host que quiera exportar
referencias remotas a sus mtodos de modo que los stubs puedan acceder a ellos,
debe estar ejecutando un servidor de registro RMI.

Este servicio se inicia en entornos Linux:


rmiregistry &
En entornos Windows:
start rmiregistry
La aplicacin rmiregistry crea un objeto Registry, que escucha por un puerto, a la
espera de peticiones de procesos clientes que busquen objetos remotos en el
registro RMI. Cabe destacar que, cara al servidor de registro RMI, todos los
procesos actan como clientes, tanto los servidores de objetos remotos como los
clientes. Un servidor que va a registrar sus objetos remotos debe estar en el mismo
host que ejecuta el servidor de registro RMI.
18. Se inicia un proceso servidor y se registra en el rmiregistry. Una vez compilada y
ejecutada, queda registrada.
El cdigo para la implementacin del servidor es el siguiente:
package callback;
import java.rmi.*;
public class servidor {
private servidor(){
try{
if (System.getSecurityManager()==null)
System.setSecurityManager(new RMISecurityManager());
ejecutor imp=new ejecutor_Imp();
Naming.rebind("rmi://192.168.2.2/Motor_Computo",imp);
}catch(Exception e){
System.out.println("Error: "+e.getMessage());
e.printStackTrace();
}
}
public static void main(String args[]){
System.out.println("Levantando el servidor...");
servidor server=new servidor();
}
}
El servidor, en primer lugar, instala un gestor de seguridad. A continuacin crea un
objeto de la clase que implementa la interfaz remota y lo publica.

pg. 3

En el ejemplo que nos ocupa estamos suponiendo que las clases necesarias residen
en las mquinas implicadas, por lo que no sera necesario el uso de un gestor de
seguridad.
19. Se escribe la clase cliente. En esta parte se incluye la implementacin de la
interfaz Tarea vista previamente, que utilizar el cliente para solicitar la ejecucin de
una tarea determinada.
El cdigo de la clase que implementa la interfaz Tarea es el siguiente:
package callback;
public class tarea_Imp implements Tarea{
public String recado() {
return "Hello World";
}
}
El cdigo para la implementacin del cliente es el siguiente:
package callback;
import java.rmi.*;
public class cliente {
public static void main(String args[]){
try{
if (System.getSecurityManager()==null)
System.setSecurityManager(new RMISecurityManager());
ejecutor ej=(ejecutor)
Naming.lookup("rmi://192.168.2.2/Motor_Computo");
Tarea tarea=new tarea_Imp();
String respuesta=ej.ejecutar(tarea);
System.out.println(respuesta);
}catch(Exception e){
System.out.println("Error: "+e.getMessage());
}
}
}
La clase Tarea_Imp implementa la interfaz Tarea, vista anteriormente. En este
caso, define el mtodo recado() como un simple "Hello World". Es decir, la tarea que
el cliente quiere que realice el servidor es devolverle la frase "Hello World".
Al igual que en el lado servidor, el cliente empieza creando e instalando un gestor
de seguridad. A continuacin localiza el objeto remoto y crea un objeto de la
clase Tarea_Imppara solicitar al servidor que ejecute esa tarea.
20. Se compila la clase cliente
21. Se inicia un proceso cliente.

pg. 4

Figura: Proceso servidor en ejecucin

Figura: Proceso cliente en ejecucin

pg. 5

Vous aimerez peut-être aussi