El Servicio de "Echo" en Java-RMI: Práctica 3
November 18, 2022 | Author: Anonymous | Category: N/A
Short Description
Download El Servicio de "Echo" en Java-RMI: Práctica 3...
Description
PRÁCTICA 3
E
El servicio de “echo” en El Ja J ava-RMI
l objetivo de esta práctica es crear y ejecutar una aplicación cliente servidor “echo” basada en java-RMI. La práctica tiene dos partes:
La primera parte implementa un servidor sencillo basado en un objeto java-RMI con un único método “echo”. La segunda parte utiliza las facilidades de movilidad de código en Java-RMI. Se trata de implementar también el servicio de “echo”, pero esta vez el servidor es una máquina de cómputo genérica, denominada “ComputeEngine”, que puede ejecutar cualquier algoritmo cuyo código se le proporcione a través de la red. En este caso, el algoritmo será el algoritmo del servicio de “echo”. La metodología de desarrollo de aplicaciones RMI propuesta en esta práctica está basada en el plugin de RMI para Eclipse de http//www.genady.net . Esta metodología se encuentra bien detallada en las Flash demos que se encuentran en la web y que pueden accederse también a través del menú desplegable del plugin RMI.
DYA DY A
29
Estructura de la aplicación
3.1.- Estructura de la aplicación La aplicación Echo se estructura en tres paquetes: la interfaz , el cliente y el servidor , los cuales se describen a continuación. Ver Ver figura 1 (pág. 30) 30)..
FIGURA 1. Estructura de una RPC
3.1.1.- El paquete interfaz (rmi) Consta del siguiente fichero: EchoInt.java: describe el servicio “echo”. Este fichero debe ser prácticamente igual a la interfaz
•
especificada en la práctica anterior, excepto que el interfaz es en esta práctica es subclase de
java.rmi.Remote. public interface EchoIntRMI extends java.rmi.Remote
3.1.2.- El paquete servidor (server) Consta, básicamente, de dos ficheros: •
EchoObject.java: implementa la interfaz EchoInt y y proporciona el servicio de “echo” en local
(a clientes locales, no a clientes remotos). La implementación es idéntica a la práctica anterior y consiste en devolver la cadena que se envía, e nvía, junto con el URL y la hora de la máquina servidora al cabo de 3 segundos. Este retraso simula que el servicio tiene un tiempo de cómputo largo y apreciable.
30
El servicio de “echo” en Java-RMI Java-RMI
Realización del servicio de echo elemental en RMI
•
EchoObjectRMI.java: es el verdadero objeto RMI (extends UnicastRemoteObject ). ). También
implementa la interfaz EchoInt e implementa el servicio de “echo” en remoto (para clientes remotos). Su implementación se basa en crear una instancia del objeto EchoObject y y delegar en el la implementación del método echo. La funcionalidad adicional que aporta esta clase es la de registrar el servicio en el servidor de nombres y proporcionarle la capacidad de ser invocado remotamente mediante el código genético que aporta la clase UnicastRemoteObject. El objeto servidor lo componen el código objeto correspondiente a estos ficheros junto a los skele-
tons generados automáticamente por RMI.
3.1.3.- El paquete cliente (client) Lo constituye el siguiente fichero: •
EchoRMI.java: es el cliente RMI. Se encarga de obtener una referencia RMI al objeto servidor
a partir del servicio de nombres. Una vez obtenida esta referencia, realiza el bucle: -
Leer de teclado
-
Invocar el objeto (a través de la referencia al objeto)
-
Imprimir el resultado por pantalla.
3.2.- Realización del servicio de echo elemental en RMI Para la realización de la parte básica de la práctica cree un proyecto prj-rmi y siga la metodología descrita en la práctica 1.
3.2.1.- Creación del proyecto 1. Descargue los ficheros de ayuda al directorio de descargas ($WS/descargas) si los hubiera. 2. Cree un proyecto prj-rmi en el workspace según se indica en la práctica 1 cree también los
paquetes de que consta la aplicación: rmi, client , server .
3.2.2.- Generación de la interfaz RMI El desarrollo de la interfaz RMI, contenida en el paquete rmi, consta de los siguientes pasos: 3. Cree una interfaz EchoInt . La opción más sencilla es utilizar File->New->Other->Java->RMI -
> Remote Interface. También se puede hacer con File->New->New Interface especificando: Name: E choI hoI nt -
DYA
31
Realización del servicio de echo elemental en RMI
-
Extended interfaces: jav java a.rm .r mi.i.R R emote
4. Complete la definición de la interfaz con la especificación del método echo.
3.2.3.- Generación del servidor RMI El desarrollo del servidor RMI, contenido en el paquete server server,, consta de los siguientes pasos: 5. Cree una clase EchoObjectRMI . con File->New Class especificando: -
Name: EchoObjectRMI
-
Superclass: java.rmi.UnicastRemoteObject
-
Extended interfaces: rmi.EchoInt
-
public static void main
-
Constructors from superclass
6. Copie el fichero EchoObject.java del directorio de descargas al directorio server del del proyecto
en el workspace y actualice el Package explorer para visualizarlo. 7. Complete la implementación del servidor con la implementación de los métodos echo y main. -
El método echo delega en el correspondiente método de la clase EchoObject.
-
El método main básicamente debe realizar una instancia del EchoObjectRMI e e inscribirla en el Servicio de Nombres Nombres de RMI
3.2.4.- Generación de stubs La ejecución de aplicaciones RMI requiere la generación automática de stubs y skeletons, para ello: 8. Habilite la generación de stubs RMI para el servidor del proyecto. Para ello en el menú contex-
tual del proyecto seleccione: RMI->Enable Stubs Generation Esto generará los stubs cada vez que sea necesario (si el proyecto tiene seleccionada la opción Project->Build automatically) pero el package explorer normalmente no los muestra. explorer normalmente -
9. Para mostrar los stubs en el Package explorer deberá habilitar la siguiente opción en el menú
contextual del proyecto: -
Properties -> -keep
En caso de no disponer del plugin RMI, la generación de stubs y skeletons puede realizarse desde una consola MS-DOS estableciendo la variable de entorno CLASSPATH y y ejecutando el compilador de RMI, especificando como parámetros el servidor de echo:
> rmic server/Echo server/EchoObjectRMI. ObjectRMI.java java
3.2.5.- Generación del cliente RMI El desarrollo del cliente RMI, contenido en el paquete client, consta de los siguientes pasos:
32
El servicio de “echo” en Java-RMI Java-RMI
Realización del servicio de echo elemental en RMI
10. Copie el fichero EchoRMI.java del directorio de descargas al directorio client del del proyecto en el
workspace y actualice el Package explorer para visualizarlo. 11. Realice los ejercicios propuestos. -
Sólo tiene que realizar la invocación al servidor de echo.
-
Observe la necesidad de un gestor de seguridad en el cliente.
3.2.6.- Compilación y ejecución de aplicaciones RMI en Eclipse El desarrollo de aplicaciones RMI en Eclipse se ve facilitado por el plugin de http://
www.genady.net . Para ejecutar una aplicación RMI, básicamente debe seguir los siguientes pasos: 1. Arranque el servicio de nombres RMI rmiregistry utilizando la opción Start Local Registry
(port 1099) del menú del plugin de RMI:
En caso de no disponer del plugin RMI, este servicio también puede arrancarse desde una consola MS-DOS estableciendo la variable de entorno CLASSPATH y y ejecutando: > start rmiregistry
En Unix: > rmiregistry&
2. Ejecute el servidor EchoObjectRMI creando creando un perfil de ejecución con el menú Run as -> RMI
Application y fijando las siguientes propiedades de la máquina virtual (menú RMI VM Properties): -
java.rmi.server.codebase: permite especificar un URL para el código rmi. De esta forma, la
máquina virtual puede conocer la ubicación de las clases y sus correspondientes stubs o ske-
letons. Fíjela en el directorio bin de la aplicación ( file:${workspace_loc:/prj-rmi/bin} file:${workspace_loc:/prj-rmi/bin}). Esta opción se especifica con Compute from classpath. -
La ejecución de aplicaciones desde consola (caso de no disponer del plugin RMI) debe especificar correctamente las propiedades de la máquina virtual:
> java server/EchoObjectRMI server/Echo ObjectRMI -Djava.rmi.server -Djava.rmi.s erver.codebase= .codebase= ... -Djava.secu -Djava.security.policy=... rity.policy=...
3. Compruebe que el servicio echo ha sido registrado correctamente en el rmiregistry utilizando el
RMI Registry Inspector. Inspector. 4. Ejecute el cliente EchoRMI creando un perfil de ejecución con el menú Run as -> RMI Appli-
cation y especificando: -
Argumentos de ejecución (menú (x) Arguments): host del del servidor.
-
Propiedades de la máquina virtual (menú RMI VM Properties). Puesto que el cliente utiliza un gestor de seguridad es necesario especificar una política:
-
java.security.policy : permite especificar el URL para un fichero con la política de seguridad
necesaria para ejecutar aplicaciones RMI. Existen aquí dos opciones: o bien crear un fichero
DYA
33
Despliegue y ejecución de aplicacione RMI desde la consola.
automáticamente desde las opciones disponibles (Create...) o bien especificar un fichero con el siguiente contenido.
grant { };
permission java.net.SocketPerm java.net.SocketPermission ission "*:1024-6553 "*:1024-65535", 5", "connect,accept,resolve"; "connect,accept,resolve";
5. Realice también pruebas de invocación de clientes a servidores remotos utilizando el servidor de
echo de otros compañeros de prácticas.
3.3.- Despliegue y ejecución de aplicacione RMI desde la consola. La ejecución de la aplicación RMI fuera del entorno Eclipse consta de dos pasos fundamentales el despliegue de la aplicación como ficheros jar ja r y la ejecución, propiamante dicha, del servidor y del cliente.
3.3.1.- Despliegue de la aplicación Deben generarse los siguientes ficheros jar: 1. rmi_remote.jar: contiene los interfaces y los stubs de RMI. Debe estar accesible por el cliente
en tiempo de ejecución. En el caso de la práctica “Echo” contiene: rmi/EchoInt.java server/EchoObjectRMI_Stub.java
2. rmi_server.jar : contiene la implementación del servidor . En el caso de la práctica “Echo” con-
tiene: rmi/EchoInt.java server/*
1. 2. rmi_client.jar: contiene la implementación del cliente. En el caso de la práctica “Echo” con-
tiene: rmi/EchoInt.java client/*
3.3.2.- Ejecución del servidor RMI La ejecución del servidor consta de los siguientes pasos: 1. Ejecutar el servicio de nombres rmiregistry en la máquina que se ejecute el servidor. servidor. 2. Crear un fichero de política de segurida segurida denominado, por ejemplo, “ security. security.policy policy” con el
siguiente contenido: grant {
permission java.security.AllPermission; java.securi ty.AllPermission;
}
34
El servicio de “echo” en Java-RMI Java-RMI
Realización de la aplicación “echo” utilizando movilidad de código
3. Dejar el fichero “rmi_remote.jar ”con ”con la implementación del servidor en una localización accesi-
ble tanto por parte del servidor como del cliente (hhtp:, (hhtp:, ftp:, ó file: ). Por ejemplo: file:/users/dya/echo/rmi_remote.jar
4. La máquina java que ejecute al servidor debe tener establecidos las siguientes propiedades: -
-Djava.security.policy=“el -Djava.security .policy=“el fichero del paso 2”
-
-Djava.rmi.server.codebase=Localización -Djava.rmi.server .codebase=Localización del fichero “rmi_remote.jar”
-
-classpath rmi_server.jar rmi_server.jar
En el caso de la práctica de Echo -
java -Djava.security.policy=security -Djava.security.policy=security.policy .policy
-
-Djava.rmi.server.codebase=file:/users/dya/echo/rmi_remote.jar
-
-classpath rmi_server.jar rmi_server.jar server.EchoObjectRMI server.EchoObjectRMI
3.3.3.- Ejecución del cliente RMI Para ejecutar el cliente RMI, el fichero “ rmi_remote.jar ” con los stubs y el fichero de política de seguridad deben estar accesibles en la máquina del cliente. La ejecución se realiza mediante la siguiente orden: java -Djava.security -Djava.security.policy=security .policy=security.policy .policy -Djava.rmi.server.codebase=file:/users/dya/echo/rmi_remote.jar -classpath rmi_client.jar client.EchoRMI localhost
3.4.- Realización de la aplicación “echo” utilizando movilidad de código Visite el Tutorial de Java (disponible en la web de la asignatura) y seleccione el capítulo de RMI. En este capítulo se desarrolla una aplicación donde existe un servidor de computo genérico Compu-
teEngine, que ejecuta un código (subclase de Task ) que el cliente le puede especificar como parámetro por valor en una invocación RMI (movilidad de código). La Task que se desarrolla en el tutorial es las Task Pi Pi que contiene un algoritmo para calcular el número pi. Ver figura 2 (pág. 36). 36). Este ejemplo se encuentra disponible como tutorial en el plugin RMI. Esta segunda parte de la práctica consiste en compilar y ejecutar el ejemplo del tutorial y, posteriormente, modificarlo para sustituir el algoritmo de calcular el numero pi por el algoritmo de realizar el servicio “echo”. De esta manera el servidor ComputeEngine ejecutará una Task con el servicio de “echo”. Se requiere también modificar la interfaz del Compute del ComputeEngine para adaptarla a
la
siguiente especificación:
DYA
35
Realización de la aplicación “echo” utilizando movilidad de código
FIGURA 2. La aplicación ComputeEngine import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote {
//loadTask: Cargar una nueva task en el ComputeEngine. No ejecutarla void loadTask (Task (Task t) throws RemoteException;
//executeTask: Ejecutar una task previamente cargada con loadTask loadTask //la task admite como argumentos de entrada los proporcionados en arg y //el resultado de la Task Task es devuelto como como resultado de executeT executeTask ask Object
executeTask (Object (Object
arg) throws RemoteException;
}
Esta segunda parte consta de los siguientes pasos: 1. Crear los proyectos de esta aplicación con: File->New->Other->Java->RMI -> Tutorials y
seleccionando Sun’ Sun’ss R MI Tuto Tutor ial. 2. Ejecutar la aplicación anterior. Para ello, siga los pasos del apartado 3.2.6.3. Modificar la aplicación anterior para ajustarse a la nueva especificación de la interfaz Compute.
Para ello: -
-
-
Modifique las interfaces Compute y Task . Modifique el servidor de ComputeEngine para implementar la nueva interfaz Compute. Realice una Task que implemente el algoritmo de echo, aprovechando el objeto EchoOb-
ject.java. -
Realice una nueva versión del cliente de echo de la primera parte de la práctica para que invoque la nueva máquina de cómputo genérica.
4. Ejecute la nueva versión del servidor de cómputo genérico.
36
El servicio de “echo” en Java-RMI Java-RMI
Ficheros de apoyo
3.5.- Ficheros de apoyo 3.5.1.- Fichero server/EchoObjectRMI.java 3.5.2.- package server; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import rmi.EchoInt; public class EchoObjectRMI extends UnicastRemoteObject implements EchoInt { private static final long serialV serialVersionUID ersionUID = 1L;
protected EchoObjectRMI() throws RemoteException { super();
// TODO Auto-gener Auto-generated ated constructor stub
}
private static EchoObject eo = new EchoObject(); public String echo(String input) throws RemoteException RemoteException { // TODO Auto-generated Auto-generated method stub
return eo.echo(input);
} public static void main(String[] args) {
Auto-generated rated method stub // TODO Auto-gene
try {
Registry registry = LocateRegis LocateRegistry.getRegistry(); try.getRegistry(); registry.rebind("echo", registry .rebind("echo", new EchoObjectRMI());
} catch (RemoteEx (RemoteException ception e) {
System.err.println("Something System.err .println("Something wrong happended on the remote end");
e.printStackTrace();
System.exit(-1); System.exit(-1 ); // can't just return, rmi threads may not exit
}
System.out.println("The System.out.print ln("The echo server is ready");
}
}
3.5.3.- Fichero server/EchoObject.java El mismo que para la práctica de sockets.
DYA
37
Ficheros de apoyo
3.5.4.- Fichero client/EchoObject.java package client; import java.io.*; import java.rmi.Nam java.rmi.Naming; ing; import java.rmi.RM java.rmi.RMISecurityMan ISecurityManager; ager; import rmi.EchoInt; public class EchoRMI { public static void main(String[] main(String[] args) {
// TODO Auto-generated method stub
if (args.length
View more...
Comments