0% encontró este documento útil (0 votos)
107 vistas14 páginas

Practica1 JAVA RMI Modelo Informe

Este documento presenta un modelo de informe grupal para la Práctica de Laboratorio N° 1 de un curso de Software y Lenguaje de modelado. El objetivo es familiarizarse con Java programando tres procesos (A, B y C) que se comuniquen entre sí. El informe será evaluado considerando la calidad de las respuestas, el diseño de la solución en Java, la redacción y las conclusiones.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
107 vistas14 páginas

Practica1 JAVA RMI Modelo Informe

Este documento presenta un modelo de informe grupal para la Práctica de Laboratorio N° 1 de un curso de Software y Lenguaje de modelado. El objetivo es familiarizarse con Java programando tres procesos (A, B y C) que se comuniquen entre sí. El informe será evaluado considerando la calidad de las respuestas, el diseño de la solución en Java, la redacción y las conclusiones.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 14

Curso: Software y Lenguaje de modelado

Modelo de informe grupal de la Práctica de Laboratorio N° 1

Integrantes: Apellidos y nombre

Objetivos:

1. Familiarizarse y programar en Java elemental, adquiriendo nociones de objetos,


métodos, compilación, ejecución, uso de librerías, etc.
2. Diseñar e implementar programas usando el concepto de llamada a procedimientos
remotos en Java usando tres bloques A, B y C

Se evaluará (rúbrica)

