Sei sulla pagina 1di 6

A.

Ejemplo de aplicacin
prctica de RMI
En este apndice se incluye una aplicacin RMI con la que se observar
el funcionamiento de la API.

A.1 Ejemplo completo de una


aplicacin con RMI
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.

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:
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:
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.
o

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.
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.
21.

Se compila la clase cliente


Se inicia un proceso cliente.

Figura: Proceso servidor en ejecucin

Figura: Proceso cliente en ejecucin

Potrebbero piacerti anche