diapositivas del tema 7

62
1 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. TEMA 7: Paso de Mensajes con RMI

Upload: duongquynh

Post on 12-Feb-2017

248 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Diapositivas del Tema 7

1

CONTENIDO:

Conceptos de Programación DistribuidaRemote Method Invocation (RMI) en JavaEl Nivel de ResguardosLa Responsable de que Todo Funcione: la interfazEl precompilador rmicArquitectura Completa de una AplicaciónEvoluciones 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.

TEMA 7: Paso de Mensajes con RMI

Page 2: Diapositivas del Tema 7

2

No existe memoria comúnComunicacionesNo existe un estado global del sistemaGrado de TransparenciaEscalablesReconfigurables

Conceptos de ProgramaciConceptos de Programacióón Distribuidan Distribuida

Page 3: Diapositivas del Tema 7

3

Modelo de Paso de MensajesOperaciones send y receive

Modelo RPCStubs de cliente y servidorVisión en Java es RMI

Modelos de Objetos DistribuidosDCOM de MicrosoftJini de SunCORBA de OMG

Modelos de ProgramaciModelos de Programacióón Distribuidan Distribuida

Page 4: Diapositivas del Tema 7

4

Mecanismo para comunicar y sincronizar entidades concurrentes que no pueden o no quieren compartir memoriaLlamadas send y receiveTipología de las llamadas:

Bloqueadas-No bloqueadasAlmacenadas-No almacenadas (en buffer)Fiables-No Fiables

En Unix:Pipes con y sin nombre

En Java:Sockets: Clases Socket y ServerSocketCanales: CTJ (Communicating Threads for Java)

Modelo de Paso de MensajesModelo de Paso de Mensajes

Page 5: Diapositivas del Tema 7

5

NUCLEO NUCLEO

CLIENTE SERVIDOR

SOLICITUD

RESPUESTA

RED

Modelo General

Page 6: Diapositivas del Tema 7

6

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

SERVIDOR

PUERTO

CLIENTE

TCP/UDP

Page 7: Diapositivas del Tema 7

7

SERVIDOR

PUERTO

CLIENTE

Solicitud de conexión

SERVIDOR

PUERTO

CLIENTE

PUERTO

PUERTO

Page 8: Diapositivas del Tema 7

8

Mayor nivel de abstracciónLlamadas a procedimiento local o remoto indistintamenteNecesita de stubs/skeletons (¡OCULTAMIENTO!)Registro del servicio (Servidor de Nombres)En Unix:

Biblioteca rpc.hRepresentación estándar XDRAutomatización parcial: especificación-compilador rpcgen

En Java:Objetos remotos. SerializaciónPaquete java.rmiAutomatización parcial: interfaz-compilador rmic

Modelo Remote Procedure Call (RPC)Modelo Remote Procedure Call (RPC)

Page 9: Diapositivas del Tema 7

9Host local

Espacio del usuario

Programa cliente

Espacio del usuario

Programa servidor