Calidad de respuestas de cuestionario (más cantidad de copiar y 30%


pegar reducirá puntaje)
Diseño de solución en Java, siguiendo los pasos de diseño(*) en 30%
ingeniería(especificaciones, alternativas, solución, etc.
Buena redacción 20%
Conclusiones 20%

*Nota: El diseño siguiendo las prácticas de diseño de software se realizarán en la segunda


parte del curso, por ahora use su sentido común de ingeniero.

Introducción

Se le ha planteado programar 3 procesos en Java tal que el primero A reciba datos de


respuesta de B y a su vez B envíe datos y los reciba de C. Es libre de implementar las
operaciones de la forma que usted desee. A mayor cantidad de datos mejor.

A C
B
Elaborar un resumen de Java RMI en base a :

https://docs.oracle.com/javase/tutorial/rmi/index.html

El resumen lo efectuaremos en un cuadro conceptual para comprender mejor, y luego los


puntos que tocaremos a los costados de dicho cuadro será para profundizar las características,
aplicaciones o propiedades de Java RMI.

En el esquema siguiente, mostraremos lo que se tocará a profundidad seguidamente, estás


vendrían a ser las siguientes:

1. Una
descripcion
general de las
aplicaciones RMI

RMI de Java:
Permite que un objeto
que se ejecuta en una
4. Compilar y "Virtual Machine" 2. Escribir un
ejecutar el invoque métodos en servidor RMI
ejemplo LE un objeto que se
ejecuta en otra
"Virtual Machine"
Java.

3. La creación de
un programa de
cliente

1. UNA DESCRIPCIÓN GENERAL DE LAS APLICACIONES RMI:


RMI establece un mecanismo el cual comunique al cliente y al servidor, y de esa
manera transfieran información entre ellos.
La función de las aplicaciones de objetos distribuidos es lo siguiente:

 Localizar objetos remotos


 Comunicarse con objetos remotos
 Cargue las definiciones de clase para los objetos que se pasan

Ahora veamos como RMI utiliza un registro RMI para obtener una referencia a un
objeto remoto. El servidor hace un llamado al registro para vincularlo con un nombre y
el RMI cliente lo busca e invoca su método en él. También se puede utilizar el web.

Ventajas de la carga dinámica de código:

 Capacidad para descargar la definición de la clase de un objeto si la


clase no esta definida en la máquina virtual del Java receptor
 Esta capacidad permite introducir nuevos comportamientos de la
maquina virtual remota en Java, ampliando dinámicamente el
comportamiento de dicha aplicación.

Interfaces remotas, objetos y métodos:

Una aplicación distribuida creada mediante Java RMI, esta compuesta por
interfaces y clases.

 INTERFAZ: Declaran métodos.


 CLASES: Implementan los métodos declarados en las interfaces.

RMI trata un objeto remoto de manera diferente a un objeto no remoto


cuando el objeto se pasa de una máquina virtual Java a otra máquina virtual
Java. 

En lugar de hacer una copia del objeto de implementación en la máquina


virtual Java receptora, RMI pasa un código auxiliar remoto para un objeto
remoto. El código auxiliar actúa como el representante local o proxy del objeto
remoto y, básicamente, es, para el cliente, la referencia remota. El cliente
invoca un método en el código auxiliar local, que es responsable de llevar a
cabo la invocación del método en el objeto remoto.

Crear aplicaciones distribuidas utilizando RMI

Para desarrollar una aplicación distribuida implica lo siguiente:

 Diseño e implementación de los componentes de su aplicación


distribuida: Primero, se implementa la arquitectura de su
aplicación, especificando que objetos son locales y los
componentes son accesibles de forma remota. Incluye este paso:
 Definición de Interfaces remotas
 Implementación de los objetos remotos
 Implementando a los clientes

 Recopilando fuentes: Utiliza el Java Compilator, para compilar los


archivos fuente. Los archivos origen contienen declaraciones de las
interfaces remotas.

 Haciendo accesibles las clases en la red: Este paso hará que las
definiciones de clase sean accesibles en red, como definiciones de
interfaces remotas. Y las definiciones de clase deben descargarsea
los clientes y servidores.

Nota: Las definiciones se hacen accesibles a la red mediante


un servidor web.

 Iniciando la aplicación: Iniciar una aplicación, aborda ejecutar un


registro de objetos remotos RMI, el servidor y cliente.

2. ESCRIBIR UN SERVIDOR RMI

Estos siguientes procesos trataran de los pasos para crear un “motor de computo
genérico”. El cual este acepta tareas de los clientes, ejecuta las tareas y devuelve los
resultados.

El código del servidor consta de una interfaz y una clase. Esta interfaz define los
métodos invocados desde el cliente y la clase proporciona la implementación.

Para escribir el código de un servidor se deben seguir dos pasos muy importantes los
cuales son:

2.1. Diseño de una Interfaz Remota:

Tomando el ejemplo del motor de computo, hay un protocolo que permite


que las tareas se envíen desde el cliente a nuestro servidor y el resultado lo
devuelva al cliente.

Cada interfaz contiene un único método. Este ejemplo esta dividido en dos
interfaces:
 Primera interfaz:

paquete de cómputo;

import java.rmi.Remote;
import java.rmi.RemoteException;

interfaz pública Compute extiende Remote {


<T> T executeTask (Tarea <T> t) arroja
RemoteException;
}

ExecuteTask: Es un método remoto capaz de lanzar a


java.rmi.RemoteException.

 Segunda Interfaz:

paquete de cómputo;

Interfaz pública Tarea <T> {


T ejecutar ();
}

La Task interfaz define un método único execute, que no tiene


parámetros ni arroja excepciones. Este Task tiene un parámetro
definido por “T”.

2.2.Implementación de una interfaz remota:

Esta sección discute la tarea de implementar una clase para el motor de


computo. Una clase que implementa una interfaz remota debe hacer lo
siguiente como mínimo:

 Declarar las interfaces remotas que se implementan


 Definir el constructor para cada objeto remoto.
 Proporcionar una implementación para cada método remoto
en las interfaces remotas.

Un programa de servidor RMI necesita crear los objetos remotos iniciales


y exportarlos al tiempo de ejecución RMI, lo que los hace disponibles para
recibir invocaciones remotas entrantes. Este procedimiento de
configuración puede encapsularse en un método de la clase de
implementación de objetos remotos o incluirse en otra clase por
completo. El procedimiento de configuración debe hacer lo siguiente:

 Crear e instalar un administrador de seguridad


 Crea y exporta uno o más objetos remotos
 Registre al menos un objeto remoto con el registro RMI (o con
otro servicio de nombres, como un servicio accesible a través
de la Interfaz de nombres y directorios de Java) con fines de
arranque.
Entonces para la implementación completa del motor de computo debe ser:
paquete de motor;

import java.rmi.RemoteException;
importar java.rmi.registry.LocateRegistry;
importar java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
importar compute.Compute;
importar compute.Task;

ComputeEngine de clase pública implementa Compute {

Public ComputeEngine () {
súper();
}

public <T> T executeTask (Tarea <T> t) {


devuelve t.execute ();
}

public static void main (String [] args) {


if (System.getSecurityManager () == null) {
System.setSecurityManager (nuevo
SecurityManager ());
}
tratar {
String name = "Calcular";
Compute engine = nuevo ComputeEngine ();
Calcular trozo =
(Calcular) UnicastRemoteObject.exportObject (motor, 0);
Registro registro = LocateRegistry.getRegistry ();
Registry.rebind (nombre, código auxiliar);
System.out.println ("ComputeEngine enlazado");

} catch (Excepción e) {
System.err.println ("Excepción ComputeEngine:");
e.printStackTrace ();
}
}
}

Explicación del código:

 Main: Es un método que se utiliza para inicializar


ComputerEngine y también el mantenimiento del mismo para
que el servidor este listo para recibir llamadas de clientes.

 ComputeEngine de clase pública implementa Compute:


Declara las interfaces remotas que se están implementando
 Public ComputeEngine () {
súper();}
: Define el constructor para el objeto remoto
 public <T> T executeTask (Tarea <T> t) {
devuelve t.execute ();}
: Proporciona implementaciones para cada método remoto
 if (System.getSecurityManager () == null) {
System.setSecurityManager (nuevo SecurityManager
());}

: Crea e instala un administrador de seguridad


 Compute engine = nuevo ComputeEngine ();
Calcular trozo =
(Calcular) UnicastRemoteObject.exportObject (motor,
0);

: Hace que el objeto remoto este disponible para los clientes

 Registro registro = LocateRegistry.getRegistry ();


Registry.rebind (nombre, código auxiliar);

: Agrega el nombre del registro RMI que se ejecuta en el servidor

 UnicastRemoteObject.exportObject: Método estático


exporta el objeto remoto suministrado para que este pueda recibir
invocaciones de sus métodos remotos desde los clientes remotos.

 exportObject: Es un método que devuelve un código auxiliar


para el objeto remoto exportado.

 java.rmi.registry.Registry: Es el API para vincular y buscar


objetos remotos en el registro.

3. LA CREACION DE UN PROGRAMA DE CLIENTE

Los clientes para el motor de cálculo necesitan llamar al motor de cálculo, pero
también definir la tarea que debe realizar el motor de cálculo.

Primero se invoca Task, que es una interfaz no remota


paquete de cómputo;

Interfaz pública Tarea <T> {


T ejecutar ();
}

Luego se invoca los códigos de un objeto, para luego introducir por código la clase del
cliente principal:

paquete de cliente;

importar java.rmi.registry.LocateRegistry;
importar java.rmi.registry.Registry;
import java.math.BigDecimal;
importar compute.Compute;

ComputePi de clase pública {


public static void main (String args []) {
if (System.getSecurityManager () == null) {
System.setSecurityManager (nuevo SecurityManager ());
}
tratar {
String name = "Calcular";
Registro registro = LocateRegistry.getRegistry (args
[0]);
Compute comp = (Compute) Registry.lookup (nombre);
Pi task = new Pi (Integer.parseInt (args [1])));
BigDecimal pi = comp.executeTask (tarea);
System.out.println (pi);
} catch (Excepción e) {
System.err.println ("excepción ComputePi:");
e.printStackTrace ();
}
}
}

