RMI

jajo
25 de Octubre del 2005
que tal. alguien me puede dar una mano para empezar a utilizar el paquete java.rmi.* o al menos una direccion de donde sacar una ejemplo hecho porque leyendo la documentacion no he entendido mucho.
gracias

yerald_22
25 de Octubre del 2005
Yo tambien estoy empezando a utilizar RMI, no se si este ejemplito te sirva como a mi...

Guía para desarrollar e implantar Java - RMI paso a paso
Los ejemplos se basan en el siguiente enunciado:
Implementar un sistema cliente / servidor con RMI de Java2 en el cual
exista un servidor que haga la función de cartelera de mensajes, es decir, un
servidor en el cual los clientes puedan enviar mensajes para que aparezcan en la
salida del servidor, indicando además el nombre de host que envía el mensaje.
Por cada mensaje enviado el servidor deberá devolver un ID de mensaje recibido,
que no es mas que un contador interno de mensajes recibidos.

Paso (1) Fase de Diseño
Diseñar el diagrama de clases del proyecto separando la parte del cliente
de la del servidor, e indicar las interfaces remotas.

Paso (2) Declaración de Interfaces Remotas
Declarar las diferentes interfaces remotas que cada servidor va a proveer.
Para esto se debe hacer un archivo .java con la definición de la interfaz
especificando los métodos que se proveerán.
Ej.
InterfazServidor.java
import java.rmi.*; //importa el paquete de java rmi
// declara la interfaz remota “InterfazServidor”:
public interface InterfazServidor extends Remote
{
//Aquí se especifican cada uno de los métodos remotos a ofrecer
//Siguiendo la estructura que se indica en el ejemplo:
//publica un mensaje y devuelve el numero de mensaje publicado
public int publicarMensaje(String mensaje) throws RemoteException;
}

Paso (3) Implementación de las interfaces de los objetos remotos
Se procede a implementar la clase que instanciará objetos remotos del
servidor, es decir, implementar los métodos declarados en las interfaces ofrecidas
además de los métodos privados necesarios para el funcionamiento de la clase.
ImplementacionServidor.java
//Se declara la clase implementación que extiende a
// UnicastRemoteObject (Clase de objetos remotos) e implementa cada una de las
// interfaces (para el ejemplo hay solo una interfaz, la interfaz que se ofrece al //
cliente
import java.rmi.*;
import java.rmi.server.*;
class ImplementacionServidor extends UnicastRemoteObject implements
InterfazServidor
{
int mensajeActual;
//Siempre debe existir este constructor declarado con el throw que se indica
public ImplementacionServidor() throws RemoteException
{
mensajeActual=0;
}
//Se implementan los métodos declarados en la interfaz:
// this.getClientHost() devuelve el IP o nombre de host del cliente que hizo
// el llamado a este método
public int publicarMensaje(String mensaje) throws RemoteException
{ mensajeActual++;
try
{
System.out.println("Mensaje del host " + this.getClientHost()+ ": " +
mensaje);
}
catch (Exception e)
{
System.out.println(e);
}
return mensajeActual;
}

Paso (4) Implementación del Servidor
Se procede a implementar la clase principal del servidor, es decir, la que se
instanciará desde la consola del sistema operativo. Esta clase registrará el objeto
remoto a el registro RMI.
Servidor.java
import java.rmi.*;
import java.rmi.server.*;
public class Servidor
{
public static void main(String args[])
//como primer y único parámetro se introduce el nombre de servicio
{
try
{
//se instancia el objeto remoto a ofrecer
ImplementacionServidor remoteObject = new ImplementacionServidor();
//se registra el objeto remoto:
//:55700 es opcional, representa el puerto en el cual esta sirviendo
// el registro RMI, si se omite el puerto por defecto es el 1099
Naming.rebind("//localhost:55700/"+args[0], remoteObject);
System.out.println("Servidor " +args[0]+" registrado.");
} catch (Exception e)
{System.out.println("Excepcion: "+ e);}
}
}

Paso (5) Implementación del Cliente
Se procede a implementar la clase principal del cliente. Aquí se hará una
búsqueda del objeto remoto que se desea utilizar, para luego llamar a cualquiera
de los métodos ofrecidos por la interfaz remota.
Cliente.java
import java.rmi.*;
public class Cliente
{
public static void main(String args[])
//Parámetros: IPSERVIDOR NOMBRESERVICIO “MENSAJE”
{
try
{
//Crea una referencia local al objeto remoto
InterfazServidor objetoRemoto = (InterfazServidor)Naming.lookup("//" +
args[0] + ":55700/" + args[1]);
System.out.println("Mensaje enviado, ID = " + objetoRemoto.
publicarMensaje(args[2]));
//Se llama al método remoto publicarMensaje
} catch (Exception e) {System.out.println(e);}
}
}

Paso (6) Se compilan los archivos .java para generar las clases
En la consola del sistema operativo ejecutar:
java Servidor.java
java Cliente.java
Paso (7) Se compila la clase implementación para la generación del stub
Los stub son objetos instanciados en las máquinas de los clientes con los
cuales se hace referencia a los objetos remotos. Para compilar una
implementación y generar el stub se ejecuta en una consola:
rmic ImplementacionServidor –v1.2
nota –v.12 omite la generación del skeleton, clase utilizada solo en
versiones de Java1

Paso (8) Distribución de clases en cliente y servidor
La ejecución del cliente y servidor se puede hacer local desde una misma
carpeta, o bien se pueden distribuir los archivos en distintas máquinas para que
quede el servidor aislado del cliente.
Archivos que debe tener la carpeta del servidor:
Servidor.class
ImplementacionServidor.class
InterfazServidor.class
ImplementacionServidor_stub.class
Archivos que debe tener la carpeta del cliente:
Cliente.class
InterfazServidor.class
ImplementacionServidor_stub.class

Paso (9) Se instancia el registro RMI de Java
En la consola del sistema operativo ejecutar “rmiregistry”, se puede ejecutar
sin parámetros o indicando el puerto en el cual se desea montar el servicio. Este
programa se encargará de registrar los objetos remotos ofrecidos por los
servidores en el host local y de escuchar las llamadas a los mismos de los
clientes.
Ej.
rmiregistry 55700
Nota: la llamada a rmiregistry es bloqueante, es decir, este programa se
mantiene en ejecución por un tiempo indeterminado (si no se especifíca). Cierre la
ventana bloqueda solo una vez haya terminado de trabajar con el servidor.

Paso (10) Se instancia el servidor
En la consola del sistema operativo se instancia el servidor:
Ej.
java Servidor Cartelera
Nota: el parámetro Cartelera se usa en el ejemplo como nombre del servicio
rmi.

Paso (11) Se instancia el cliente
En la consola del sistema operativo se instancia el cliente:
Ej.
Java Cliente 127.0.0.1 Cartelera “Hello World”