func() func(void){//codigo………….}

Host remoto

Llamando a un procedimiento remoto

OBJETIVOS:1.Efectuar la llamada como si tuviera carácter local2.Enmascarar aspectos relativos a comunicaciones3.¿Y cómo lograrlo…?

Page 10: Diapositivas del Tema 7

10

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 remotaInterface con el nivel de red.

TCPUDP

Page 11: Diapositivas del Tema 7

11

Servicios de Red

Programa Cliente

Stub del Cliente

Proceso Cliente

callrpcrpcreturn

Servicios de Red

Stub del Servidor

Funciones Servidor

Proceso Servidor

llamadanormal return

RED

Esquema RPC con stubs

Núcleo Cliente Núcleo Servidor

Page 12: Diapositivas del Tema 7

12

¿Y cómo generar los stubs?

De forma manualDe forma automática

Especificación formal de interfazSoftware específicorpcgen (C-unix)/rmic (Java)

Page 13: Diapositivas del Tema 7

13

Especificación FormalInterface

Precompiladorrpcgen o rmic

ResguardoStub

ResguardoSkeleton

Ficheros compartidos

Representaciónde datosCliente Servidor

COMPILAR

COMPILAR

ClienteEjecutable

ServidorEjecutable

Generación automática de stubs

Page 14: Diapositivas del Tema 7

14

Especificación FormalInterface

Generadorde

Resguardos

Res. Del Servidor Res. Del Cliente

SERVIDOR CLIENTECONECTOR

Interfaz delservidor+asacreate, readdelete, write

Petición de asa del servidor Envío de asa

Read(f,d)

d

Dinamic Dinamic BindingBinding

Page 15: Diapositivas del Tema 7

15

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.xDistribuir y compilar ficheros entre las máquinas implicadasNecesario utilizar representación XDR. Biblioteca xdr.h

Page 16: Diapositivas del Tema 7

16

RMI (Remote Method Invocation) en JavaRMI (Remote Method Invocation) en Java

ObjetoCliente

JVM

ObjetoServidor

JVM

Permite disponer de objetos distribuidos utilizando JavaUn objeto distribuido se ejecuta en una JVM diferente o remotaObjetivo: lograr una referencia al objeto remoto que permita utilizarlo como si el objeto se estuviera ejecutando sobre la JVM localEs similar a RPC, si bien el nivel de abstracción es más altoSe puede generalizar a otros lenguajes utilizando JNIRMI pasa los parámetros y valores de retorno utilizando serializaciónde objetos.

Page 17: Diapositivas del Tema 7

17

RPC versus RMI

RPC RMICará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.

Page 18: Diapositivas del Tema 7

18

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);

Page 19: Diapositivas del Tema 7

19

Arquitectura RMI

Cliente Servidor

Stub Skeleton

ReferenciaRemota

ReferenciaRemota

TransporteTransporte

El servidor debe extender RemoteObjectEl servidor debe implementar una interfazdiseñada previamenteEl servidor debe tener como mínimo unconstructor (nulo) que lanzará la excepciónRemoteExceptionEl método main del servidor debe lanzarun gestor de seguridadEl método main crea los objetos remotosEl compilador de RMI (rmic) genera el stuby el skeleton.Los clientes de objetos remotos se comunicancon interfaces remotas (diseñadas antes de…)Los objetos remotos son pasados por referenciaLos clientes que llaman a métodos remotosdeben manejar excepciones.

Page 20: Diapositivas del Tema 7

20

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)

Page 21: Diapositivas del Tema 7

21

¿Cómo lograrlo?public interfazextends Remote

{signaturas métodos}

Implementaciónde la interfaz

Cliente

SERVIDOR

implements

new

Nombre Referencia

servicio ref bind ó rebindlookup

referencia a interfaz

ref.metodo(param)

resultado

Page 22: Diapositivas del Tema 7

22

Definir Interfaz Remotaimplements

Implementar InterfazRemota

$ rmic .class

SkeletonStub

JVM

Implementar Cliente

JVM

Implementar Servidor

Page 23: Diapositivas del Tema 7

23

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 losimplementa. Se indica nombre, parámetros y tipo de retorno.Todos los métodos de la interfaz remota lanzan obligatoriamente la excepción RemoteExceptionEl 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

Page 24: Diapositivas del Tema 7

24

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 Remotepublic interface IEjemploRMI1 extends Remote{//todo metodo de la interfaz remota debe lanzar la //excepcion RemoteExceptionint 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;

}

Page 25: Diapositivas del Tema 7

25

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.

FASES DE DISEÑO RMI (2-IMPLEMENTACIÓN)

Page 26: Diapositivas del Tema 7

26

EJEMPLO (IMPLEMENTACIÓN DE INTERFAZ Y SERVIDOR)

/**Ejemplo de implementacion del interfaz remoto para un RMI* @author Antonio Tomeu*/

//se importan los paquetes necesariosimport 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 EjemploRMI1extends UnicastRemoteObjectimplements IEjemploRMI1

{

Page 27: Diapositivas del Tema 7

27

//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.

Page 28: Diapositivas del Tema 7

28

//es necesario que haya un constructor (nulo) como minimo, ya //que debe lanzar RemoteExceptionpublic 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");

}}