Al igual que el  ComputeEngine servidor, el cliente comienza instalando un


administrador de seguridad. Este paso es necesario porque el proceso de recibir el
código auxiliar del objeto remoto del servidor podría requerir la descarga de
definiciones de clase del servidor. Para que RMI descargue clases, debe estar en
vigencia un administrador de seguridad.

A continuación, el cliente crea un nuevo Pi objeto, pasando al Pi constructor el valor


del segundo argumento de la línea de comandos args[1], analizado como un
entero. Este argumento indica el número de lugares decimales para usar en el
cálculo. Finalmente, el cliente invoca el executeTask método
del Computeobjeto remoto. El objeto pasado a la executeTaskinvocación
devuelve un objeto de tipo BigDecimal, que el programa almacena en la
variable result. Finalmente, el programa imprime el resultado. La siguiente figura
muestra el flujo de mensajes entre el ComputePicliente, el rmiregistryy
el ComputeEngine.

Y finalmente tenemos el código para el cliente pi especificado anteriormente:


paquete de cliente;

importar compute.Task;
import java.io.Serializable;
import java.math.BigDecimal;

la clase pública Pi implementa la tarea <BigDecimal>,


serializable {

privado estático final largo serialVersionUID = 227L;

/ ** constantes utilizadas en el cálculo pi * /


privado estático final BigDecimal FOUR =
BigDecimal.valueOf (4);

/ ** modo de redondeo para usar durante el cálculo pi * /


private static final int roundingMode =
BigDecimal.ROUND_HALF_EVEN;

/ ** dígitos de precisión después del punto decimal * /


dígitos int privados finales;

/ **
* Construir una tarea para calcular pi a la especificada
* precisión.
* /
Pi público (dígitos int) {
this.digits = dígitos;
}
/ **
* Calcular pi.
* /
public BigDecimal execute () {
return computePi (dígitos);
}
/ **
* Calcular el valor de pi para el número especificado de
* dígitos después del punto decimal. El valor es
* calculado utilizando la fórmula de Machin:
* *
* pi / 4 = 4 * arctan (1/5) - arctan (1/239)
* *
* y una expansión en serie de potencia de arctan (x) a
* Precisión suficiente.
* /
público estático BigDecimal computePi (int dígitos) {
escala int = dígitos + 5;
BigDecimal arctan1_5 = arctan (5, escala);
BigDecimal arctan1_239 = arctan (239, escala);
BigDecimal pi = arctan1_5.multiply (FOUR) .subtract (
arctan1_239) .multiply
(CUATRO);
return pi.setScale (dígitos,
BigDecimal.ROUND_HALF_UP);
}
/ **
* Calcular el valor, en radianes, del arcotangente de
* el inverso del entero proporcionado al especificado
* número de dígitos después del punto decimal. El valor
* se calcula utilizando la expansión de la serie de potencia
para
* arco tangente:
* *
* arctan (x) = x - (x ^ 3) / 3 + (x ^ 5) / 5 - (x ^ 7) / 7 +
* (x ^ 9) / 9 ...
* /
Arctan público BigDecimal estático (int inverseX,
escala int)
{
Resultado BigDecimal, numer, term;
BigDecimal invX = BigDecimal.valueOf (inverseX);
BigDecimal invX2 =
BigDecimal.valueOf (inverseX * inverseX);

numer = BigDecimal.ONE.divide (invX,


escala, modo redondeo);

resultado = numérico;
int i = 1;
hacer {
numer =
numer.divide (invX2, scale, roundingMode);
int denom = 2 * i + 1;
plazo =
numer.divide (BigDecimal.valueOf (denom),
escala, modo redondeo);
if ((i% 2)! = 0) {
resultado = resultado.subtract (término);
} más {
resultado = resultado.add (término);
}
i ++;
} while (term.compareTo (BigDecimal.ZERO)! = 0);
resultado de retorno;
}
}
La característica más interesante de este ejemplo es que el Compute objeto de
implementación nunca necesita la Pi definición de la clase hasta Pi que se
pasa un objeto como argumento al executeTask método. 

