Ensamblaje de Un PC Paso Por Paso

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

PRESENTACI•N DE JDEVELOPER

arquitectura f•sica en 3 niveles usando java rmi

1. Objetivos:
● Mostrar c•mo se pueden desplegar los tres niveles (presentaci•n, l•gica del negocio y datos) en una
arquitectura f•sica de tres niveles: cliente con la presentaci•n, un servidor de aplicaciones (con la l•gica
del negocio) que se invoca desde el cliente mediante RMI y un servidor de datos con la BD.

2. Tareas a realizar:
Para la realizaci•n de este laboratorio se proporciona tres clases: EntradaSistemaBDRemoto.java,
InterfaceRemotoLogicaNegocio.java y PresentacionRemoto.java, con el objeto de ejecutar los
mismos usando una arquitectura f•sica en 3 niveles, para ello:

1. Descomprimir el fichero LabRMI.zip, el cual contiene las clases anteriores, la BD de passwords,


un fichero con la pol•tica de seguridad y un fichero .bat que permite generar los Stubs y los Skeleton.

2. Crear un workspace y un proyecto donde a•ad•is las clases anteriores.

3. Comprobar qu• clases corresponden al Servidor RMI, Cliente RMI e Interfaz Remota y
completarlas si es necesario. Compilar las clases.

4. Lanzar en forma local el Servidor RMI, Cliente RMI y RMIRegistry en el orden apropiado. •Que
sucede? Nos podemos comunicar.

5. Crear los Stubs y Skeletons (utilizar el fichero de comando crearStubs.bat, modificando lo que sea
necesario) •Que sucede? Tenemos los permisos apropiados.

6. Definir la opci•n de seguridad al lanzar el cliente RMI y el servidor RMI

7. Ejecutar la aplicaci•n en 3 niveles f•sicos: colocando cada nivel en una m•quina diferente.

8. Ejecutar la aplicaci•n en 3 niveles f•sicos, y adem•s, realizando lo necesario para que en la m•quina
cliente, la que ejecuta el nivel de presentaci•n, no est• la clase STUB.

Os recomiendo que intent•is realizar lo anterior consultando en primer lugar el ejemplo orientativo y
las transparencias de la asignatura pensando un poco lo que se est• pidiendo. Pero, si quer•is una
ayuda m•s detallada de lo que se pide, consultad este otro documento o bien el siguiente documento
que contiene un resumen de RMI (ResumenRMI.htm).

3. Ejemplo orientativo: Aqu• se proporciona un ejemplo muy simple de RMI que suma dos
numeros, basado en el tutorial http://www.chuidiang.com/java/rmi/rmi.php. Este ejemplo nos

http://siul02.si.ehu.es/~jimena/ISO/LAB_4/LAB_4.htm (1 de 5)07/06/2012 19:15:37


PRESENTACI•N DE JDEVELOPER

servira de gu•a pero antes de mostrar el ejemplo recordaremos qu• necesitamos para implementar
RMI.

● InterfaceRemota. La cual contendra los m•todos que deseamos invocar de forma remota, es
decir, los m•todos que queremos llamar desde el cliente, pero que se ejecutar•n en el servidor.

● ObjetoRemoto. Es la clase que implementa los m•todos de la InterfaceRemota. Esta clase s•lo
la conoce el servidor de RMI.

● ObjetoRemoto_Stubs. Esta clase es la que conoce el cliente y no necesitamos codificarla,


java lo hace autom•ticamente a partir del ObjetoRemoto. En otras palabras, es una clase que
implementa InterfaceRemota, pero cada m•todo se encarga de hacer una llamada a trav•s de
red al ObjetoRemoto del servidor, esperar el resultado y devolverlo

● FicheroDeSeguridad. En este fichero indica qu• conexiones pueden o no establecerse entre el


servidor y el cliente RMI. Debe haber un fichero de pol•tica de seguridad (java.policy) tanto
en el Servidor como en el Cliente RMI.

En el servidor se debe ejecutar dos programas

● RMIREGISTRY. Proporcionado por Java con el objetivo de registrar los objetos que pueden
ser invocados remotamente, adem•s de gestionar las peticiones de los clientes.

● Servidor. Basicamente es una clase a construir que debe instanciar el ObjetoRemoto y


registrarlo en el rmiregistry.

En el el cliente se debe correr un programa

● Cliente. Consiste en una clase que debe pedir al servidor una referencia al ObjetoRemoto (es
decir, ObjetoRemoto_Stbus) para as• poder invocar a los m•todos. Los m•todos se ejecutar•n
en el Servidor, pero Cliente quedar• bloqueado hasta que Servidor termine de ejecutar el
m•todo.

Veamos ahora los elementos antes enunciado pero en mayor profundidad.

InterfaceRemota

Lo primero que se debe hacer es una interface con los m•todos a invocar. Esta interface tiene que
tener el siguiente aspecto:

import java.rmi.Remote;
public interface InterfaceRemota extends Remote {
public int suma (int a, int b) throws java.rmi.RemoteException;
}

http://siul02.si.ehu.es/~jimena/ISO/LAB_4/LAB_4.htm (2 de 5)07/06/2012 19:15:37


PRESENTACI•N DE JDEVELOPER

Para que el objeto sea remoto debe heredar de la interface Remote. Adem•s de incorporar los m•todos
que queramos invocar acompa•ados cada uno de ellos con una excepxion (java.rmi.
RemoteException) la cual se producir• si hay alg•n problema con la comunicaci•n entre los dos
ordenadores o cualquier otro problema con RMI.

