El Servicio de "Echo" en Java-RMI: Práctica 3

November 18, 2022 | Author: Anonymous | Category: N/A
Share Embed Donate


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

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF