Diapositivas del Tema 7

Anuncio
TEMA 7: Paso de Mensajes con RMI
CONTENIDO:
Conceptos de Programación Distribuida
Remote Method Invocation (RMI) en Java
El Nivel de Resguardos
La Responsable de que Todo Funcione: la interfaz
El precompilador rmic
Arquitectura Completa de una Aplicación
Evoluciones Reseñables
BIBLIOGRAFÍA:
[Eck02] Eckel, B. Piensa en Java. Prentice Hall, 2002.
[Hil00] Hilderink et al. Communicating Threads for Java. Draft.
[Vin97] Vinoski, S. CORBA: Integrating Diverse…IEEE
Communications Magazine, vol. 35, nº 2, February, 1997.
[Gro01] Grosso, W. Java RMI. O’Reilly, 2001.
1
Conceptos de Programación Distribuida
¾
¾
¾
¾
¾
¾
No existe memoria común
Comunicaciones
No existe un estado global del sistema
Grado de Transparencia
Escalables
Reconfigurables
2
Modelos de Programación Distribuida
¾
Modelo de Paso de Mensajes
; Operaciones
¾
send y receive
Modelo RPC
; Stubs
de cliente y servidor
; Visión en Java es RMI
¾
Modelos de Objetos Distribuidos
; DCOM
de Microsoft
; Jini de Sun
; CORBA de OMG
3
Modelo de Paso de Mensajes
¾
¾
¾
Mecanismo para comunicar y sincronizar entidades
concurrentes que no pueden o no quieren compartir
memoria
Llamadas send y receive
Tipología de las llamadas:
¾
Bloqueadas-No bloqueadas
¾ Almacenadas-No almacenadas (en buffer)
¾ Fiables-No Fiables
¾
En Unix:
¾
¾
Pipes con y sin nombre
En Java:
¾
Sockets: Clases Socket y ServerSocket
¾ Canales: CTJ (Communicating Threads for Java)
4
Modelo General
SOLICITUD
CLIENTE
SERVIDOR
RESPUESTA
NUCLEO
NUCLEO
RED
5
Puertos (Breve repaso)
¾
El protocolo TCP (y también UDP) utilizan los
puertos para hacer llegar los datos de entrada a
un proceso concreto que se ejecuta en una
máquina
P
U
E
R
T
O
CLIENTE
SERVIDOR
TCP/UDP
6
P
U
E
R
T
O
CLIENTE
SERVIDOR
Solicitud de conexión
CLIENTE
P
U
E
R
T
O
P
U
E
R
T
O
SERVIDOR
PUERTO
7
Modelo Remote Procedure Call (RPC)
¾
¾
¾
¾
¾
Mayor nivel de abstracción
Llamadas a procedimiento local o remoto indistintamente
Necesita de stubs/skeletons (¡OCULTAMIENTO!)
Registro del servicio (Servidor de Nombres)
En Unix:
¾
Biblioteca rpc.h
¾ Representación estándar XDR
¾ Automatización parcial: especificación-compilador rpcgen
¾
En Java:
¾
Objetos remotos. Serialización
¾ Paquete java.rmi
¾ Automatización parcial: interfaz-compilador rmic
8
Llamando a un procedimiento remoto
Espacio del usuario
Programa cliente
func()
Espacio del usuario
Programa servidor
func(void)
{//codigo
………….
}
OBJETIVOS:
1. Efectuar la llamada como si tuviera carácter local
2. Enmascarar aspectos relativos a comunicaciones
3. ¿Y cómo lograrlo…?
Host local
Host remoto
9
Introducción del nivel de stubs
¾
¾
¾
¾
Efectúan el marshalling/unmarshalling de
parámetros.
Bloquean al cliente a la espera del
resultado.
Transparencia de ejecución remota
Interface con el nivel de red.
¾
¾
TCP
UDP
10
Esquema RPC con stubs
Proceso Cliente
Proceso Servidor
Programa Cliente
Funciones Servidor
callrpc
llamada
normal
rpcreturn
Stub del Cliente
Servicios de
Red
Núcleo Cliente
return
Stub del Servidor
RED
Servicios de
Red
Núcleo Servidor
11
¿Y cómo generar los stubs?
De forma manual
¾ De forma automática
¾
¾ Especificación
formal de interfaz
¾ Software específico
¾ rpcgen (C-unix)/rmic (Java)
12
Generación automática de stubs
Especificación Formal
Interface
Cliente
Ejecutable
C
O
M
P
I
L
A
R
Servidor
Ejecutable
Precompilador
rpcgen o rmic
Resguardo
Stub
Ficheros
compartidos
Resguardo
Skeleton
Cliente
Representación
de datos
Servidor
13
C
O
M
P
I
L
A
R
Dinamic Binding
Generador
de
Resguardos
Especificación Formal
Interface
Interfaz del
servidor+asa
create, read
delete, write
Res. Del Servidor
Res. Del Cliente
Read(f,d)
CONECTOR
SERVIDOR
d
CLIENTE
Petición de asa del servidor
Envío de asa
14
Breve Nota sobre RPC en C
Especificación de la interfaz del servidor remoto en un
fichero de especificación .x
/*rand.x*/
program RAND_PROG{
version RAND_VER{
void inicia_aleatorio(long)=1;
double obtener_aleat(void)=2;
}=1;
}=0x3111111;
¾
¾
¾
¾
Generación autómática de resguardos: $rpcgen rand.x
Distribuir y compilar ficheros entre las máquinas implicadas
Necesario utilizar representación XDR. Biblioteca xdr.h
15
RMI (Remote Method Invocation) en Java
¾
¾
¾
Permite disponer de objetos distribuidos utilizando Java
Un objeto distribuido se ejecuta en una JVM diferente o remota
Objetivo: lograr una referencia al objeto remoto que permita utilizarlo
como si el objeto se estuviera ejecutando sobre la JVM local
¾ Es similar a RPC, si bien el nivel de abstracción es más alto
¾ Se puede generalizar a otros lenguajes utilizando JNI
¾ RMI pasa los parámetros y valores de retorno utilizando serialización
de objetos.
Objeto
Cliente
Objeto
Servidor
JVM
JVM
16
RPC versus RMI
RPC
RMI
Carácter y Estructura de diseño
procedimental
Carácter y Estructura de diseño
orientada a objetos
Es dependiente del lenguaje
Es dependiente del lenguaje
Utiliza la representación externa de
datos XDR
Utiliza la serialización de objetos en
Java
El uso de punteros requiere el
manejo explícito de los mismos
El uso de referencias a objetos
locales y remotos es automático
NO hay movilidad de código
El código es móvil, mediante el uso
de bytecodes.
17
Llamadas locales vs. Llamadas remotas
¾
¾
Un objeto remoto es aquél que se ejecuta en una JVM diferente,
situada potencialmente en un host distinto.
RMI es la acción de invocar a un método de la interfaz de un objeto
remoto.
//ejemplo de llamada a método local
int dato;
dato = Suma (x,y);
//ejemplo de llamada a método remoto (no completo)
IEjemploRMI1 ORemoto =
(IEjemploRMI1)Naming.lookup(“//sargo:2005/EjemploRMI1”);
ORemoto.Suma(x,y);
18
Arquitectura RMI
Cliente
Servidor
Stub
Skeleton
Referencia
Remota
Referencia
Remota
Transporte
Transporte
¾ El servidor debe extender RemoteObject
¾ El servidor debe implementar una interfaz
diseñada previamente
¾ El servidor debe tener como mínimo un
constructor (nulo) que lanzará la excepción
RemoteException
¾ El método main del servidor debe lanzar
un gestor de seguridad
¾ El método main crea los objetos remotos
¾ El compilador de RMI (rmic) genera el stub
y el skeleton.
¾ Los clientes de objetos remotos se comunican
con interfaces remotas (diseñadas antes de…)
¾ Los objetos remotos son pasados por referencia
¾ Los clientes que llaman a métodos remotos
deben manejar excepciones.
19
La clase java.rmi.Naming
public static void bind(String name, Remote obj)
public static String[] list(String name)
public static Remote lookup(String name)
public static void rebind(String name, Remote obj)
public static void unbind(String name)
20
¿Cómo lograrlo?
public interfaz
extends Remote
{signaturas métodos}
implements
resultado
ref.metodo(param)
Implementación
de la interfaz
Cliente
new
SERVIDOR
referencia a interfaz
lookup
Nombre
Referencia
servicio
ref
bind ó rebind
21
implements
Definir Interfaz Remota
Implementar Interfaz
Remota
$ rmic .class
Skeleton
Stub
JVM
JVM
Implementar Servidor
Implementar Cliente
22
FASES DE DISEÑO RMI (1-INTERFACE)
¾
¾
¾
¾
¾
¾
¾
Escribir el fichero de la interfaz remota.
Debe ser public y extender a Remote.
Declara todos los métodos que el servidor remoto ofrece, pero
NO los
implementa. Se indica nombre, parámetros y tipo de retorno.
Todos los métodos de la interfaz remota lanzan
obligatoriamente la excepción RemoteException
El propósito de la interface es ocultar la implementación de los
aspectos relativos a los métodos remotos.
De esta forma, cuando el cliente logra una referencia a un
objeto remoto, en realidad obtiene una referencia a una
interfaz.
Los clientes envían sus mensaje a los métodos de la interfaz
23
EJEMPLO (FICHERO DE INTERFAZ)
/**Ejemplo del interfaz remoto para implementar un RMI
* @author Antonio Tomeu
*Es un servidor remoto aritmético.
*/
//se importan las clases del paquete rmi
import java.rmi.*;
//toda interface remota debe extender la clase Remote
public interface IEjemploRMI1 extends Remote
{
//todo metodo de la interfaz remota debe lanzar la
//excepcion RemoteException
int Suma(int x, int y) throws RemoteException;
int Resta(int x, int y) throws RemoteException;
int Producto(int x, int y) throws RemoteException;
float Cociente(int x, int y) throws RemoteException;
}
24
FASES DE DISEÑO RMI (2-IMPLEMENTACIÓN)
¾
¾
¾
¾
¾
¾
¾
La implementación del servidor es un fichero que realiza la
implementación de la interfaz definida previamente.
El servidor debe contener una clase que extienda a
UnicasRemoteObject.
Esa misma clase debe implementar a la interfaz remota
(implements)
Debe tener un constructor que lance RemoteException.
El método main debe lanzar un gestor de seguridad.
El método main debe crear los objetos remotos deseados.
El método main debe registrar al menos unos de los objetos
remotos.
25
EJEMPLO (IMPLEMENTACIÓN DE INTERFAZ Y SERVIDOR)
/**Ejemplo de implementacion del interfaz remoto para
* @author Antonio Tomeu
*/
//se importan los paquetes necesarios
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;
//el servidor debe siempre extender a UnicastRemoteObject
//el servidor debe simpre implementar la interfaz remota
public class EjemploRMI1
extends UnicastRemoteObject
implements IEjemploRMI1
{
26
un RMI
//aquí viene la implementación de los métodos que se
//declararon en la interfaz
public int Suma(int x, int y)
throws RemoteException
{return x+y;}
public int Resta(int x, int y)
throws RemoteException
{return x-y;}
public int Producto(int x, int y)
throws RemoteException
{return x*y;}
public float Cociente(int x, int y)
throws RemoteException
{ if(y == 0) return 1;
else return x/y;
}
//a continuacion viene el codigo del servidor. Hemos optado
//por incluirlo de manera conjunta, pero podia haber ido en
//un fichero aparte.
27
//es necesario que haya un constructor (nulo) como minimo, ya
//que debe lanzar RemoteException
public EjemploRMI1()
throws RemoteException
{//super();}
//el metodo main siguiente realiza el registro del servicio
public static void main(String[] args)
throws Exception
{
//crea e instala un gestor de seguridad que soporte RMI.
//el usado es distribuido con JDK. Otros son posibles.
System.setSecurityManager(
new RMISecurityManager());
//Se crea el objeto remoto. Podriamos crear mas si interesa.
EjemploRMI1 ORemoto = new EjemploRMI1();
//Se registra el objeto en la máquina remota. No hay que dar
//nombre de host, y se asume el puerto 1099.
Naming.bind(“Servidor",ORemoto);
System.out.println("Servidor Remoto Preparado");
}
}
28
FASES DE DISEÑO RMI (3- Generando STUB Y SKELETON)
Fichero de
implementación
de Interfaz
compilado
(Imp.class)
Fichero de
stub
(Imp_Stub.class)
Compilador de RMI
$ rmic imp
Fichero de
skeleton
(Imp_Skel.class)
$ rmic –vcompat EjemploRMI1
¾ Es necesario que en la máquina remota donde se aloje el servidor se sitúen también
los ficheros de stub y skeleton. (Cambios a partir de 1.5)
¾ Con todo ello disponible, se lanza el servidor llamando a JVM del host remoto, previo
registro en un DNS
¾ En nuestro caso, el servidor remoto se activó en hercules.uca.es sobre el puerto
1099.
$ java EjemploRMI1 &
29
FASES DE DISEÑO RMI (4-REGISTRO)
¾Método Naming.bind(“Servidor",ORemoto);
para registrar el objeto remoto creado requiere que el servidor
de nombres esté activo.
¾ Dicho servidor se activa con start rmiregistry en Win32
¾ Dicho servidor se activa con rmiregistry & en Unix.
¾ Se puede indicar como parámetro el puerto que escucha.
¾ Si no se indica, por defecto es el puerto 1099.
¾ El parámetro puede ser el nombre de un host como en
Naming.bind(“//sargo.uca.es:2005/Servidor",ORemoto);
30
FASES DE DISEÑO RMI (5-CLIENTE)
¾
¾
¾
¾
El objeto cliente procede siempre creando un objeto de
interfaz remota.
Posteriormente efectúa una llamada al método
Naming.lookup cuyo parámetro es el nombre y puerto
del host remoto junto con el nombre del servidor.
Naming.lookup devuelve una referencia que se
convierte a una referencia a la interfaz remota.
A partir de aquí, a través de esa referencia el programador
puede invocar todos los métodos de esa interfaz remota
como si fueran referencias a objetos en la JVM local.
31
EJEMPLO (CLIENTE)
/**Ejemplo de implementacion de un cliente para RMI
* @author Antonio Tomeu
*/
import java.rmi.*;
import java.rmi.registry.*;
public class ClienteEjemploRMI1
{
public static void main(String[] args) throws Exception
{
int a = 10;
int b = -10;
//Se obtiene una referencia a la interfaz del objeto remoto
//SIEMPRE debe convertirse el retorno del metodo Naming.lookup
//a un objeto de interfaz remoto
IEjemploRMI1 RefObRemoto =
(IEjemploRMI1)Naming.lookup("//hercules.uca.es/Servidor");
//Llamamos a los metodos del interfaz remoto.
System.out.println(RefObRemoto.Suma(a,b));
System.out.println(RefObRemoto.Resta(a,b));
System.out.println(RefObRemoto.Producto(a,b));
System.out.println(RefObRemoto.Cociente(a,b));
}
32
}
Distribución de Archivos
Cliente
Servidor
Interfaz.class
Interfaz.class
Servidor.class
Cliente.class
Implem_Stub.class
Implem_Stub.class
Implem_Skel.class
NOTA: A PARTIR DE jdk 1.2 LAS CLASES DE SKELETON NO SON NECESARIAS
33
EJERCICIO
¾
Descargue los ficheros IEjemploRMI1.java,
EjemploRMI1.java y ClienteEjemploRMI1.java
¾
Siga el guión auxiliar de prácticas (ver bloque del tema
actual) y desarrolle la arquitectura en local
Distribuya ahora la aplicación con un compañero
Escriba una interfaz de operaciones para números
complejos, utilizando tipos primitivos, llamada
IComplejo.java
Impleméntela en Complejo.java
¾
¾
¾
¾
Escriba código de servidor y cliente que hagan uso de la
misma. Guárdelos en ServerComplejo.java y
ClientComplejo.java
¾
Distribuya nuevamente la aplicación
34
¾
¾
¾
Acuerden una interfaz llamada interfaz_grupo_x.java
Un miembro del grupo escribirá el cliente_grupo_java y
el otro el servidor_grupo_x.java de manera
independiente. Una vez hecho, lancen la arquitectura
rmi.
Suban el Espacio de los alumnos un fichero
rmi_grupo_x.rar que contegan los tres ficheros.
35
EVOLUCIONES RESEÑABLES
A partir del jdk 1.2 la implementación
de RMI no necesita skeletons (con ese
nombre tenían poco futuro). El stub estará
en ambos lados.
¾ Recompile los ejemplos anteriores sin el
flag –vcompat
¾ A partir del jdk 1.5 se incorpora
Generación Dinámica de Resguardos
¾
36
EJERCICIOS
Pruebe los ejemplos anteriores sin
skeleton
¾ No obstante, ¿necesita el servidor algo a
pesar de todo ?
¾
37
RMI: CARACTERÍSTICAS AVANZADAS
Serialización de Objetos
¾ Gestión de la Seguridad: policytool
¾
Callback de Cliente
¾ Descarga Dinámica de Clases
¾
38
SERIALIZACIÓN: La interfaz Serializable
¾ Serializar un objeto es convertirlo en una cadena
de bits, posteriormente restaurada en el objeto
original
¾ Es útil para enviar objetos complejos en RMI
¾ Tipos primitivos se serializan autómaticamente
¾ Clases contenedoras también
¾ Objetos complejos deben implementar la interfaz
Serializable (es un flag) para poder ser
serializados
39
Ejemplo con serialización de una clase
import java.io.*;
import java.util.*;
public class cuentabanca
implements Serializable
{ int ccc; float saldo; String Titular;
public cuentabanca(int codigo, float deposito, String
nombre)
{ccc = codigo; saldo = deposito; Titular = nombre;}
public String toString()
{return("codigo = "+ccc+" saldo= "+saldo+" titular=
"+Titular);}
}
40
Interfaz
import java.io.*;
import java.rmi.*;
public interface intefaz
extends Remote
{
boolean deposito(int codigo, float cantidad)
throws RemoteException;
boolean reintegro(int codigo, float cantidad)
RemoteException;
throws
String nomtit(int codigo) throws RemoteException;
int codtit(String nom) throws RemoteException;
/aquí la serializacion es necesaria*/
cuentabanca [] listado() throws RemoteException;
}
41
Ejemplo completo con serialización (1/4)
public class Arbol
implements java.io.Serializable //convierte a la clase en serializable
{
public Arbol izq;
public Arbol der;
public int id;
public int nivel;
private static int cont = 0;
public Arbol(int l) {
id = cont++;
nivel = l;
if (l > 0) {
izq = new Arbol(l-1);
der = new Arbol(l-1);
}
}
}
42
Ejemplo completo con serialización (2/4)
//interfaz que transfiere al servidor una instancia de la
clase serializable Arbol.java
import java.rmi.*;
public interface IArbol
extends Remote
{
public void Listado_Remoto (Arbol t, int n) throws
RemoteException;
}
43
Ejemplo completo con serialización (3/4)
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
public class Serv_arbol
extends UnicastRemoteObject implements IArbol
{
public Serv_arbol()throws RemoteException
{super();}
public void Listado_Remoto (Arbol t, int n) throws RemoteException
{
for (int i = 0; i < t.nivel; i++)
System.out.print(" ");
System.out.println("nodo " + t.id);
if (t.nivel <= n && t.izq != null) Listado_Remoto(t.izq, n);
if (t.nivel <= n && t.der != null) Listado_Remoto(t.der, n);
}
public static void main(String[] args) throws Exception
{
Serv_arbol ORemoto = new Serv_arbol();
Naming.bind("Servidor", ORemoto);
System.out.println("Servidor Remoto Preparado");
}
}
44
Ejemplo completo con serialización (4/4)
import java.rmi.*;
import java.rmi.registry.*;
public class Client_arbol
{
public static void main(String[] args)
throws Exception
{
int niveles = 3;
Arbol arb = new Arbol (niveles); //se crea un objeto serializable
IArbol RefObRemoto =
(IArbol)Naming.lookup("//localhost/Servidor");
RefObRemoto.Listado_Remoto (arb, niveles); //transfiere al objeto
//servidor un objeto Arbol
//serializado
}
}
45
Ejecución del ejemplo en modo local
46
EJERCICIOS
Descargue los ficheros contenidos en la
subcarpeta Serializacion (carpeta de
códigos del tema), compile y pruebe
„ Haga lo propio distribuyendo la aplicación
con un compañero
„
47
Gestionando la seguridad: policytool
¾
Java tiene en cuenta la seguridad
System.setSecurityManager(new RMISecurityManager());
¾
Se ajusta la seguridad:
¾
¾
Construyendo un objeto SecurityManager
Llamando al método setSecurityManager (clase System)
¾
Clase RMISecurityManager
¾
Programador ajusta la seguridad mediante la clase
Policy
Policy.getPolicy() permite conocer la seguridad actual.
¾ Policy.setPolicy() permite fijar nueva política.
¾
¾
¾
Seguridad reside en fichero específico.
Java2 incorpora una herramienta visual: policytool
48
¾
Ajuste de la política de seguridad
¾ Crearlas con policytool: ejemplo de fichero .policy
/* AUTOMATICALLY GENERATED ON Fri May 28
19:23:13 CEST 2004*/
/* DO NOT EDIT */
grant {
permission java.net.SocketPermission
"*:1024-65535", "connect,accept, listen,
accept, connect, listen, resolve";
permission java.net.SocketPermission "*:80",
"connect, accept";
permission java.security.AllPermission;
};
¾ Activarlas
¾ Ejecutar ajustando la política con
Java –Djava.security=fichero.policy
servidor|cliente
¾ O bien crear objeto RMISecurityManager y ajustar
SetSecurityManager sobre el objeto creado.
49
CallBack de Cliente
Si servidor de RMI debe notificar eventos
a clientes, la arquitectura es inapropiada
¾ La alternativa estándar es el sondeo
(polling)
¾ Donde cliente:
¾
Iservidor RefRemota= (IServidor)
Naming.lookup (URL);
while (!(Ref.Remota.Evento.Esperado())){}
50
RMI con Polling: Ejemplo de interfaz
import java.rmi.*;
public interface ejemploPolling
extends Remote
{
public void datoInc() throws RemoteException;
public boolean igualDiez() throws RemoteException;
//metodo para realizar el sondeo continuo sobre el servidor
}
51
RMI con Polling: Ejemplo de servidor
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
public class servPolling
extends UnicastRemoteObject
implements ejemploPolling
{
private static int dato = 0;
public void datoInc() throws RemoteException
{dato++; System.out.println(dato);}
public boolean igualDiez() throws RemoteException //metodo para recibir el sondeo
{return (dato==10);}
public servPolling() throws RemoteException {}
public static void main(String[] args)
throws Exception
{
servPolling contRemoto = new servPolling();
Naming.bind("Servidor_Polling", contRemoto);
System.out.println("Servidor Remoto Preparado");
}
}
52
RMI con Polling: Ejemplo de cliente
import java.rmi.*;
import java.rmi.registry.*;
public class clientPolling
{
public static void main(String[] args)
throws Exception
{
ejemploPolling RefObRemoto =
(ejemploPolling)Naming.lookup("//localhost/Servidor_Polling");
while(!RefObRemoto.igualDiez()) //lazo de sondeo continuo al sevidor…
{System.out.println("Incremento remoto del contador");
RefObRemoto.datoInc();
}
System.out.print("El contador remoto llego a diez y se sale...");
}
}
53
Características del CallBack
Clientes interesados se registran en un
objeto servidor para que les sea notificado
un evento
¾ Cuando el evento se produce, el objeto
servidor notifica al cliente su ocurrencia
¾ ¿Qué necesitamos para que funcione?
¾
54
Arquitectura RMI para CallBack
55
Conclusiones
Hay que duplicar la arquitectura
„ Se requieren dos interfaces
„ Habrá dos niveles de stubs
„
… Cliente
„
(Stub+Skel) y Servidor (Stub+Skel)
Es necesario proveer en el servidor
medios para que los clientes registren sus
peticiones de callback
56
EJERCICIOS
Lea el guión de callback de cliente
¾ Compile y active el código ejemplo de
callback que figura en la subcarpeta
callback de la carpeta codigos rmi (utilice
stubs y skeletons)
¾ Haga lo propio con subcarpeta
callback_simpel
¾ Distribuya la aplicación con su compañero
de grupo
¾
57
Descarga Dinámica de Clases
Permite cambios libres en el servidor
¾ Elimina la necesidad de distribuir
(resguardos) si los hay y nuevas clases
¾ Dinámicamente, el cliente descarga todas
las clases que necesita para desarrollar
una RMI válida
¾ Mediante HTTP o incluso FTP
¾
58
(2)Cliente solicita interfaz
vía Naming.lookup
Registro
de RMI
(1) Servidor registra el par
(Objeto, nombre)
(3)Registro ofrece
una referencia remota
Servidor
RMI
Cliente
de RMI
server.codebase=
http://host/directorio
(4)Cliente solicita la clase de stub
mediante el codebase
Localización
URL
http
(5)Servidor http devuelve
la clase de stub
host
59
Servidor HTTP para Descarga Dinámica
¾
Mini-servidor de HTTP de Sun
¾ Clases
¾ Se
¾
¾
ClassServer y ClassFileServer
compilan conjuntamente
java ClassFileServer 8080 /rmi/clases
Servidor HTTP estándar
¾ Apache
¾ Otros
60
¾ Ejemplo del Servidor Básico de Sun activo en Windows
¾ Colocar Resguardos y clases para carga dinámica en /java/rmi
¾ Ajustar la propiedad java.rmi.server.codebase
61
Novedades a partir de jdk 1.5
Soporta Generación Dinámica de
Resguardos
¾ Prescinde del generador rmic
¾
¾
Pruebe ahora los ejemplos anteriores sin
pasar por la etapa de generación de
resguardos (rmic) ¿qué observa?
62
Descargar