En ese punto, RMI carga el código de la clase en la Compute máquina virtual Java del
objeto, executese invoca el método y se ejecuta el código de la tarea. El resultado, que
en el caso de la Pi tarea es un BigDecimal objeto, se devuelve al cliente que realiza
la llamada, donde se utiliza para imprimir el resultado del cálculo.

4. COMPILAR Y EJECUTAR UN EJEMPLO


Ahora que se escribió el código para el ejemplo del motor de proceso, debe compilarse y
ejecutarse.

4.1. Compilar los programas de ejemplo

Para compilar estos programas, ahora se crea un archivo JAR (Java Archive)
que contenga las interfaces de compute y Task para que las clases del
servidor se implementen y los del cliente los utilice

Este ejemplo que vimos a lo largo del texto, separa las interfaces y la
implementación de objetos remotos y el código del cliente en 3 paquetes:

- Compute – compute y Task Para interfaces

- Engine – ComputeEngine clase de implementación

- Client – Computepi Código del cliente y pi


implementación de tareas

En los siguientes puntos veremos solo el código que se utiliza para


diferentes sistemas operativos para realizar la creación o construcción de
las clases:

 CREAR UN ARCHIVO JAR DE CLASES DE INTERFAZ


 CONSTRUYENDO LAS CLASES DEL SERVIDOR

 CONSTRUYENDO LAS CLASES DEL CLIENTE

4.2. Ejecutar los programas de ejemplo

 Una nota de seguridad

Tanto los programas del servidor como del cliente se ejecutan con
un administrador de seguridad instalado, para que cualquier
código que se desee ejecutar tenga los permisos de seguridad. A
continuación, un ejemplo del código para usar con el programa del
servidor:
otorgar codeBase "archivo: / home / ann / src /" {
permiso java.security.AllPermission;
};
Con el programa del cliente sería el siguiente:
otorgar codeBase "archivo: / home / jones / src /" {
permiso java.security.AllPermission;
};
 Iniciando el servidor:

Antes de iniciar el motor de calculo se necesita iniciar el RMI. Y se