Page 29: Diapositivas del Tema 7

29

FASES DE DISEÑO RMI (3- Generando STUB Y SKELETON)

Compilador de RMI$ rmic imp

Fichero de implementación

de Interfaz compilado

(Imp.class)

Fichero de stub

(Imp_Stub.class)

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énlos 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 DNSEn nuestro caso, el servidor remoto se activó en hercules.uca.es sobre el puerto 1099.

$ java EjemploRMI1 &

Page 30: Diapositivas del Tema 7

30

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);

Page 31: Diapositivas del Tema 7

31

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.

FASES DE DISEÑO RMI (5-CLIENTE)

Page 32: Diapositivas del Tema 7

32

/**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));

}}

EJEMPLO (CLIENTE)

Page 33: Diapositivas del Tema 7

33

Distribución de Archivos

Interfaz.class

Cliente.class

Implem_Stub.class

Interfaz.class

Servidor.class

Implem_Stub.class

Implem_Skel.class

ServidorCliente

NOTA: A PARTIR DE jdk 1.2 LAS CLASES DE SKELETON NO SON NECESARIAS

Page 34: Diapositivas del Tema 7

34

EJERCICIODescargue los ficheros IEjemploRMI1.java, EjemploRMI1.java y ClienteEjemploRMI1.javaSiga el guión auxiliar de prácticas (ver bloque del tema actual) y desarrolle la arquitectura en localDistribuya ahora la aplicación con un compañeroEscriba una interfaz de operaciones para números complejos, utilizando tipos primitivos, llamada IComplejo.java

Impleméntela en Complejo.javaEscriba 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

Page 35: Diapositivas del Tema 7

35

Acuerden una interfaz llamada interfaz_grupo_x.javaUn 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.

Page 36: Diapositivas del Tema 7

36

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 –vcompatA partir del jdk 1.5 se incorpora Generación Dinámica de Resguardos

Page 37: Diapositivas del Tema 7

37

EJERCICIOS

Pruebe los ejemplos anteriores sin skeletonNo obstante, ¿necesita el servidor algo a pesar de todo ?

Page 38: Diapositivas del Tema 7

38

RMI: CARACTERÍSTICAS AVANZADAS

Serialización de ObjetosGestión de la Seguridad: policytoolCallback de ClienteDescarga Dinámica de Clases

Page 39: Diapositivas del Tema 7

39

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 RMITipos primitivos se serializan autómaticamenteClases contenedoras tambiénObjetos complejos deben implementar la interfaz

Serializable (es un flag) para poder ser serializados

Page 40: Diapositivas del Tema 7

40

Ejemplo con serialización de una clase

import java.io.*;import java.util.*;

public class cuentabancaimplements 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);}}

Page 41: Diapositivas del Tema 7

41

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) throws RemoteException;

String nomtit(int codigo) throws RemoteException;

int codtit(String nom) throws RemoteException;/aquí la serializacion es necesaria*/cuentabanca [] listado() throws RemoteException;

}

Interfaz

Page 42: Diapositivas del Tema 7

42

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);

}}

}

Ejemplo completo con serialización (1/4)

Page 43: Diapositivas del Tema 7

43

//interfaz que transfiere al servidor una instancia de laclase serializable Arbol.java

import java.rmi.*;public interface IArbol

extends Remote{

public void Listado_Remoto (Arbol t, int n) throws RemoteException;

}

Ejemplo completo con serialización (2/4)

Page 44: Diapositivas del Tema 7

44

import java.rmi.*;import java.rmi.server.*;import java.rmi.registry.*;

public class Serv_arbolextends 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");

}}

Ejemplo completo con serialización (3/4)

Page 45: Diapositivas del Tema 7

45

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

}}

Ejemplo completo con serialización (4/4)

Page 46: Diapositivas del Tema 7

46

Ejecución del ejemplo en modo local

Page 47: Diapositivas del Tema 7

47

