Está en la página 1de 84

1

CONTENIDO:
Conceptos de Programacin Distribuida
Programacin con Sockets. CTJ en Java
Remote Method Invocation (RMI) en Java
El Modelo de Objetos en Red
CORBA
BIBLIOGRAFA:
[Eck02] Eckel, B. Piensa en Java. Prentice Hall, 2002. [Captulo 15]
[Arn01] Arnold, K. El Lenguaje de Programacin Java. Prentice Hall, 2002.
[Captulo 20]
[Hil00] Hilderink et al. Communicating Threads for Java. Draft.
[Vin97] Vinoski, S. CORBA: Integrating Diverse.IEEE Communications
Magazine, vol. 35, n 2, February, 1997.
TEMA 4: PROGRAMACIN DISTRIBUIDA
Antonio Tomeu Programacin Concurrente y Distribuida
2
No existe memoria comn
Comunicaciones
No existe un estado global del sistema
Grado de Transparencia
Escalables
Reconfigurables
Conceptos de Programacin Distribuida Conceptos de Programacin Distribuida
Antonio Tomeu Programacin Concurrente y Distribuida
3
Modelo de Paso de Mensajes
Operaciones send y receive
Analizado en asignatura de S.O.
Modelo RPC
Stubs de cliente y servidor
Visin en Java es RMI
Modelos de Objetos Distribuidos
DCOM de Microsoft
Jini de Sun
CORBA de OMG
Modelos de Programacin Distribuida Modelos de Programacin Distribuida
Antonio Tomeu Programacin Concurrente y Distribuida
4
Mecanismo para comunicar y sincronizar entidades
concurrentes que no pueden o no quieren compartir
memoria
Llamadas send y receive
Tipologa de las llamadas:
Bloqueadas-No bloqueadas
Almacenadas-No almacenadas (en buffer)
Fiables-No Fiables
En Unix:
Pipes con y sin nombre
En Java:
Sockets.
CTJ (Communicating Threads for Java)
Modelo de Paso de Mensajes Modelo de Paso de Mensajes
Antonio Tomeu Programacin Concurrente y Distribuida
5
NUCLEO NUCLEO
CLIENTE SERVIDOR
SOLICITUD
RESPUESTA
RED
Modelo General
Antonio Tomeu Programacin Concurrente y Distribuida
6
Puertos (Breve repaso)
El protocolo TCP (y tambin UDP) utilizan los
puertos para hacer llegar los datos de entrada a
un proceso concreto que se ejecuta en una
mquina
SERVIDOR
P
U
E
R
T
O
CLIENTE
TCP/UDP
Antonio Tomeu Programacin Concurrente y Distribuida
7
PROTOCOLO TCP/UDP
Port xxx Port yyy Port zzz Port kkk
App A
App B App C
0010111001100010101 Port yyy
8
SERVIDOR
P
U
E
R
T
O
CLIENTE
Solicitud de conexin
SERVIDOR
P
U
E
R
T
O
CLIENTE
PUERTO
P
U
E
R
T
O
Antonio Tomeu Programacin Concurrente y Distribuida
9
Sockets en Java
Socket: punto de conexin entre procesos
Una vez establecido, permite el intercambio de informacin
bidireccionalmente entre ambos
El socket se enlaza a un puerto a partir del cual el nivel TCP
identifica a la aplicacin destinataria de los datos
Antonio Tomeu Programacin Concurrente y Distribuida
Socket()
Accept()
Socket creado y activo
10
La clase ServerSocket
Escucha solicitudes entrantes de creacin
Devuelve un objeto de la clase Socket.
Constructor habitual:
ServerSocket L = newServerSocket (num_puerto)
Bloqueo esperando solicitud
L.accept();
Llamada entrante desde cliente:
Produce desbloqueo.
Cliente obtiene socket vlido de retorno.
Antonio Tomeu Programacin Concurrente y Distribuida
11
La clase Socket
Implementa un socket desde el lado del
cliente
Se obtiene como retorno desde el servidor
Constructor habitual:
Socket (direccin_IP, puerto);
Antonio Tomeu Programacin Concurrente y Distribuida
12
1. Crear un objeto ServerSocket
2. Crear un objeto Socket
3. Crear un InputStream para leer
desde el cliente
4. Crear un OutputStream para enviar
informarcin al cliente
5. Hacer I/O con ambos stream.
6. Cerrar el socket
!mplementando un servidor
Antonio Tomeu Programacin Concurrente y Distribuida
13
Ejemplo (esquema) de un servidor
import java.io.*;
import java.net.*;
public class SocketServidor
{
public static final int port = 8080;
public static void main (String [] args)
throws IOException
{
ServerSocket GenSocket = new ServerSocket(port);
System.out.println("El servidor esta escuchando
en: "+ GenSocket);
try{//espera solicitud conexion desde cliente...
Socket enchufe = GenSocket.accept();
} finally { System.out.println("se cierra la
conexin...");
GenSocket.close();
}
}//main
}//SocketServidor
14
1. Crear un objeto Socket
2. Crear un InputStream para leer
desde el cliente
3. Crear un OutputStream para enviar
informarcin al cliente
4. Hacer I/O con ambos stream.
5. Cerrar el socket
!mplementando un cliente
Antonio Tomeu Programacin Concurrente y Distribuida
15
import java.io.*;
import java.net.*;
public class SocketCliente
{
public static void main (String [] args)
throws IOException
{
//llamando ordenador despacho de al lado...
InetAddress dir_IP =
InetAddress.getByName("150.214.72.96");
Socket enchufe = new Socket (dir_IP, 8080);
System.out.println("Datos socket creado:
"+enchufe);
}//main
}//SocketCliente
Ejemplo (esquema) de un cliente
16
!ntercambiando informacin por el socket
Una vez obtenida la conexin, servidor y
cliente disponen de un objeto socket.
Mtodos de la clase socket
getInputStream() para recibir.
getOutputStream() para enviar.
Envolverlos en decoradores
Manejarlos como flujos de E/S
Asncronas junto con la clase
SocketChannel
Antonio Tomeu Programacin Concurrente y Distribuida
17
Communicating Threads for Java (CTJ)
[Hilderink et al., 2000|
Incovenientes del modelo de hilos en Java.
El prototipo CTJ: caractersticas
Variables compartidas son read-only
Variables modificables son locales a los procesos.
No hay condiciones de concurso.
Interaccin entre procesos: canales de comunicacin
Objetos Pasivos.
Procesos envan/reciben informacin desde ellos.
Mayor portabilidad que hilos (sobre JVM).
SE ELIMINA LA MEMORIA COMN!
Antonio Tomeu Programacin Concurrente y Distribuida
18
Hilos: mtodo wait(), notify(), notifyAll()
Usuario
Crea y controla hilos.
Define regiones crticas o monitores (synchronized).
Establece la sincronizacin en forma explcita.
Canales: principio del rendezvous
Se encargan de la sincronizacin.
Se encargan del secuenciamiento.
Se encargan del envo de mensajes.
Se crean y controlan procesos.
Emisor Listo Receptor Listo Canal
Antonio Tomeu Programacin Concurrente y Distribuida
19
Principio del rendezvous
send (B, mensaje)
receive (A, mensaje)
rendezvous
tiempo
Proceso A
Proceso B
Antonio Tomeu Programacin Concurrente y Distribuida
20
Procesos en ejecucin concurrente
Interaccin entre canales
Interfaz de un proceso CTJ
Mtodo run()
Conjunto de canales de entrada
Conjunto de canales de salida
public void run()
{ //codigo ejec.
}
Canal de Salida
Canal de Entrada
21
Creando procesos en CTJ: interfaz Process
interfaz csp.lang.Process (anloga a java.lang.Runnable)
public interface csp.lang.Process{
public void run();
}
Procesos de usuario implementan la interfaz:
public class mi_proceso implements Process{
//dato locales al proceso
public mi_proceso(channels y parametros){
//codigo del constructor
}
public void run() //sobreescritura de run
{//cdigo del proceso}
}
Antonio Tomeu Programacin Concurrente y Distribuida
22
La interfaz Canal en CTJ
Interfaz con mtodos read y write
Disponibles para varios tipos de objetos
Procesos comunicados a travs de ellas
Eliminan condiciones de concurso
Comunicacin (sin bfer) sncrona (por
rendezvouz)
CTJ propociona canales con bfer para
comunicaciones sncronas.
Antonio Tomeu Programacin Concurrente y Distribuida
23
import csp.lang.*;
import csp.lang.Process.*;
import csp.lang.Integer.*
class Producer implements Process{
ChannelOutput_of_Integer channel;
Integer object;
public Producer (ChannelOutput_of_Integer out){
channel = out;
object = new Integer();
}
public void run(){
object.value=100;
channel.write(object);
}
}
Antonio Tomeu Programacin Concurrente y Distribuida
24
import csp.lang.*;
import csp.lang.Process.*;
import csp.lang.Integer.*
class Consumer implements Process{
ChannelInput_of_Integer channel;
Integer object;
public Consumer (ChannelInput_of_Integer out){
channel = in;
object = new Integer();
}
public void run(){
channel.read(object);
System.out.println(object);
}
}
Antonio Tomeu Programacin Concurrente y Distribuida
25
import csp.lang.*;
import csp.lang.Process;
import csp.lang.Integer;
public class P_C_Main{
public static void main (String [] args){
Channel channel = new Channel();
Process modo = new Parallel(new Process[]
new Producer(channel),
new Consumer(channel));
modo.run();
}//main
}// P_C_Main
Antonio Tomeu Programacin Concurrente y Distribuida
26
Tipos de Canales en CTJ
Boolean (Channel_of_Boolean)+read/write
Byte (Channel_of_Byte)+read/write
Char (Channel_of_Char)+read/write
Double (Channel_of_Double)+read/write
Float (Channel_of_Float)+read/write
Integer(Channel_of_Integer)+read/write
Long (Channel_of_Long)+read/write
Short(Channel_of_Short)+read/write
Reference (Channel_of_Reference)+read/write
Object(Channel_of_Object)+read/write
Any(Channel_of_Any)+read/write
Antonio Tomeu Programacin Concurrente y Distribuida
27
Composicin de Procesos en CTJ
Sequential (Process[] procesos)
Parallel (Process[] procesos)
PriParallel (Process[] procesos)
Con guardas:
Alternative
PriAlternative
Antonio Tomeu Programacin Concurrente y Distribuida
28
cY distribuido.?
csp.io.linkdrivers.TCPIP ( UDP)
Construir un enlace TPCIP
public TCPIP(remotehost, remoteport, TCPIP.tipo)
Con tipo:
REALTIME para sincronismo con rendezvous
ASYNCHRONOUS para asincronismo.
Envolver el enlace con un canal del tipo
deseado.
Antonio Tomeu Programacin Concurrente y Distribuida
29
import csp.lang.*;
import csp.lang.Process;
import csp.lang.Integer;
Import csp.io.lindrivers.TCPIP;
public class Prod{
public static void main (String [] args){
final Channel_of_Integer canal =
new Channel_of_Integer new(
TCPIP(sargo.uca.es, 1701, TCPIP.REALTIME));
Process par = new Parallel(new Process[]
{new Producer(canal)});
par.run();
}//main
}//Prod
30
import csp.lang.*;
import csp.lang.Process;
import csp.lang.Integer;
Import csp.io.lindrivers.TCPIP;
public class Cons{
public static void main (String [] args){
final Channel_of_Integer canal =
new Channel_of_Integer new TCPIP(
(delfin.uca.es, 1701, TCPIP.REALTIME));
Process par = new Parallel(new Process[]
{new Consumer(canal)});
par.run();
}//main
}//Cons
MS INFORMACIN EN :
http://www.ce.utwente.nl/javapp/
31
Mayor nivel de abstraccin
Llamadas a procedimiento local o remoto indistintamente
Necesita de stubs/skeletons (OCULTAMIENTO!)
Registro del servicio
En Unix:
Biblioteca rpc.h
Representacin estndar XDR
Automatizacin parcial: especificacin-compilador rpcgen
En Java:
Objetos remotos. Serializacin
Paquete java.rmi
Automatizacin parcial: interfaz-compilador rmic
Nodelo Remote
Nodelo Remote
Procedure
Procedure
Call
Call
(RPC)
(RPC)
Antonio Tomeu Programacin Concurrente y Distribuida
32
Host 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 carcter local
2. Enmascarar aspectos relativos a comunicaciones
3. Y cmo lograrlo.?
33
!ntroduccin del nivel de stubs
Efectan el marshalling/unmarshalling de
parmetros.
Bloquean al cliente a la espera del
resultado.
Transparencia de ejecucin remota
Interface con el nivel de red.
TCP
UDP
Antonio Tomeu Programacin Concurrente y Distribuida
34
Servicios de
Red
Programa Cliente
Stub del Cliente
Proceso Cliente
callrpc
rpcreturn
Servicios de
Red
Stub del Servidor
Funciones Servidor
Proceso Servidor
llamada
normal
return
RED
Esquema RPC con stubs
Ncleo Cliente
Ncleo Servidor
35
cY cmo generar los stubs?
De forma manual
De forma automtica
Especificacin formal de interfaz
Software especfico
rpcgen (C-unix)/rmic (Java)
Antonio Tomeu Programacin Concurrente y Distribuida
36
Especificacin Formal
Interface
Precompilador
rpcgen o rmic
Resguardo
Stub
Resguardo
Skeleton
Ficheros
compartidos
Representacin
de datos
Cliente Servidor
C
O
M
P
I
L
A
R
C
O
M
P
I
L
A
R
Cliente
Ejecutable
Servidor
Ejecutable
Generacin automatica de stubs
Antonio Tomeu Programacin Concurrente y Distribuida
37
Especificacin Formal
Interface
Generador
de
Resguardos
Res. Del Servidor Res. Del Cliente
SERVIDOR CLIENTE CONECTOR
Interfaz del
servidor+asa
create, read
delete, write
Peticin de asa del servidor
Envo de asa
Read(f,d)
d
Dinamic
Dinamic
Binding
Binding
Antonio Tomeu Programacin Concurrente y Distribuida
38
Breve Nota sobre RPC en C
Especificacin de la interfaz del servidor remoto en un
fichero de especificacin .x
/*rand.x*/
program RAND_PROG{
version RAND_VER{
void inicia_aleatorio(long)=1;
double obtener_aleat(void)=2;
}=1;
}=0x3111111;
Generacin autmtica de resguardos: $rpcgen rand.x
Distribuir y compilar ficheros entre las mquinas implicadas
Necesario utilizar representacin XDR. Biblioteca xdr.h
Antonio Tomeu Programacin Concurrente y Distribuida
39
RN! (Remote
RN! (Remote
Nethod
Nethod
!nvocation
!nvocation
) en Java
) en Java
Objeto
Cliente
JVM
Objeto
Servidor
JVM
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 abstraccin es ms alto
Se puede generalizar a otros lenguajes utilizando JNI
RMI pasa los parmetros y valores de retorno utilizando serializacin
de objetos.
Antonio Tomeu Programacin Concurrente y Distribuida
40
RPC versus RN!
El cdigo es mvil, mediante el uso
de bytecodes.
NO hay movilidad de cdigo
El uso de referencias a objetos
locales y remotos es automtico
El uso de punteros requiere el
manejo explcito de los mismos
Utiliza la serializacin de objetos en
Java
Utiliza la representacin externa de
datos XDR
Es dependiente del lenguaje Es dependiente del lenguaje
Carcter y Estructura de diseo
orientada a objetos
Carcter y Estructura de diseo
procedimental
RMI RPC
Antonio Tomeu Programacin Concurrente y Distribuida
41
Llamadas locales vs. Llamadas remotas
Un objeto remoto es aqul que se ejecuta en una JVM diferente,
situada potencialmente en un host distinto.
RMI es la accin de invocar a un mtodo de la interfaz de un objeto
remoto.
//ejemplo de llamada a mtodo local
int dato;
dato = Suma (x,y);
//ejemplo de llamada a mtodo remoto (no completo)
IEjemploRMI1 ORemoto =
(IEjemploRMI1)Naming.lookup(//sargo:2005/EjemploRMI1);
ORemoto.Suma(x,y);
42
Arquitectura RN!
Cliente Servidor
Stub Skeleton
Referencia
Remota
Referencia
Remota
Transporte
Transporte
El servidor debe extender RemoteObject
El servidor debe implementar una interfaz
diseada previamente
El servidor debe tener como mnimo un
constructor (nulo) que lanzar la excepcin
RemoteException
El mtodo main del servidor debe lanzar
un gestor de seguridad
El mtodo 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 (diseadas antes de)
Los objetos remotos son pasados por referencia
Los clientes que llaman a mtodos remotos
deben manejar excepciones.
Antonio Tomeu Programacin Concurrente y Distribuida
43
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)
Antonio Tomeu Programacin Concurrente y Distribuida
44
Cmo lograrlo?
public interfaz
extends Remote
{signaturas mtodos}
Implementacin
de la interfaz
Cliente
SERVIDOR
implements
new
ref servicio
Referencia Nombre
bind rebind
lookup
referencia a interfaz
ref.metodo(param)
resultado
Antonio Tomeu Programacin Concurrente y Distribuida
45
Definir Interfaz Remota
implements
Implementar Interfaz
Remota
$ rmic .class
Skeleton
Stub
JVM
Implementar Cliente
JVM
Implementar Servidor
46
FASES DE D!SENO RN! (1-!NTERFACE)
Escribir el fichero de la interfaz remota.
Debe ser public y extender a Remote.
Declara todos los mtodos que el servidor remoto ofrece, pero
NO los
implementa. Se indica nombre, parmetros y tipo de retorno.
Todos los mtodos de la interfaz remota lanzan
obligatoriamente la excepcin RemoteException
El propsito de la interface es ocultar la implementacin de los
aspectos relativos a los mtodos remotos.
De esta forma, cuando el cliente logra una referencia a un
objeto remoto, en realidad obtiene una referencia a una
interfaz.
Los clientes envan sus mensaje a los mtodos de la interfaz
Antonio Tomeu Programacin Concurrente y Distribuida
47
EJENPLO (F!CHERO DE !NTERFAZ)
/**Ejemplo del interfaz remoto para implementar un RMI
* @author Antonio Tomeu
*Es un servidor remoto aritmtico.
*/
//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 lanzrar 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;
}
Antonio Tomeu Programacin Concurrente y Distribuida
48
La implementacin del servidor es un fichero que realiza la
implementacin 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 mtodo main debe lanzar un gestor de seguridad.
El mtodo main debe crear los objetos remotos deseados.
El mtodo main debe registrar al menos unos de los objetos
remotos.
FASES DE D!SENO RN! (2-!NPLENENTAC!ON)
Antonio Tomeu Programacin Concurrente y Distribuida
49
EJENPLO (!NPLENENTAC!ON DE !NTERFAZ Y SERv!DOR)
/**Ejemplo de implementacion del interfaz remoto para un RMI
* @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
{
50
//aqu viene la implementacin de los mtodos 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.
51
//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 mquina remota. No hay que dar
//nombre de host, y se asume el puerto 1099.
Naming.bind(Servidor",ORemoto);
System.out.println("Servidor Remoto Preparado");
}
}
52
FASES DE D!SENO RN! (3- Generando STUB Y SKELETON)
Compilador de RMI
$ rmic imp
Fichero de
implementacin
de Interfaz
compilado
(Imp.class)
Fichero de
stub
(Imp_Stub.class)
Fichero de
skeleton
(Imp_Skel.class)
$ rmic EjemploRMI1
Es necesario que en la mquina remota donde se aloje el servidor se siten tambin
los ficheros de stub y skeleton.
Con todo ello disponible, se lanza el servidor llamando a JVM del host remoto.
En nuestro caso, el servidor remoto se activ en hercules.uca.es sobre el puerto
1099.
$ java EjemploRMI1 &
Antonio Tomeu Programacin Concurrente y Distribuida
53
FASES DE D!SENO RN! (+-REG!STRO)
Mtodo Naming.bind(Servidor",ORemoto);
para registrar el objeto remoto creado requiere que el servidor
de nombres est activo. El nombre de ese servidor es
rmiregistry
Dicho servidor se activa con start rmiregistry en Win32
Dicho servidor se activa con rmiregistry & en Unix.
Se puede indicar como parmetro adicional el puerto que
escucha.
Si no se indica, por defecto es el puerto 1099.
El parmetro puede ser el nombre de un host como en
Naming.bind(//sargo.uca.es:2005/Servidor",ORemoto);
Antonio Tomeu Programacin Concurrente y Distribuida
54
El objeto cliente procede siempre creando un objeto de
interfaz remota.
Posteriormente efecta una llamada al mtodo
Naming.lookup cuyo parmetro 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 travs de esa referencia el programador
puede invocar todos los mtodos de esa interfaz remota
como si fueran referencias a objetos en la JVM local.
FASES DE D!SENO RN! (5-CL!ENTE)
Antonio Tomeu Programacin Concurrente y Distribuida
55
/**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));
}
}
EJENPLO (CL!ENTE)
56
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 autmaticamente
Clases contenedoras tambin
Objetos complejos deben implementar la interfaz
Serializable (es un flag) para poder ser
serializados
Antonio Tomeu Programacin Concurrente y Distribuida
57
Ejemplo con serializacin 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);}
}
58
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;
}
!nterfaz
59
Gestionando la seguridad: policytool
Java tiene en cuenta la seguridad
System.setSecurityManager(new RMISecurityManager());
Se ajusta la seguridad:
Construyendo un objeto SecurityManager
Llamando al mtodo 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 poltica.
Seguridad reside en fichero especfico.
Java2 incorpora una herramienta visual: policytool
Antonio Tomeu Programacin Concurrente y Distribuida
60
Ajuste de la poltica 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 poltica con
Java Djava.security=fichero.policy
servidor|cliente
O bien crear objeto RMISecurityManager y ajustar
SetSecurityManager sobre el objeto creado.
61
Microsoft DCOM
Utiliza DCE RPC
Est orientado a un solo sistema operativo
Sin acuerdo
Jini de Sun
Basado en RMI de Java
Muy ligado al lenguaje Java
En sistemas empotrados
CORBA de OMG
Independiente del lenguaje
Marco arquitectnico comn
EJB
Nodelos de Objetos Distribuidos Nodelos de Objetos Distribuidos
Antonio Tomeu Programacin Concurrente y Distribuida
62
ES una tecnologa de integracin
Resuelve RPC con independencia del lenguaje.
Se puede hacer RPC a mtodos remotos de
objetos Java y no-Java
No es necesario conocer la ubicacin fsica del
objeto servidor
Marco de interaccin entre objetos distribuidos
estndar e independiente del lenguaje
Especificacin de objetos remotos comn a
todos los lenguajes a travs de IDL
Desarrollado por el OMG (produce
especificaciones, no productos)
CORBA ( CORBA (Common Common Object Object Request Request Broker Broker Architecture Architecture) )
Antonio Tomeu Programacin Concurrente y Distribuida
63
Elementos de CORBA
OMA (Object Management Architecture): es la
especificacin de la interoperabilidad entre
objetos
Core Object Model (Core Object Model):
establece los concepto bsicos sobre un objeto,
interfaz, operacin.
OMA Reference Architecture: define la
infraestructura de servicios y los mecanismos
subyacentes que permiten la interaccin entre
objetos.
ORB (Object Request Broker): es el canal de
comunicacin a travs del cual los objetos se
solicitan servicios con independencia de la
ubicacin fsica. Existen varias
implementaciones. (JavaIDL)
Antonio Tomeu Programacin Concurrente y Distribuida
64
Todos los elementos de CORBA son objetos
Cada objeto tiene una interfaz e identidad nicos
Cada objeto se puede implementar en un lenguaje
distinto y ejecutarse sobre cualquier HW y SO
CORBA define el bus software que permite la
interoperabilidad entre esta diversidad de
objetos
Antonio Tomeu Programacin Concurrente y Distribuida
65
OBJECT REQUEST BROKER
APPLICATION
INTERFACES
COMMON
FACILITIES
DOMAIN
INTERFACES
SERVICIOS A
OBJETOS
Naming
Persistence
Transactions
Concurrency
Security
Time
Properties
Externalization
Bussines
Healthcare
Finance
Telecom
Compound
Object Linking
Help
MOF
No
estandarizados
Por OMG
Modelo de Referencia OMA
66
ORB
Cliente Implementacin del objeto
Antonio Tomeu Programacin Concurrente y Distribuida
67
Estructura del ORB
68
ORB Core
IDL
Stub
Cliente
Interface dependiente del ORB
Stub para cada tipo de objeto
Object
Adapter
IDL
Skeleton
Servidor
rebObjeto.metodo(param)
marshalling
unmarshalling
metodo(param)
Invocacin Esttica
69
Lenguaje de Definicin de Interfaces (IDL)
Es un lenguaje de definicin de interfaces
orientado a objetos
Especificacin comn a todos los lenguajes de
una interfaz (mtodos y atributos) de objeto
Construye una representacin del objeto
distribuido comn a cliente y servidor
Soporta herencia
Sintaxis parecida a Java y C++
Precompila (map) a C, C++, Java, Ada, etc.
Ver:
http://java.sun.com/products/jdk/1.2/docs/guide/idl/
Antonio Tomeu Programacin Concurrente y Distribuida
70
Tecnologa que integra CORBA en el lenguaje
Java
En java, $idltojava fichero.idl
A partir de J2SE v1.4 es $idlj
Genera el stub del cliente y el skeleton del
servidor (con -fall)+otros ficheros
Ambos automatizan las siguientes tareas (junto
con el ORB):
Ordenamiento y serializacin de parmetros (marshalling)
Generan la implementacin de la clase de interfaz
Registro y activacin de objetos
Localizacin y conexin (binding) a objetos
JavaIDL
Antonio Tomeu Programacin Concurrente y Distribuida
71
idlj: compilador de IDL a Java
orbd: proceso demonio que contiene:
Boostrap Service
Servicio de Nombres Transitorios.
Servicio de Nombres Persistentes.
Un Gestor de Servidores
servertool:permite a los programadores de
aplicaciones registrar, dar de baja, arrancar y parar
servidores
tnameserv:Servicio de Nombres Transitorio en
versiones previas de JavaIDL. Se incluye por
compatibilidad hacia atrs.
Herramientas JavaIDL
Antonio Tomeu Programacin Concurrente y Distribuida
72
org.omg.CORBA
org.omg.CosNaming
org.omg.PortableServer
org.omg.CORBA.ORB
org.omg.PortableInterceptor
org.omg.DynamicAny
API JavaIDL Bsica
Antonio Tomeu Programacin Concurrente y Distribuida
73
Interfaz
IDL
Compilador de IDL
($idltojava)
($idlj) en J2SE
Stubs
Cliente
Aplicacin
Cliente
Skeletons
Servidor
Implemen.
Servidor
Aplicacin
Servidor
Compilando IDL
-fclient
-fserver
-fall
POA
Servidor
-fserver
A partir de J2SE
v1.4
74
El adaptador de objetos conecta una solicitud de cliente al cdigo
que le da servicio (servant) utilizando una referencia a objeto.
Java2SE da soporte POA a travs del API correspondiente
POA establece el nexo entre un objeto CORBA y su
implementacin (servant)
Establece la correspondencia entre peticiones de entrada y las
diferentes instancias de un mismo objeto.
POA define un espacio de nombres para los servants
Un POA puede tener varios servants
Un servant solo pertenece a un POA
Un servidor puede tener varios POAs activos
Al menos existe el POA raz
Las relaciones entre un POA y sus servants vienes descritas por las
polticas del POA
POA es un tipo de OA particular, definido en la especificacin
CORBA, para lograr:
Implementaciones de objetos portables entre diferentes ORB
Soporte a objetos de identidad persistente
Soporte a la activacin transparente de objetos
Servant que soporte identidades simultneas.
Portable Object Adapter (POA)
Antonio Tomeu Programacin Concurrente y Distribuida
75
ORB
POA Manager
POA
Servants
76
El Servicio de Nombres
El servicio nombre guarda pares
<nombre, referencia a objeto>
Los nombres estn organizados
jerrquicamente (tree-type) en un S.N.
Servidor, crea un servant y lo registra en SN
asociando (bind) una referencia a objeto con un
nombre
Cliente pide al SN que a partir de un nombre le
d (resolve) una referencia a objeto CORBA
En JavaIDL el SN se activa ejecutando
tnameserv. Por defecto, escucha al puerto 900
No es persistente y est derogado
A partir de J2SE 1.4 orbd proporciona
persistencia si se desea
77
Jeraqua de
Nombres
x
Servidor
bind(x, ref)
x
Cliente
resolve(A)
ref
NamingContext ncRef =
NamingContextHelper.narrow(refObj);
NameComponent nc = new
NameComponent("Impresor Remoto",
"");
NameComponent [] ruta = { nc };
ncRef.rebind(ruta, IRem);
NamingContext ncRef =
NamingContextHelper.narrow(refObj);
NameComponent nc = new
NameComponent("Impresor Remoto", "");
NameComponent [] ruta ={nc};
HolaMundoDistribuido ObjImpresor =
HolaMundoDistribuidoHelper.narrow(ncR
ef.resolve(ruta));
78
Interaccin Cliente/Servidor-Servicio de Nombres
ORB
79
Hola Mundo Distribuido Con CORBA
1
Especificacin IDL de la Interfaz Remota
/**Ejemplo de fichero de especificacion IDL
* @author Antonio Tomeu
*Es una especificacion de un objeto servidor remoto que recibe
como parametro
*una cadena de caracteres y la imprime en la salida estandar del
servidor
*
*/
interface HolaMundoDistribuido {
void Imprimir (in string mensaje);
};
1
Utilizando el servicio de nombres no persistente tnameserv ya derogado. Se explica por
compatiblidad hacia atrs.
80
Hola Mundo Distribuido Con CORBA
Servidor
/**Ejemplo de fichero que implanta un servidor via CORBA
* @author Antonio Tomeu
*/
//CosNaming contiene aspectos relacionados con el servicio de nombre de JavaIDL
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
//Implementacin del objeto servidor remoto. Es el codigo del futuro servant
//Debe extender siempre al skeleton generado con el compilador idlj
class ImpresorRemoto
extends _HolaMundoDistribuidoImplBase
{
public void Imprimir(String mensaje)
{System.out.println(mensaje);}
}
//Ahora se implementa la aplicacin remota, que realiza las siguientes tareas:
//(1) Crea e inicializa el ORB
//(2) Crea un objeto servidor remoto (servant)
//(3) Lo registra en el ORB
//(4) Lo registra en el servidor de nombre
//(5) Queda a la espera de solicitudes del cliente
81
public class ServidorRemoto
{
public static void main(String[] args)
throws Exception
{
//se crea e inicializa el ORB El identificador orb es una referencia al
//ORB creado. Utilizamos el ORB propocionado con la distribucin JavaIDL
//aunque otros son posibles.
ORB orb = ORB.init(args, null);
//crea un objeto servidor. Por ahora es un objeto java
ImpresorRemoto IRem = new ImpresorRemoto ();
//Se produce el registro de este objeto java en el servicio de nombres
//una vez concluida, es un objeto CORBA (servant)
orb.connect(IRem);
org.omg.CORBA.Object refObj=
orb.resolve_initial_references ("NameService");
//La referencia a tal servicio debe convertirse a una referencia a
//objetos NamingContext.
NamingContext ncRef = NamingContextHelper.narrow(refObj);
//Ahora damos un nombre que sera el utilizado por los clientes para
//enviar solicitudes al objeto servidor
NameComponent nc = new NameComponent("Impresor Remoto", "");
NameComponent [] ruta = { nc };
//Se vincula la referencia pasada a String con la referencia a objeto
ncRef.rebind(ruta, IRem);
//Se esperan peticiones de clientes.
java.lang.Object sinc = new java.lang.Object();
synchronized (sinc)
{sinc.wait();}
}
}
82
Hola Mundo Distribuido Con CORBA
Cliente
/**Ejemplo de fichero que implanta un servidor via CORBA
* @author Antonio Tomeu
*/
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class ClienteHolaMundoDistribuido
{
public static void main(String[] args)
throws Exception
{
//Se crea el ORB del cliente. Se utiliza el proporcionado con JavaIDL.
//Otros son posibles.
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object refObj =
orb.resolve_initial_references ("NameService");
NamingContext ncRef = NamingContextHelper.narrow(refObj);
//Se le pide al Servicio de Nombres que resuelva la referencia para el
//servidor.
NameComponent nc = new NameComponent("Impresor Remoto", "");
NameComponent [] ruta = { nc };
HolaMundoDistribuido ObjImpresor =
HolaMundoDistribuidoHelper.narrow(ncRef.resolve(ruta));
ObjImpresor.Imprimir("Hola Mundoooooooooooooo");
}
}
83
Hola Mundo Distribuido Con CORBA
Ejecutando el Servicio de Nombres
Antonio Tomeu Programacin Concurrente y Distribuida
84
Hola Mundo Distribuido Con CORBA
2
Especificacin IDL
2
Utilizando el servicio de nombres persistente orbd. Es el estndar de Java IDL a partir
de J2SE y versiones del jdk 1.4 o superiores.

También podría gustarte