inicia de la siguiente manera:

El registro luego se ejecuta en el puerto 1099. Para iniciar el


registro en un puerto diferente, se especifica el numero del puerto
en la línea del comando.

Y finalmente se puede iniciar el servidor con el código siguiente:

Los siguientes comandos de java definen las siguientes propiedades en


el sistema:

 java.rmi.server.codebase: Propiedad que especifica la


ubicación, una URL de base de código, desde la cual se pueden
descargar las definiciones de clases que se originan en este
servidor. 
 java.rmi.server.hostname: Propiedad especifica el
nombre de host o la dirección para colocar en los apéndices para
los objetos remotos exportados en esta máquina virtual Java. 
 java.net.InetAddress.getLocalHost: API. Sin
embargo, a veces, esta dirección no es apropiada para todos los
clientes y un nombre de host totalmente calificado sería más
efectivo. 
  java.security.policy: Propiedad se utiliza para
especificar el archivo de política que contiene los permisos que
desea otorgar.

 Iniciando el cliente

Una vez ejecutado el registro y el motor de computo, el cliente


puede iniciar, especificando lo siguiente:

 La ubicación donde el cliente sirve sus clases


usando java.rmi.server.codebase.

 java.security.policy utilizada para


especificar el archivo de política de seguridad que
contiene los permisos.

 El nombre de host del servidor y el número de


lugares decimales para usar en el  cálculo.

Y se inicia el cliente de la siguiente manera:

Después de iniciar el cliente, se muestra la siguiente salida:

3.141592653589793238462643383279502884197169399

Finalmente, la Pi clase se carga en la ComputeEngine


máquina virtual Java del servidor cuando el Pi objeto se pasa en
la executeTask llamada remota al ComputeEngine
objeto. El Pi servidor carga la clase desde el servidor web o el
sistema de archivos del cliente, dependiendo del tipo de URL de
base de código utilizada al iniciar el cliente.

Cuestionario final

1.- ¿Cómo están definidas o especificadas las interfaces en sus programas?


2.- ¿Que métodos ha implementado?

3.- ¿Se usa un localizador de nombres para registrar los servicios exportados en la práctica?

4.- ¿Qué relación tiene ORB con RMI de Java?

Java RMI tiene su propio ORB (Obejct Request Broker), a pesar de que RMI es un ORB es forma
general, no es un modelo compatible con CORBA. La relación que tiene el RMI de Java con
ORB, es que, RMI funciona como un ORB en la forma en que las llamadas o peticiones se hacen
a un objeto que proporciona el servicio deseado.

Es decir, un proceso solicita o hace un llamado al objeto apropiado que desea, luego de
manera rápida este RMI de Java redirige la petición al objeto apropiado, que en nuestro
laboratorio lo llamamos como “SERVIDOR_C”. RMI de Java invoca a un proceso a métodos de
un objeto, el cual está situado en un ordenador remoto.

Como dato adicional este RMI de Java puede acceder potencialmente a diversos objetos
remotos, funcionando, así como un ORB de una forma más generalizada. Y esa vendría a ser la
relación que tiene el Paradigma ORB y el RMI de Java.

5.- RMI tiene 4 capas, haga la analogía con lo existente en sus programas de la práctica 1

6.- Suponga que C no está disponible siempre, sino en forma intermitente, por lo que un dato
es devuelto y almacenado en B, esperando que C vuelva a estar activo luego de unos
segundos, ¿qué cambios tendría que efectuar en sus programas?, entre en tantos detalles
como sea posible. Este es uno de los problemas de los sistemas distribuidos, de una respuesta
de preferencia con pseudocódigo y código en Java para superar la intermitencia de C. Para
hacer más simple el problema supongamos que B calcula el factorial de un número que le
transfiere A por invocación de un método en B, siempre que C le autorice a hacerlo, B manda
el nombre de A y C autoriza previa identificación del cliente. B , B “sabe” que en la anterior
ocasión fue autorizada la operación factorial desde A con un cliente X, de alternativas de
solución.

Se genera desde A la invocación de Factorial(4, “Alfredo”)

C atiende muchas solicitudes para autorizar operaciones en B

7.- ¿Qué diferencias tienen los programas con lo indicado con Java RMI en?

https://docs.oracle.com/javase/tutorial/rmi/index.html

Conclusiones

Presente las conclusiones, esta es la parte más importante con lo que sustenta buena parte de
su informe.

Anexar el código fuente de los tres programas

También podría gustarte