Descargue los ficheros contenidos en la subcarpeta Serializacion (carpeta de códigos del tema), compile y pruebeHaga lo propio distribuyendo la aplicación con un compañero

EJERCICIOS

Page 48: Diapositivas del Tema 7

48

Gestionando la seguridad: policytool

Java tiene en cuenta la seguridadSystem.setSecurityManager(new RMISecurityManager());

Se ajusta la seguridad:Construyendo un objeto SecurityManagerLlamando al método setSecurityManager (clase System)

Clase RMISecurityManagerProgramador 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

Page 49: Diapositivas del Tema 7

49

Ajuste de la política de seguridadCrearlas 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|clienteO bien crear objeto RMISecurityManager y ajustar SetSecurityManager sobre el objeto creado.

Page 50: Diapositivas del Tema 7

50

CallBack de Cliente

Si servidor de RMI debe notificar eventos a clientes, la arquitectura es inapropiadaLa alternativa estándar es el sondeo (polling)Donde cliente:

Iservidor RefRemota= (IServidor) Naming.lookup (URL);

while (!(Ref.Remota.Evento.Esperado())){}

Page 51: Diapositivas del Tema 7

51

import java.rmi.*;public interface ejemploPollingextends Remote{

public void datoInc() throws RemoteException;public boolean igualDiez() throws RemoteException;//metodo para realizar el sondeo continuo sobre el servidor

}

RMI con Polling: Ejemplo de interfaz

Page 52: Diapositivas del Tema 7

52

import java.rmi.*;import java.rmi.server.*;import java.rmi.registry.*;

public class servPolling extends UnicastRemoteObjectimplements 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");

}}

RMI con Polling: Ejemplo de servidor

Page 53: Diapositivas del Tema 7

53

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...");

}}

RMI con Polling: Ejemplo de cliente

Page 54: Diapositivas del Tema 7

54

Características del CallBack

Clientes interesados se registran en un objeto servidor para que les sea notificado un eventoCuando el evento se produce, el objeto servidor notifica al cliente su ocurrencia¿Qué necesitamos para que funcione?

Page 55: Diapositivas del Tema 7

55

Arquitectura RMI para CallBack

Page 56: Diapositivas del Tema 7

56

Hay que duplicar la arquitecturaSe requieren dos interfacesHabrá 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

Conclusiones

Page 57: Diapositivas del Tema 7

57

EJERCICIOS

Lea el guión de callback de clienteCompile 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_simpelDistribuya la aplicación con su compañero de grupo

Page 58: Diapositivas del Tema 7

58

Descarga Dinámica de Clases

Permite cambios libres en el servidorElimina la necesidad de distribuir (resguardos) si los hay y nuevas clasesDinámicamente, el cliente descarga todas las clases que necesita para desarrollar una RMI válidaMediante HTTP o incluso FTP

Page 59: Diapositivas del Tema 7

59

Cliente de RMI

Registro de RMI

ServidorRMI

server.codebase=http://host/directorio

Localización URLhttp

host

(1)Servidor registra el par(Objeto, nombre)

(2)Cliente solicita interfazvía Naming.lookup

(3)Registro ofrece una referencia remota

(4)Cliente solicita la clase de stubmediante el codebase

(5)Servidor http devuelvela clase de stub

Page 60: Diapositivas del Tema 7

60

Servidor HTTP para Descarga Dinámica

Mini-servidor de HTTP de SunClases ClassServer y ClassFileServerSe compilan conjuntamentejava ClassFileServer 8080 /rmi/clases

Servidor HTTP estándarApacheOtros

Page 61: Diapositivas del Tema 7

61

Ejemplo del Servidor Básico de Sun activo en WindowsColocar Resguardos y clases para carga dinámica en /java/rmiAjustar la propiedad java.rmi.server.codebase

Page 62: Diapositivas del Tema 7

62

Novedades a partir de jdk 1.5

Soporta Generación Dinámica de ResguardosPrescinde del generador rmicPruebe ahora los ejemplos anteriores sin pasar por la etapa de generación de resguardos (rmic) ¿qué observa?