Ensamblaje de Un PC Paso Por Paso
Ensamblaje de Un PC Paso Por Paso
Ensamblaje de Un PC Paso Por Paso
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:
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.
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
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.
● 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.
● 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.
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;
}
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
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:
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.
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
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
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.