diapositivas del tema 7
TRANSCRIPT
![Page 1: Diapositivas del Tema 7](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/1.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/5.jpg)
5
NUCLEO NUCLEO
CLIENTE SERVIDOR
SOLICITUD
RESPUESTA
RED
Modelo General
![Page 6: Diapositivas del Tema 7](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/7.jpg)
7
SERVIDOR
PUERTO
CLIENTE
Solicitud de conexión
SERVIDOR
PUERTO
CLIENTE
PUERTO
PUERTO
![Page 8: Diapositivas del Tema 7](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/22.jpg)
22
Definir Interfaz Remotaimplements
Implementar InterfazRemota
$ rmic .class
SkeletonStub
JVM
Implementar Cliente
JVM
Implementar Servidor
![Page 23: Diapositivas del Tema 7](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/29.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/32.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/33.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/34.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/35.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/36.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/37.jpg)
37
EJERCICIOS
Pruebe los ejemplos anteriores sin skeletonNo obstante, ¿necesita el servidor algo a pesar de todo ?
![Page 38: Diapositivas del Tema 7](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/38.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/39.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/40.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/41.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/42.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/43.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/44.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/45.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/46.jpg)
46
Ejecución del ejemplo en modo local
![Page 47: Diapositivas del Tema 7](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/47.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/48.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/49.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/50.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/51.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/52.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/53.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/54.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/55.jpg)
55
Arquitectura RMI para CallBack
![Page 56: Diapositivas del Tema 7](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/56.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/57.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/58.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/59.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/60.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/61.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052406/58a034171a28ab5c588b7669/html5/thumbnails/62.jpg)
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?