Practica1 JAVA RMI Modelo Informe
Practica1 JAVA RMI Modelo Informe
Objetivos:
Se evaluará (rúbrica)
Introducción
A C
B
Elaborar un resumen de Java RMI en base a :
https://docs.oracle.com/javase/tutorial/rmi/index.html
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
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.
Una aplicación distribuida creada mediante Java RMI, esta compuesta por
interfaces y clases.
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.
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:
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;
Segunda Interfaz:
paquete de cómputo;
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;
Public ComputeEngine () {
súper();
}
} catch (Excepción e) {
System.err.println ("Excepción ComputeEngine:");
e.printStackTrace ();
}
}
}
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.
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;
importar compute.Task;
import java.io.Serializable;
import java.math.BigDecimal;
/ **
* 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);
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.
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:
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:
Iniciando el cliente
3.141592653589793238462643383279502884197169399
Cuestionario final
3.- ¿Se usa un localizador de nombres para registrar los servicios exportados en la práctica?
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.
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.