Otro aspecto importantes es que todos los par•metros y valores devueltos por estos m•todos deben ser
tipos primitivos de java o bien clases que implementen la interface Serializable de java. De esta
forma, tanto los par•metros como el resultado podr•n "viajar" por red del cliente al servidor y al rev•s.

ObjetoRemoto

Al ser la clase que implementa la InterfaceRemota debe a su vez implementar la interface Remote de
java. Obtener una referencia remota a objetos trae consigo una serie de complejidades que
afortunademante son manejadas por java mediante la herencia de la clase UnicastRemoteObject.
Obviamente no es necesario heredar de UnicastRemoteObject, pero la forma de registrar e
implemntar los m•todos var•a un poco.

import java.io.Serializable;
public class ObjetoRemoto extends UnicastRemoteObject implements InterfaceRemota {
public int suma(int a, int b) {
System.out.println ("sumando "+ a +" + "+ b +"...");
return a+b;

}
}

ObjetoRemoteStubs

Tras compilar el objeto remoto en el servidor es necesario crear la "clase de stubs". Esta clase Strubs
es una clase que contiene los mismos m•todos que nuestro ObjetoRemoto, pero con capacidad de
gestionar el envio y recepci•n de mensaje por red. Java proporciona una herramienta llamada RMIC
la cual recibe como parametro la clase ObjetoRemoto y nos devuelve la clase de stubs
ObjetoRemoto_stubs. Para ello es necesario configurar el directorio en el cual se encuentra nuestra
clase ObjetoRemoto y ejecutar rmic

$ set CLASSPATH=C:\Lab4
$ rmic ObjetoRemoto

Esto generarar• un ObjetoRemoto_stubs.class y un ObjetoRemoto_Skel.class. El primero debe estar


visible tanto en el cliente como en el servidor, es decir, deben aparecer en el CLASSPATH de ambos.
Eso implica que debe estar situado en el servidor en un sitio p•blico al que el cliente tenga acceso o
que se debe suministar una copia al cliente. El ObjetoRemoto_Skel.class se gener• por defecto y s•lo
es •til para clientes con java anterior a la versi•n 1.2. Para los java m•s modernos no tiene utilidad.

Nota: En JDeveloper RMIC se encuentra en "C:\Archivos de programa\Oracle\JDev9i\jdk1.3\bin


\rmic"

http://siul02.si.ehu.es/~jimena/ISO/LAB_4/LAB_4.htm (3 de 5)07/06/2012 19:15:37


PRESENTACI•N DE JDEVELOPER

FicheroDeSeguridad

El fichero de permisos por defecto debe llamarse java.policy y estar en el HOME del usuario que
lanza el servidor o el cliente de RMI. Se debe agregar la siguente linea al fichero:

grant { permission java.security.AllPermission; };

Esta no es la opci•n m•s segura, pero de momento nos vale. Si al ejecutar la aplicaci•n tenemos
problemas de permiso debemos forzar el uso de este fichero; esto se hace agregando la propiedad
"java.security.policy" de la siguiente manera o bien por l•nea de comando.

System.setProperty ("java.security.policy","HOME/java.policy");

ServidorRMI

Sera el encargado de instanciar y registrar el objeto remoto. Para ello se debe indicar, en formato
URL, el path donde se encuentra el objeto remoto.

System.setProperty ("java.rmi.server.codebase", "file://localhost/prueba_servidor/");

Instanciar una clase remota y luego registrarla en el servidor de RMI es sencillo.

ObjetoRemoto objetoRemoto = new ObjetoRemoto();


Naming.rebind ("ObjetoRemoto", objetoRemoto);

Para registrarla hay que llamar al m•todo est•tico rebind() de la clase Naming. Se le pasan dos
par•metros. Un nombre para poder identificar el objeto y una instancia del objeto. El nombre que
hemos dado debe conocerlo el cliente, para luego poder pedir la instancia por el nombre. El m•todo
rebind() registra el objeto. Si ya estuviera registrado, lo sustituye por el que acabamos de pasarle.

ClienteRMI

Es quien utiliza el objeto de forma remota. Los pasos que debe realizar este programa son los
siguientes. Pedir el objeto remoto al servidor de rmi. El c•digo para ello es sencillo

InterfaceRemota objetoRemoto = (InterfaceRemota)


Naming.lookup ("//localhost/ObjetoRemoto");

Simplemente se llama al m•todo est•tico lookup() de la clase Naming. Se le pasa a este m•todo la
URL del objeto. Esa URL es el nombre (o IP) del host donde est• el servidor de rmi y por •ltimo el
nombre con el que se registr• anteriormente el objeto.

Este m•todo devuelve un Remote, as• que debemos hacer un "cast" a InterfaceRemota para poder
utilizarlo. El objeto que recibimos aqu• es realmente un ObjetoRemoto_Stubs. Ahora estamos en
condiciones de invocar al m•todo suma

http://siul02.si.ehu.es/~jimena/ISO/LAB_4/LAB_4.htm (4 de 5)07/06/2012 19:15:37


PRESENTACI•N DE JDEVELOPER

System.out.print ("2 + 3 = ");


System.out.println (objetoRemoto.suma(2, 3));

Para que el c•digo del cliente compile necesita ver en su classpath a InterfaceRemota.class. Para que
adem•s se ejecute sin problemas necesita adem•s ver a ObjetoRemoto_Stubs.class, por lo que estas
clases deben estar accesibles desde el servidor o bien tener copias locales de ellas.

http://siul02.si.ehu.es/~jimena/ISO/LAB_4/LAB_4.htm (5 de 5)07/06/2012 19:15:37

También podría gustarte