You are on page 1of 9

Universidad ORT - Arquitectura de Software

Requisitos

Versin 1.5.x de la JDK de Java (o superior)


NetBeans como IDE de desarrollo
Variable de entorno JAVA_HOME definida en el path apuntando al directorio de instalacin
de Java.

Ejercicio de RMI
El objetivo es simular un ambiente de ejecucin distribuido donde una aplicacin instalada en una
mquina que acta como cliente puede invocar funcionalidad de otra aplicacin que reside en otra
mquina que acta como servidor.
Se construirn 3 componentes:
Interfaces distribuidas: contiene la interfaz Java remota con el mtodo que ser invocado
por la aplicacin cliente usando RMI.
Aplicacin cliente: contiene una clase Java que ser la que consuma el mtodo de la
interfaz remota
Aplicacin servidor: contiene una clase Java que implementa el mtodo invocado por el
cliente y otra clase Java que publica la interfaz remota al cliente por RMI
Para cada componente se crear un proyecto en Netbeans con las clases Java correspondientes y se
generar un archivo JAR que se utilizar para ejecutar el ejercicio.

Creacin del proyecto Java para Interfaces Distribuidas

En la IDE de NetBeans, crear un proyecto seleccionando de la categora Java la opcin Java


Application.

Asignarle el nombre InterfacesDistribuidas y definir la ubicacin del proyecto en la


carpeta D:\ArqSoft\Practico2009.

Asegurarse de DESMARCAR las opciones Set as Main Project y Create Main Class y
finalizar.

Dentro del proyecto creado, posicionarse en la carpeta Source Packages y crear un nuevo
Java Package con el nombre rmi

Crear la interface Java con nombre Saludo en el package rmi y declarar un mtodo
getSaludo:

public interface Saludo extends Remote {


String getSaludo() throws RemoteException;
}

Posicionarse en el proyecto y seleccionar la opcin Clean and build del men contextual.
Luego pasar a la vista Files y verificar que en la estructura del proyecto se ha creado un
directorio dist que contiene el componente InterfacesDistribuidas.jar
Prctico 2009

Universidad ORT - Arquitectura de Software

Creacin del proyecto Java para la Aplicacin Servidor

En la IDE de NetBeans, crear un proyecto seleccionando de la categora Java la opcin Java


Application.

Asignarle el nombre AplicacionServidorRMI y definir la ubicacin del proyecto en la


carpeta D:\ArqSoft\Practico2009.

Asegurarse de DESMARCAR las opciones Set as Main Project y Create Main Class y
finalizar.

Dentro del proyecto creado, posicionarse en la carpeta Libraries y seleccionar la opcin add
project del men contextual. Se abrir un dilogo de Windows donde se mostrarn los
proyectos del workspace. Seleccionar el proyecto InterfacesDistribuidas y confirmar la
seleccin. Verificar que se haya agregado a la lista de libreras el archivo JAR que contiene
la interfaz remota Saludo.

Posicionarse en la carpeta Source Packages y crear un nuevo Java Package con el nombre
com.negocio.servidor

En el package anterior crear la siguiente clase SaludoImpl que implementa la interface


Saludo:

public class SaludoImpl implements Saludo {


/** Creates a new instance of SaludoImpl */
public SaludoImpl() {
}
public String getSaludo() throws RemoteException {
return "HOLA VERANOOOOOOO!!!!!!!!";
}
}

Crear en el mismo package la clase ServidorSaludos que publicar la interfaz remota a


travs de RMI y actuar de servidor de llamados del cliente:

public class ServidorSaludos {


/** Creates a new instance of ServidorSaludos */
public ServidorSaludos() {
}
public static void main(String args[]) {
try {
// Exporto el objeto remoto y obtengo un "stub" de la interface
SaludoImpl saludoImpl = new SaludoImpl();
Saludo stub = (Saludo) UnicastRemoteObject.exportObject(saludoImpl, 0);
// Creo una entrada en el Registry asociada al puerto 8885.
// Por omision se asume que el servidor es localhost.
Registry registry = LocateRegistry.createRegistry(8885);
// Asocio el stub del objeto remoto con un "key"
registry.bind("objetoSaludador", stub);

Prctico 2009

Universidad ORT - Arquitectura de Software

System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}

Posicionarse en el proyecto y seleccionar la opcin Properties del men contextual. Se


abrir un dilogo de Windows que muestra sobre la izquierda la lista de propiedades
configurables en el proyecto. Seleccionar de la lista la propiedad Run y definir como Main
Class del proyecto la clase ServidorSaludos:

Posicionarse en el proyecto y seleccionar la opcin Clean and build del men contextual.
Luego pasar a la vista Files y verificar que en la estructura del proyecto se ha creado un
directorio dist que contiene el componente AplicacionServidorRMI.jar. Ntese que
tambin se gener un subdirectorio lib con el archivo JAR de interfaces remotas que
habamos declarado en la librera del proyecto.

Creacin del proyecto Java para la Aplicacin Cliente

En la IDE de NetBeans, crear un proyecto seleccionando de la categora Java la opcin Java


Application.

Asignarle el nombre AplicacionClienteRMI y definir la ubicacin del proyecto en la


carpeta D:\ArqSoft\Practico2009.

Asegurarse de DESMARCAR las opciones Set as Main Project y Create Main Class y
finalizar.

Dentro del proyecto creado, posicionarse en la carpeta Libraries y seleccionar la opcin add
project del men contextual. Se abrir un dilogo de Windows donde se mostrarn los
proyectos del workspace. Seleccionar el proyecto InterfacesDistribuidas y confirmar la
seleccin. Verificar que se haya agregado a la lista de libreras el archivo JAR que contiene
la interfaz remota Saludo.

Posicionarse en la carpeta Source Packages y crear un nuevo Java Package con el nombre
com.negocio.cliente
Prctico 2009

Universidad ORT - Arquitectura de Software

En el package anterior crear la clase PedidorSaludos que invocar el mtodo de la interfaz


remota Saludo:

public class PedidorSaludos {


/** Creates a new instance of PedidorSaludos */
public PedidorSaludos() {
}
public static void main(String[] args) {
// Por parametro se especifica el host que oficia de server del objeto
// remoto. Si no se especifica, se asume localhost como server.
String host = (args.length < 1) ? null : args[0];
try {
// Obtengo una instancia de Registry que "apunta" al puerto 8885
// del host indicado como server
Registry registry = LocateRegistry.getRegistry(host, 8885);
// Solicito al registry que me retorne el stub del objeto remoto
// que esta mapeado con el key indicado.
Saludo saludo = (Saludo) registry.lookup("objetoSaludador");
// Invoco el metodo del objeto remoto a traves de su stub
String response = saludo.getSaludo();
System.out.println("Respuesta del saludador en " + host + ": " +
response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}

Posicionarse en el proyecto y seleccionar la opcin Properties del men contextual.


Configurar la propiedad Run de igual forma que en la aplicacin servidor, pero en este caso
la clase main ser PedidorSaludos.

Posicionarse en el proyecto y seleccionar la opcin Clean and build del men contextual.
Luego pasar a la vista Files y verificar que en la estructura del proyecto se ha creado un
directorio dist que contiene el componente AplicacionClienteRMI.jar. Ntese que tambin
se gener un subdirectorio lib con el archivo JAR de interfaces remotas que habamos
declarado en la librera del proyecto.

Compilacin y distribucin
Verificar que la estructura del workspace haya quedado as:

Prctico 2009

Universidad ORT - Arquitectura de Software

Si bien se puede realizar la prueba con ambas aplicaciones Servidor y Cliente en la misma
mquina, es interesante comprobar el comportamiento de RMI distribuyendo el Cliente a otra
mquina. Para ello alcanza con copiar el contenido del directorio dist del proyecto
AplicacionClienteRMI a una mquina y el contenido del directorio dist del proyecto
AplicacionServidorRMI a otra.

Ejecucin y prueba

En la mquina que acta de servidor:


o Abrir una lnea de comandos DOS y posicionarse en el directorio donde se copi la
distribucin de la aplicacin servidor
o Ejecutar el archivo JAR:

En la mquina que acta de cliente:


o Abrir una lnea de comandos DOS y posicionarse en el directorio donde se copi la
distribucin de la aplicacin servidor
o Ejecutar el archivo JAR:

Prctico 2009

Universidad ORT - Arquitectura de Software

Prctico 2009

Universidad ORT - Arquitectura de Software

Ejercicio de Serializable
Extensin del Ejercicio anterior
El objetivo es mostrar el envo de parmetros en una invocacin desde un cliente remoto a una clase
en el servidor.

En el proyecto InterfacesDistribuidas crear la clase Parametro en el package rmi:

public class Parametro implements Serializable {


private String value;
public Parametro() {}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

Agregar a la interface remota Saludo el siguiente mtodo:

void mostrarParametro(Parametro parametro) throws RemoteException;

En el proyecto AplicacionServidorRMI implementar este mtodo en la clase SaludoImpl:

public void mostrarParametro(Parametro parametro) throws RemoteException {


System.out.println("Soy el servidor que saluda!. Valor parmetro=" +
parametro.getValue());
}

En el proyecto AplicacionClienteRMI modificar la clase PedidorSaludos para que llame al


nuevo mtodo enviando como parmetro una instancia de Parametro:
Parametro param = new Parametro();
param.setValue("ORT");
saludo.mostrarParametro(param);

Compilar los proyectos nuevamente y distribuir los JARs a las mquinas correspondientes.

Repetir la ejecucin de la prueba.

Prctico 2009

Universidad ORT - Arquitectura de Software

Ejercicio de Externalizable
El objetivo es mostrar de qu forma se puede realizar la serializacin manual de los parmetros en
una invocacin desde un cliente remoto a una clase en el servidor. Para esto, la clase que se serializa
debe implementar los mtodos writeExternal() y readExternal().

Extensin del Ejercicio anterior

En el proyecto InterfacesDistribuidas crear la clase ParametroExternalizado en el package


rmi:

public class ParametroExternalizado implements Externalizable {


Parametro param;
int entero = 0;
boolean bool = false;
// Constructor vaco de la clase
public ParametroExternalizado() {
this.param = null;
}
// Constructor de la clase
public ParametroExternalizado(Parametro param) {
this.param = param;
}
public boolean isBool() {
return bool;
}
public void setBool(boolean bool) {
this.bool = bool;
}
public int getEntero() {
return entero;
}
public void setEntero(int entero) {
this.entero = entero;
}
public Parametro getParam() {
return param;
}
public void setParam(Parametro param) {
this.param = param;
}
// Mtodo que escribe la serializacin
public void writeExternal(ObjectOutput output) throws IOException {
output.writeBoolean(this.bool);
output.writeInt(this.entero);
if (this.param != null) {
output.writeBoolean(true);
output.writeObject(this.param);
} else {
output.writeBoolean(false);
}
}
// Mtodo que permite leer el stream serializado
Prctico 2009

Universidad ORT - Arquitectura de Software

public void readExternal(ObjectInput input) throws IOException,


ClassNotFoundException {
this.bool = input.readBoolean();
this.entero = input.readInt();
if (input.readBoolean()) {
this.param = (Parametro) input.readObject();
} else {
this.param = null;
}
}
}

Agregar a la interface remota Saludo el mtodo que procesar el nuevo parmetro:

void mostrarParametroEx(ParametroExernalizado param) throws RemoteException;

En el proyecto AplicacionServidorRMI implementar este mtodo en la clase SaludoImpl:

public void mostrarParametroEx(ParametroExernalizado param) throws RemoteException {


System.out.println("Booleano: " + param.isBool());
System.out.println("Entero: " + param.getEntero());
if (param.getParam() != null) {
System.out.println("Value: " + param.getParam().getValue());
} else {
System.out.println("Value: null");
}
}

En el proyecto AplicacionClienteRMI modificar la clase PedidorSaludos para que llame al


nuevo mtodo enviando como parmetro una instancia de ParametroExternalizado:
ParametroExernalizado ex = new ParametroExernalizado();
ex.setBool(false);
ex.setEntero(123);
ex.setParam(param);
saludo.mostrarParametroEx(ex);

Compilar los proyectos nuevamente y distribuir los JARs a las mquinas correspondientes.

Repetir la ejecucin de la prueba.

Prctico 2009