Tema6 llamadas a procedimientos...

Post on 09-Feb-2020

2 views 0 download

Transcript of Tema6 llamadas a procedimientos...

Tema 6

Llamadas a procedimientos remotos

F. García-Carballeira, Mª. Soledad Escolar,

Luis Miguel Sánchez, Fco. Javier García

Sistemas Distribuidos

Grado en Ingeniería Informática

Universidad Carlos III de Madrid

Contenidos

� Remote Procedure Call (RPC)

� Conceptos básicos

� Aspectos relacionados con las RPCs

� RPC de Sun Microsystems

� Biblioteca de funciones de RPC

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Biblioteca de funciones de RPC

� Compilar un programa

� Ejemplo de RPC

� Invocación de métodos remotos

2

RPC

� RPC (Remote Procedure Call): llamadas a procedimientos remotos

� Por Birrel y Nelson (1985) en “Implementing Procedure Calls”

� Híbrido:� Llamadas a procedimientos en local

� Paso de mensajes

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Paso de mensajes

� Las RPC constituyen el núcleo de muchos SSDD

� Llegaron a su culminación con DCE (Distributed Computing Environment)

� Han evolucionado hacia orientación a objetos� Invocación de métodos remotos (CORBA, RMI)

3

RPC

� Las RPCs ofrecen una interfaz sencilla para construir aplicaciones distribuidas sobre TCP/IP

RMI and RPC

Aplicaciones/servicios

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

Sockets

Aplanamiento (marshalling), representación externa

de datos

Protocolo de transporte

UDP y TCP

4

RPCs en la pila de protocolos

� RPC:� En el nivel de sesión en OSI

� En el nivel de aplicación en TCP/IP

� Independientes del

RPC

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Independientes del protocolo de transporte� TCP

� UDP

� Fiabilidad no garantizada� Depende del protocolo de

transporte

5

RPC de Sun Microsystems

� La versión 2 de RPC, descrita en la RFC 1057, fue estandarizada por Sun Microsystems

� Se ocupa:� Especificación e interpretación de mensajes

� NO se ocupa:� Cómo se realiza el intercambio de mensajes entre los procesos

� Restricciones de la capa de transporte utilizado

Binding entre un cliente a un servicio

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Binding entre un cliente a un servicio

� La sintaxis y el formato de los mensajes se define mediante IDL (Interface Definition Language):� Lenguaje de especificación de RPC

� Lenguaje de especificación de datos XDR

6

Comunicación cliente-servidor

� Protocolo petición-respuesta

Mensaje de peticiónSolicitar operación Recibir petición

Seleccionar servicio

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

ServidorCliente

(esperar)

(continúa)

Mensaje de respuestaEjecutar servicio

Seleccionar servicio

Enviar respuesta

7

Estructura de los mensajes

petición-respuesta

Id. De petición

Id. De operación

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

8

argumentos

Resultado

Funcionamiento de las RPC

� El proceso que realiza la llamada empaqueta los argumentos en un mensaje, se los envía a otro proceso y espera el resultado

� El proceso que ejecuta el procedimiento extrae los argumentos del mensaje, realiza la llamada de forma local, obtiene el resultado y se lo envía de vuelta al proceso que realizó la llamada

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

9

� Objetivo: acercar la semántica de las llamadas a procedimiento convencional a un entorno distribuido (transparencia)

main(){...r = sumar (4, 5);...

}

sumar(int a, int b)int r;r = a + b;return r;

}

…send(a, b);receive(r);…

receive(4,5)…send (r)

Llamada local

main(){...r = sumar (4, 5);...

}

sumar(int a, int b)int r;r = a + b;

Pila del proceso

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

10

r = a + b;return r;

}

Registro de activación

r

b

a

Dir retorno

Llamada a procedimiento remoto

main(){...r = sumar (4, 5);...

}a

Dir retorno

bc

Cliente

servidor

Stub sumar(int a, int b)send(a, b);receive(r);

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

11

main(){receive (4, 5)...r = sumar (4, 5);send (r)

}

sumar(int a, int b)int r;r = a + b;return r;

}

servidorreceive(r);return(r);

}peticion

respuesta

Stub

Conceptos básicos

� Una RPC tiene dos participantes:

� Un cliente activo, que envía una RPC al servidor

� Un servidor pasivo, que calcula un resultado y lo devuelve al cliente

� Un servicio de red es una colección de uno o más programas remotos

� Un programa remoto implementa uno o más procedimientos remotos

� Un servidor puede soportar más de una versión de un programa remoto

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Un servidor puede soportar más de una versión de un programa remoto� Permite al servidor ser compatible con las actualizaciones de protocolos

� Un procedimiento remoto, sus parámetros y sus resultados se especifican en un fichero de especificación del protocolo escrito en el lenguaje de especificación de RPC y XDR

12

Suplentes (stubs)

� Se generan automáticamente por el software de RPC� Stub del cliente

� Stub del sevidor

� Un stub es una pieza de código usada en el cliente y el servidor

� Responsable de convertir los parámetros de la aplicación cliente/servidor durante una llamada a procedimiento remoto

Cliente

ServidorStub

Stub

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

13

durante una llamada a procedimiento remoto� Espacio de direcciones independiente del cliente y servidor

� Representaciones de datos diferentes (big-endian, little-endian)

� Los suplentes son independientes de la implementación que se haga del cliente y del servidor. � Sólo dependen de la interfaz

Suplentes (stubs)

� Funciones en el cliente:� Suplantar al procedimiento a ejecutar

� Localizar al servidor

� Empaquetar los parámetros y construir los mensajes

� Enviar el mensaje al servidor

Esperar la recepción del mensaje y devolver los resultados

Cliente

ServidorStub

Stub

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Esperar la recepción del mensaje y devolver los resultados

� Funciones en el servidor:� Realizan tareas similares

14

RPC: protocolo básico

cliente servidorSe registra en un servicio de nombres

Recibir la petición

localizar al servidor

prepararparámetros, enviar petición

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

Desempaquetar la respuesta

Recibir la petición

Ejecutar elprocedimiento

Preparar la respuestay enviar

enviar petición

15

RPC: protocolo básico

Máquina servidoraMáquina cliente

Protocolo

Proceso cliente (llamador)

Proceso servidor (llamado)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

Protocolo petición-respuesta

Stub Stub

16

Proceso cliente (llamador)� Conectar al servidor

� Invocar una llamada a procedimiento remoto

Stub o resguardo del cliente:

Máquina cliente

Proceso cliente (llamador)

RPC: protocolo básico

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Localizar al servidor

� Empaquetar los parámetros y construir los mensajes

� Enviar los mensajes al servidor

� Bloquearse hasta esperar la respuesta

� Obtener la respuesta

Stub

17

RPC: protocolo básico

Máquina servidora

Proceso servidor (llamado)

� Registrar las RPCs

� Implementar los procedimientos

Stub o resguardo del servidor:� Recibir la petición del cliente

Proceso servidor (llamado)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

Stub

� Recibir la petición del cliente

� Desempaquetar los parámetros

� Invocar el procedimiento de manera local

� Obtener la respuesta y enviarla al cliente

18

Modelos de RPCs

� RPCs síncronas

� RPCs asíncronas

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

19

RPC asíncronas

� El cliente no espera la respuesta

� No admite parámetros de salida

� Ejemplo en CORBA:� Se corresponden con métodos especificados como oneway

cliente servidor

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

20

cliente servidorlocalizar al servidorprepararparámetros, enviar petición

Se registra en un servicio de nombres

Recibir la petición

Ejecutar elprocedimiento

Aspectos relacionados con las RPC

� Lenguaje de definición de interfaces (IDL)

� Generador de stubs

� Tipos de parámetros

� Transferencia de parámetros

� Protocolo de comunicación

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Protocolo de comunicación

� Enlace entre el cliente y el servidor (binding)

� Semántica de las RPC en presencia de fallos

� Autenticación

21

� Un Lenguaje de Definición de Interfaz (IDL) permite especificar el formato de los procedimientos remotos y otras opciones de comunicación

� La interfaz es compartida por

� Cliente

� Servidor

Cliente

ServidorStub

Lenguaje de Definición de Interfaces

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

22

<opciones de comunicación:versión interfaz, tcp/udp, …

><interfaz remota:suma (in int a, in int b, out int c) ;

>generador

STUB

Stub

� Una interfaz especifica:� Nombre de servicio que utilizan los clientes y servidores

� Nombres de procedimientos

� Parámetros de los procedimientos� Entrada

� Salida

� Tipos de datos de los argumentos

Lenguaje de Definición de Interfaces

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

23

� Tipos de datos de los argumentos

� Los compiladores pueden diseñarse para que los clientes y servidores se escriban en lenguajes diferentes

� Tipos de IDL� Integrado con un lenguaje de programación (Cedar, Argus)

� Lenguaje de definición de interfaces específico para describir las interfaces entre los clientes y los servidores (RPC de Sun y RPC de DCE)

Tipos de parámetros

� Parámetro de entrada (in)� El parámetro se envía del cliente al servidor

� Parámetro de salida (out)� El parámetro se envía del servidor al cliente

� Parámetro de entrada/salida (inout)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

24

Parámetro de entrada/salida (inout)

Transferencia de parámetros

� Una de las funciones de los suplentes es empaquetar los parámetros en un mensaje: aplanamiento (marshalling)

� Problemas en la representación de los datos:� Servidor y cliente pueden ejecutar en máquinas con arquitecturas

distintas (ordenamiento de bytes)� Problemas con los punteros

� Una dirección sólo tiene sentido en un espacio de direcciones

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

25

� Una dirección sólo tiene sentido en un espacio de direcciones

� Ejemplos de esquemas de representación de datos:� XDR (eXternal Data Representation) es un estándar que define la

representación de tipos de datos (RFC 1832)� Representación común de datos de CORBA (CDR)� Serialización de objetos de Java� XML (eXtensible Markup Language ) es un metalenguaje basado en

etiquetas definida por W3C

Ejemplo de representación de datos

� Mensaje: ‘Smith’, ‘London’, 1934

0–3

4–7

8–11

12–15

5

"Smit""h___"

6

index in sequenceof bytes 4 bytes

notes

length of string

‘Smith’

length of string

XDR CDR

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

26

16–19

20-23

24–27

"Lond"

"on__"

1934

‘London’

unsigned long

<person>

<name>Smith</name>

<place>London</place>

<year>1934</year>

</person>

XML

Protocolo

� Entre cliente y servidor debe establecerse un protocolo:� Formato de los mensajes

� Formato de representación

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

27

Enlace (Binding)

� Enlace: asociación entre el cliente y el servidor� Implica localizar al servidor que ofrece un determinado

servicio� El servidor debe registrar su dirección en un servicio de

nombres (binder)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

28

Enlazador dinámico

� Enlazador dinámico (binder): es el servicio que mantiene una tabla de traducciones entre nombres de servicio y direcciones.

� Incluye funciones para:� Registrar un nombre de servicio

� Eliminar un nombre de servicio

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

29

Eliminar un nombre de servicio� Buscar la dirección correspondiente a un nombre de servicio

� Cómo localizar al enlazador dinámico:1. Ejecuta en una dirección fija de un computador fijo2. El sistema operativo se encarga de indicar su dirección

3. Difundiendo un mensaje (broadcast) cuando los procesos comienzan su ejecución.

1

5

Esquema de registro y enlace

cliente servidor

1

34

6

7 2

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

1 Obtiene dirección

30

binder

3

2 Registra dirección

3 Busca servidor

4 Devuelve dirección

5 Petición

6 Respuesta

7 Borra dirección (fin del servicio)

Tipos de enlace

� Enlace no persistente: el binding entre el cliente y el servidor se establece en cada RPC� Más tolerante a fallos� Permite migración de servicios

� Enlace persistente: el binding se mantiene después de la

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Enlace persistente: el binding se mantiene después de la primera RPC� Útil en aplicaciones con muchas RPC repetidas� Problemas si lo servidores cambian de lugar

� Modelos híbridos

31

Fallos que pueden aparecer con las RPC

� El cliente no es capaz de localizar al servidor

� Pérdidas de mensajes� Se pierde el mensaje de petición del cliente al servidor

� Se pierde el mensaje de respuesta del servidor al cliente

� El servidor falla después de recibir una petición

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

32

El servidor falla después de recibir una petición

� El cliente falla después de enviar una petición

Cliente no puede localizar al servidor

� Posibles causas:� El servidor puede estar caído

� El cliente puede estar usando una versión antigua del servidor� La versión ayuda a detectar accesos a copias obsoletas

Cómo indicar el error al cliente

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Cómo indicar el error al cliente� Devolviendo un código de error (-1)

� No es transparente � Ejemplo: sumar(a,b)

� Elevando una excepción� Necesita un lenguaje que tenga excepciones

33

Pérdida de mensajes del cliente

� Es la más fácil de tratar

� Se activa una alarma (timeout) después de enviar el mensaje

� Si pasado el timeout no se recibe una respuesta se retransmite el mensaje

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

34

Pérdidas en los mensajes de respuesta� Más difícil de tratar� Se pueden emplear alarmas y retransmisiones, pero:

� ¿Se perdió la petición?� ¿Se perdió la respuesta?� ¿El servidor va lento?

� Algunas operaciones pueden repetirse y devolverán el mismo resultado (operaciones idempotentes)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

(operaciones idempotentes)� Una transferencia bancaria no es idempotente� La suma de dos números es idempotente

� La solución con operaciones no idempotentes es descartar peticiones ya ejecutadas � Un número de secuencia en el cliente� Un campo en el mensaje que indique si es una petición original o una

retransmisión

35

Fallos en los servidores

� El servidor no ha llegado a ejecutar la operación� Se podría retransmitir

� El servidor ha llegado a ejecutar la operación� El cliente no puede distinguir los dos� ¿Qué hacer?

� No garantizar nada

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

36

� No garantizar nada� Semántica al menos una vez

� Reintentar y garantizar que la RPC se realiza al menos una vez� No vale para operaciones no idempotentes

� Semántica a lo más una vez

� No reintentar, puede que no se realice ni una sola vez

� Semántica de exactamente una

� Sería lo deseable

Fallos en los clientes

� La computación está activa pero ningún cliente espera los resultados (computación huérfana)� Gasto de ciclos de CPU

� Si el cliente rearranca y ejecuta de nuevo la RPC se pueden crear confusiones

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

37

Estrategias ante fallos

� Cliente RPC:� Cuando no se recibe la respuesta

� Reenviar la petición

� Incluir identificador de petición (número de secuencia)

� Servidor RPC:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

38

� Servidor RPC:� Para hacer frente a peticiones duplicadas

� Filtrar las peticiones (números de secuencia, etc.)

� Si se necesita reenviar una respuesta de una petición no idempotente:� Guardar un histórico de las peticiones anteriormente ejecutadas y su

respuesta para no ejecutar de nuevo la petición.

Aspectos de implementación

� Protocolos RPC

� Orientados a conexión� Fiabilidad se resuelve a bajo nivel

� Peor rendimiento

� No orientados a conexión

� Uso de un protocolo estándar o uno específico

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

39

� Uso de un protocolo estándar o uno específico� Algunos utilizan TCP o UDP como protocolos básicos

Programación con un paquete de RPC

� El programador debe proporcionar:� La definición de la interfaz (IDL)

� Nombres de los procedimientos

� Parámetros que el cliente pasa al servidor

� Resultados que devuelve el servidor al cliente

� El código del cliente

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� El código del cliente

� El código del servidor

� El compilador de IDL genera :� El resguardo (stub) del cliente

� El resguardo (stub) del servidor

40

Desarrollo de la aplicación con RPC

DESARROLLODE LA

INTERFAZ

COMPILADOR IDL

SUPLENTEEN SERVIDOR

SUPLENTEEN CLIENTE

CABECERA

FICHERODE DEFINICIÓNDE INTERFAZ

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

41

COMPILADOR C COMPILADOR C

COMPILADOR CCOMPILADOR C

CABECERA CABECERAFICHEROSFUENTE DEL

CLIENTE

FICHEROSOBJETO DEL

CLIENTE

FICHEROSOBJETO DEL

SERVIDOR

EJECUTABLEDEL

CLIENTE

EJECUTABLEDEL

SERVIDOR

FICHEROSFUENTE DELSERVIDOR

OBJETOSUPLENTEEN CLIENTE

OBJETOSUPLENTE

EN SERVIDOR

MONTADOR MONTADOR

BIBLIOT.RPC

BIBLIOT.RPC

DESARROLLODEL

CLIENTE

DESARROLLO

SERVIDOR

@Fuente: Jesús Carretero, Félix García, Pedro de Miguel y Fernando Pérez. Mc Graw Hill

RPC de SUN Microsystems

� Diseñado para el sistema de ficheros NFS

� Descrito en RFC 1831

� También se denomina ONC-RPC (Open network computing)

� Se puede elegir UDP oTCP� Cliente y servidor deben estar de acuerdo en el protocolo de transporte a

utilizar

Utiliza la semántica al menos una vez

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

42

� Utiliza la semántica al menos una vez

� Utiliza un lenguaje de definición de interfaces denominado XDR

� Soporte:� Para C a través del compilador rpcgen en UNIX/Linux

� Para Java � http://acplt.plt.rwth-aachen.de/ks/english/remotetea.html

� Para plataformas Windows

RPC de SUN y el modelo OSI

aplicación

XDR

RPC

7. Aplicación

6. Presentación

5. Sesión

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

43

TCP UDP

IP

Interfaz HW

RED

4. Transporte

3. Red

1-2 Enlace de datosY físico

Lenguaje XDR� XDR (eXternal Data Representation) es un estándar que define la representación de

tipos de datos (RFC 1832)� Utilizado inicialmente para representaciones externas de datos� Se extendió a lenguajes de definición de interfaces� Una interfaz contiene:

� Un número de programa � Un número de versión del programa� Un conjunto de procedimientos remotos:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

44

Un conjunto de procedimientos remotos:� Un nombre y un número de procedimiento� Los procedimientos sólo aceptan un parámetro de entrada (se encapsulan en una

estructura)� Los parámetros de salida se devuelven mediante un único resultado

� El lenguaje ofrece una notación para definir:� constantes� definición de tipos� estructuras, uniones� programas

Formato de definición de interfaz program-def :

" program " identifier " { "

version-def

version-def *

" } " " =" constant " ; “ /* Number of program */

version-def :

" version " identifier " { "

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

procedure-def

procedure-def *

" } " " =" constant " ; " /* Number of version */

procedure-def :

type-specifier identifier " ( " type-specifier

(" , " type-specifier )* " ) "

" =" constant ";“ /* Number of procedure */

45

Ejemplo:

especificación del programa ping/* Simple ping program */

program PING_PROG{

/* Latest and greatest version */

version PING_VERS_PINGBACK{

void

PINGPROC_NULL(void) = 0;

/*

* Ping the caller, return the round-trip time (in microseco nds).

Returns -1 if the operation timed out.

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

*/

int

PINGPROC_PINGBACK(void) = 1;

} = 2;

/* Original version */

version PING_VERS_ORIG {

void

PINGPROC_NULL(void) = 0;

} = 1;

} = 1;

const PING_VERS = 2; /* latest version */

46

Identificación de llamadas a RPC

� Un mensaje de llamada de RPC se identifica unívocamente mediante tres campos enteros sin signo:

(NUM-PROG, NUM-VERSION, NUM-PROCEDURE)

NUM-PROG es el número de programa remoto,

NUM-VERSION es el número de versión de programa,

NUM-PROCEDURE es el número de procedimiento remoto

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Detalles de implementación:� NUM-PROG se definen en la RFC 1831

� http://www.ietf.org/rfc/rfc1831.txt

� La primera implementación (versión) de un protocolo deber ser la 1

� Los números de procedimientos se especifican por el programador

47

El proceso portmapper� El enlace en las RPC de sun se realiza mediante un proceso denominado

portmapper

� En cada servidor ejecuta un proceso portmapper en un puerto bien conocido (111)

� El portmapper almacena por cada servicio local:� El número de programa

� El número de versión

� El número de puerto

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

48

� El número de puerto

� Enlace dinámico:� El número de puertos disponibles es limitado y el número de programas remotos

potenciales puede ser muy grande

� Sólo el portmapper ejecutará en un puerto determinado (111) y los números de puertos donde escuchan los servidores se averiguan preguntando al portmapper

� Soporta TCP y UDP (ver /etc/services)� sunrpc 111/tcp portmapper #RPC 4.0

portmapper

� sunrpc 111/udp portmapper

El proceso portmapper

� Protocolo: � Cuando un servidor arranca registra en el portmapper la información

anterior� Cuando un cliente necesita invocar un procedimiento remoto envía al portmapper del host remoto (necesita conocer la dirección IP del servidor)� El número de programa y el número de versión

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

49

� El portmapper devuelve el puerto del servidor

rpcinfo –p guernika.lab.inf.uc3m.es

./servidor &

El proceso portmapper

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

50

rpcinfo –p guernika.lab.inf.uc3m.esprograma vers proto puerto

100000 2 tcp 111 portmapper100000 2 udp 111 portmapper…

100024 1 udp 32772 status100024 1 tcp 59338 status

99 1 udp 4693699 1 tcp 40427

Biblioteca de funciones de RPC

� La biblioteca de funciones de RPC � Sistemas Unix

� Servicios de RPC para construir aplicaciones � En el cliente

� Crear un manejador de cliente

Destruir un manejador de cliente

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Destruir un manejador de cliente

� En el servidor

51

La biblioteca de funciones

� rpc.h es una biblioteca de funciones para desarrollar aplicaciones distribuidas que usan RPC:#include <rpc/rpc.h>

� Múltiples niveles de acceso:� Interfaz simplificado

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

� Interfaz simplificado

� Rutinas de nivel intermedio

� Rutinas de alto nivel

52

Servicios de RPC

� Crear un manejador para el cliente

CLIENT *clnt_create (const char * host, const u_long prognum,

const u_long versnum, const char *nettype)

Argumentos:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

53

� host nombre del host remoto donde se localiza el programa remoto

� prognum Número de programa del programa remoto� versnum Número de versión del programa remoto� nettype Protocolo de transporte:

NETPATH, VISIBLE, CIRCUIT_V, DATAGRAM_V, CIRCUIT_N, DATAGRAM_N, TCP, UDP

Servicios de RPC

� Destruir el manejador del cliente

void clnt_destroy (CLIENT *clnt)

Argumentos:� clnt Manejador de RPC del cliente

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

54

Servicios de RPC

� Indicar el error en un fallo de RPC:

void clnt_perror (CLIENT *clnt, char *s)void clnt_pcreateerror (CLIENT *clnt, char *s)

Argumentos:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

55

� clnt Manejador de RPC del cliente� S Mensaje de error

Ejemplo: crear/destruir un manejador#include <stdio.h>

#include <rpc/rpc.h>

#define RMTPROGNUM(u_long)0x3fffffffL /* Define remote program number and version */

#define RMTPROGVER(u_long)0x1

main()

{

CLIENT *client ; /* client handle */

/* Crear el manejador del cliente */

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

/* Crear el manejador del cliente */

client = clnt_create (“as400.somewhere.ibm.com”, RMTPROGNUM, RMTPROGVER, “TCP”);

if (client == NULL){

clnt_pcreateerror (client, “Could not create client\n”);

exit(1);

}

// Invocar procedimiento remoto

/* Destruir el manejador del cliente */

clnt_destroy (client);

exit(0);

}

56

Invocar un procedimiento (cliente)

� Un procedimiento remoto se invoca:tipo_resultado procedimiento _v (tipo_arg1 arg1,

tipo_arg2 arg2,

tipo_argn argn,

CLIENT *clnt)

donde:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

donde:� procedimiento_v Nombre del procedimiento a invocar� arg1,arg2,…,argn Argumentos del procedimiento� clnt Manejador de un cliente de RPC

NOTA: v se sustituye por el número de versión que se invoca

57

Implementar un procedimiento

(servidor)

� Para cada procedimiento remoto, el servidor ofrece una implementación de procedimiento respetando su prototipo:tipo_resultado

procedimiento_v _svc (tipo_arg1 arg1,

tipo_arg2 arg2,

tipo_argn argn ,

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

tipo_argn argn ,

struct svc_req *rqstp)

donde:� procedimiento_v_svc Nombre del procedimiento a implementar� arg1,arg2,…,argn Argumentos del procedimiento� rqstp Estructura que contiene información de la

peticiónNOTA: v se sustituye por el número de versión que se implementa

58

Compilador de interfaces (rpcgen)

� rpcgen es el compilador de interfaces que genera código C para:� Stub del cliente

� Stub del servidor y procedimiento principal del servidor

� Procedimientos para el empaquetado y desempaquetado XDR

Fichero de cabecera (.h) con los tipos y declaración de

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

59

� Fichero de cabecera (.h) con los tipos y declaración de prototipos de procedimientos

Sintaxis de rpcgen

� Compilar usando rpcgenrpcgen infile

rpcgen [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile

rpcgen [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]rpcgen [-s nettype]* [-o outfile] [infile]rpcgen [-n netid]* [-o outfile] [infile]

infile fichero en lenguaje de definición de interfaz de RPC

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

60

� infile fichero en lenguaje de definición de interfaz de RPC (XDR en RPC de SUN)

� Algunas opciones:� -N Permite a los procedimientos tener múltiples argumentos� -a Genera todos los ficheros incluyendo código de ejemplo para

cliente y servidor� -M Genera stubs multi-thread para paso de argumentos

Ejemplo: aplicación con RPC

clientesumar(5,2)

5+2

servidor

Máquina A Máquina B

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

NÚCLEO Resultado = 7 NÚCLEO

RED

61

@Fuente: Jesús Carretero, Félix García, Pedro de Miguel y Fernando Pérez. Mc Graw Hill

Esquema de la aplicación

rpcgensuma_xdr.c

suma_clnt.c

cliente.cArchivos para

el cliente

Archivos

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

62

suma.xrpcgen

suma_svc.c

servidor.c

suma.h

Archivoscomunes

Archivos parael servidor

Ficheros generados por el programador

Ficheros generados mediante rpcgen suma.x

struct argumentos {

int a;

int b;

};

program SUMAR{

version SUMAVER{

Ejemplo: suma.x

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

version SUMAVER{

int SUMA(argumentos) = 1;

int RESTA(argumentos) = 2;

} = 1;

} = 99;

63

Ejemplo: suma.h#ifndef _SUMA_H_RPCGEN

#define _SUMA_H_RPCGEN

#include <rpc/rpc.h>

struct argumentos {

int a;

int b;

};

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

64

#define SUMAVER ((u_long)99)

#define SUMA ((u_long)1)

#define RESTA ((u_long)2)

extern int * suma_1(argumentos *, CLIENT *);

extern int * suma_1_svc (argumentos *, struct svc_req *);

...

#endif /* !_SUMA_H_RPCGEN */

Ejemplo: servidor.c#include "suma.h"

int * suma_1_svc (argumentos *argp, struct svc_req *rqstp)

{

// TODO: implementación del procedimiento suma_1_sv c

static int result;

result = argp->a + argp->b;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

65

return(&result);

}

int * resta_1_svc (argumentos *argp, struct svc_req *rqstp)

{

// TODO: implementación del procedimiento resta_1_s vc

static int result;

result = argp->a - argp->b;

return(&result);

}

Ejemplo: cliente.c#include "suma.h"

#include <rpc/rpc.h>

main( int argc, char* argv[] )

{

CLIENT *clnt ;

int *res;

argumentos suma_1_arg;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

66

argumentos suma_1_arg;

char *host;

if(argc < 2) {

printf("usage: %s server_host\n", argv[0]);

exit(1);

}

host = argv[1];

Ejemplo: cliente.c (II)/* Paso 1: localizar al servidor */clnt = clnt_create (host, SUMAR, SUMAVER, "udp");if (clnt == NULL) {

clnt_pcreateerror (host);exit(1);

}

suma_1_arg.a = 5;suma_1_arg.b = 2;

Binding:Se contacta con el portmapper de hostSe indica el host:API:versión:protocoloEl portmapper indica la localización (puerto)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

67

/* Paso 2: Invocar el procedimiento remoto */res = suma_1(&suma_1_arg, clnt);if (res == NULL) {

clnt_perror (clnt, "call failed:");}printf("La suma es %d\n", *res);

/* Destruir el manejador */clnt_destroy ( clnt );

}

suma_xdr.c#include "suma.h"

bool_t

xdr_argumentos (XDR *xdrs, argumentos *objp)

{

register int32_t *buf;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

68

if (! xdr_int (xdrs, &objp->a))

return FALSE;

if (! xdr_int (xdrs, &objp->b))

return FALSE;

return TRUE;

}

suma_clnt.c (stub del cliente)#include <memory.h> /* for memset */

#include "suma.h"

/* Default timeout can be changed using clnt_contro l() */

static struct timeval TIMEOUT = { 25, 0 };

int * suma_1(argumentos *argp, CLIENT *clnt)

{

static int clnt_res;

Stub

Cliente

Servidor

Stub

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

69

memset((char *)&clnt_res, 0, sizeof(clnt_res));

if ( clnt_call (clnt, suma,

(xdrproc_t) xdr_argumentos, (caddr_t) argp,

(xdrproc_t) xdr_int, (caddr_t) &clnt_res,TIMEOUT) ! = RPC_SUCCESS)

{

return (NULL);

}

return (&clnt_res);

}

int * resta_1 (argumentos *argp, CLIENT *clnt)...

suma_svc.c

(stub del servidor)int main (int argc, char **argv)

{

register SVCXPRT *transp;

pmap_unset (SUMAR, SUMAVER);

transp = svcudp_create (RPC_ANYSOCK);

svc_register (transp, SUMAR, SUMAVER, sumar_1, IPPROTO_UDP;

transp = svctcp_create (RPC_ANYSOCK, 0, 0);

Cliente

ServidorStub

Stub

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

70

transp = svctcp_create (RPC_ANYSOCK, 0, 0);

svc_register (transp, SUMAR, SUMAVER, sumar_1, IPPROTO_TCP;

svc_run ();

fprintf (stderr, "%s", "svc_run returned");

exit (1);

/* NOTREACHED */

}

suma_svc.c (II)

(stub del servidor)static void sumar_1(struct svc_req *rqstp, register SVCXPRT *transp)

{

union {

argumentos suma_1_arg;

argumentos resta_1_arg;

} argument;

char *result;

xdrproc_t _xdr_argument, _xdr_result;

char *(*local)(char *, struct svc_req *);

Cliente

ServidorStub

Stub

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

71

char *(*local)(char *, struct svc_req *);

switch (rqstp->rq_proc) {

case NULLPROC:

(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);

return;

case suma:

_xdr_argument = (xdrproc_t) xdr_argumentos;

_xdr_result = (xdrproc_t) xdr_int;

local = (char *(*)(char *, struct svc_req *)) suma_1_svc ;

break;

suma_svc.c (III)

(stub del servidor)case resta:

_xdr_argument = (xdrproc_t) xdr_argumentos;

_xdr_result = (xdrproc_t) xdr_int;

local = (char *(*)(char *, struct svc_req *)) resta_1_svc ;

break;

default:

svcerr_noproc (transp); return;

}

memset ((char *)&argument, 0, sizeof (argument));

svc_getargs ( transp , _ xdr_argument , ( caddr_t ) &argument );

Cliente

ServidorStub

Stub

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

72

svc_getargs ( transp , _ xdr_argument , ( caddr_t ) &argument );

result = (*local)((char *)&argument, rqstp);

if (result != NULL &&

!svc_sendreply(transp, _xdr_result, result)){

svcerr_systemerr (transp);

}

if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) {

fprintf (stderr, "%s", "unable to free arguments");

exit (1);

}

return;

}

Compilación

� gcc –c suma_xdr.c

� gcc –c suma_svc.c

� gcc –c suma_clnt.c

� gcc –c cliente.c

� gcc –c servidor.c

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

73

� gcc –c servidor.c

� gcc suma_xdr.o suma_clnt.o cliente.o –o cliente

� gcc suma_xdr.o suma_svc.o servidor.o –o servidor

Compilación

� rpcgen –a –N –M suma.x

� Opciones:� -a: genera todos los ficheros incluyendo ejemplos

� -N: permite varios argumentos

� -M: genera código multithread (código que puede ser utilizado en aplicaciones con varios threads)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

en aplicaciones con varios threads)

74

suma.x:

Ejemplo usando nuevas opciones

program SUMAR {

version SUMAVER {

int suma(int a, int b) = 1;

int resta(int a, int b) = 2;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

75

int resta(int a, int b) = 2;

} = 1;

} = 99;

Nota:La opción de compilación –N permite que un procedimiento acepte más de un argumento de entrada

Ficheros que se generan

� suma.h: incluye prototipos de funciones

� suma_client.c: ejemplo de cliente.

� suma_clnt.c: stub del cliente

� suma_server.c: plantilla con las funciones a implementar en el servidor

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

en el servidor

� suma_svc.c: stub del servidor

� suma_xdr.c: funciones XDR

76

suma.h#include <rpc/rpc.h>

#include <pthread.h>

struct suma_1_argument {

int a;

int b;

};

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

77

};

typedef struct suma_1_argument suma_1_argument;

struct resta_1_argument {

int a;

int b;

};

typedef struct resta_1_argument resta_1_argument;

suma.h (2)#define SUMAR 99

#define SUMAVER 1

extern enum clnt_stat suma_1(int , int , int *, CLIENT *);

extern bool_t suma_1_svc (int , int , int *, struct svc_req *);

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

78

svc_req *);

extern enum clnt_stat resta_1 (int , int , int *, CLIENT *);

extern bool_t resta_1_svc (int , int , int *, struct svc_req *);

suma_client.c:

Ejemplo de cliente

#include "suma.h"

void sumar_1(char *host){

CLIENT *clnt ;enum clnt_stat retval_1;int result_1; int suma_1_a; int suma_1_b;enum clnt_stat retval_2;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

79

enum clnt_stat retval_2;int result_2; int resta_1_a; int resta_1_b;

clnt = clnt_create (host, SUMAR, SUMAVER, “tcp");if (clnt == NULL) {

clnt_pcreateerror (host);exit (1);

}

retval_1 = suma_1(suma_1_a, suma_1_b, &result_1, clnt);

if (retval_1 != RPC_SUCCESS) {

clnt_perror (clnt, "call failed");

}

retval_2 = resta_1 (resta_1_a, resta_1_b,&result_2, clnt);

if (retval_2 != RPC_SUCCESS) {

suma_client.c:

Ejemplo de cliente (2)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

if (retval_2 != RPC_SUCCESS) {

clnt_perror (clnt, "call failed");

}

clnt_destroy (clnt);

}

80

suma_server:

Plantilla de servidor#include "suma.h"

bool_t suma_1_svc (int a, int b, int *result,

struct svc_req *rqstp)

{

bool_t retval;

/*

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

81

/*

* insert server code here

*/

*result = a + b;

retval = TRUE;

return retval;

}

suma_server:

Plantilla de servidor (2)bool_t resta_1_svc (int a, int b, int *result,

struct svc_req *rqstp)

{

bool_t retval;

/*

* insert server code here

*/

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

82

*/

*result = a + b;

retval = TRUE;

return retval;

}

Autenticación

� Los mensajes de petición y respuesta disponen de campos para pasar información de autenticación

� El servidor es el encargado de controlar el acceso

� Hay distintos tipos de protocolos de autenticación:� Ninguno

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

83

� Al estilo UNIX, basado en uid y gid

� Autenticación Kerberos

� Mediante una clave compartida que se utiliza para firmar los mensajes RPC

Sintaxis de definición de un protocolo

definition-list:definition;definition; definition-list

definition:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

const-definitionenum-definitionstruct-definicionunion-definitiontypedef-definition

program-definition

84

Definición de constantes simbólicas

� En XDRconst MAX_SIZE = 8192;

� Traducción a C:#define MAX_SIZE 8192

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

85

Tipos enumerados

� En XDR:enum color{

ROJO = 0;VERDE = 1;AZUL = 2;

};

� Traducción a C:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

86

� Traducción a C:enum color{

ROJO = 0;VERDE = 1;AZUL = 2

};typedef enum color color;bool_t xdr_color();

Estructuras

� En XDR:struct punto{

int x;

int y;

};

� Traducción a C:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

87

� Traducción a C:struct punto{

int x;

int y;

};

typdef struct punto punto;

bool_t xdr_punto();

Uniones� En XDR:

union resultado switch (int error){

case 0:

int n;

default:

void;

};

� Traducción a C:

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

88

� Traducción a C:struct resultado {

int error;

union {

int n;

} resultado_u;

};

typdef struct resultado resultado;

bool_t xdr_resultado();

Definición de tipos

� En XDR:typedef punto puntos[2];

� Traducción a C:� Pasan sin modificación

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

89

� Pasan sin modificacióntypedef punto puntos[2];

Definición de programasprograma-def: "program" identifier "{"

version-defversion-def *

"}" "=" contant ";"

version - def :program SUMAR {

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

90

"version" identifier "{"procedude-defprocedure-def *

"}" "=" constant ";“

procedure-def:type-ident procedure-ident "("type-ident")" "="value

program SUMAR {

version SUMAVER {

int suma(int a, int b) = 1;

int resta(int a, int b) = 2;

} = 1;

} = 99;

Tipos de datos básicos

� Los tipos de datos básicos de C

� Ejemplos:

Enteros con signo:

Declaración: int a;

Equivalente en C: int a;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

91

Equivalente en C:

Enteros sin signo:

Declaración: unsigned a;

Equivalente en C: unsigned a;

Números en coma flotante:

Declaración: float a;

Equivalente en C: float c;

Principales tipos de datos en XDRNúmeros en coma flotante:

Declaración: float a;Equivalente en C: float c;

Cadenas de bytes de longitud fija:Declaración: opaque a[20];Equivalente en C: char a[20];

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

92

Cadenas de bytes de longitud variable:Declaración: opaque a<37>;

opaque b<>;Equivalente en C: struct {

int a_len;char *a_val;

} a;

Principales tipos de datos en XDR

Cadenas de caracteres:

Declaración: string a<37>;

string b<>;

Equivalente en C: char *a;

char *b;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

93

char *b;

Vectores de tamaño fijo:

Declaración: int a[12];

Equivalente en C: int a[12];

Principales tipos de datos en XDR

Vectores de tamaño variable:Declaración: int a<12>;

float b<>;

Equivalente en C: struct {int a_len ;

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

94

int a_len ;int *a_val;

} a;struct {

int b_len;float *b_val;

} b;

Principales tipos de datos en XDREstructuras:

Declaración: struct t {int c1;string c2<20>;

};t a;

Equivalente en C: struct t {

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

95

Equivalente en C:int c1;string *c2;

};typedef struct t t;t a;

Constantes:

Declaración: const MAX = 12;Equivalente en C: #define MAX 12

Mensajes de petición-respuesta

� Mensaje petición-respuesta

struct rpc_msg {

unsigned int xid;

union switch (msg_type mtype) {

Id. de transacción

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

96

union switch (msg_type mtype) {

case CALL:

call_body cbody;

case REPLY:

reply_body rbody;

} body;

};

enum msg_type {

CALL = 0,

REPLY = 1

};

Formato de los mensajes

MsgType = CALL

XID

RPCVersion = 2

Programa

Versión

0 31

Datos

MsgType = REPLY

XID

Status = ACCEPTED

0 31

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

97

Datos

Versión

Procedimiento

Credenciales (variable)

Verfificador (variable)

Evolución de las RPC

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

98

Paradigmas de

procedimientos/métodos remotos

Espacio de objetos, aplicaciones colaborativas

Servicios de red, object request broker, agentes móviles

alto

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

99

procedimientos remotos, métodos remotos

Cliente-servidor, peer-to-peer

Paso de mensajes

bajo

Llamadas a procedimientos remotos

� Objetivo: hacer que el software distribuido se programe igual que una aplicación no distribuida

� Mediante el modelo RPC la comunicación se realiza conceptualmente igual que la invocación de un procedimiento local

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

100

procedimiento local

proc1(arg1, arg2)

proc2(arg1)

proc3(arg1,arg2,arg3)

Proceso A proceso B

Llamadas a procedimientos remotos

� Pasos:� A llama al procedimiento remoto de B

� La llamada dispara una acción de un procedimiento de B

� Al finalizar el procedimiento, B devuelve el valor a A

� Simplifica la comunicación entre procesos y la sincronización de eventos.

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

101

la sincronización de eventos.

� Ejemplos: � Open Network Computing Remote Procedure Call, desarrollada a partir del API

RPC de Sun Microsystems a comienzo de los años 80

� Distributed Computing Environment (DCE) RPC de Open Group

� Simple objeto Access Protocol (SOAP)

Llamada a métodos remotos

� Primera aproximación al uso de un modelo orientado a objetos sobre aplicaciones distribuidas

� Objetos distribuidos dentro de una red� Los objetos proporcionan métodos, los cuales dan acceso a los servicios

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

102

los cuales dan acceso a los servicios

� Ejemplo:� Remote method invocation (RMI) de Java

Remote method invocation (RMI)

� Modelo equivalente a las llamadas a procedimientos remotos

� Proceso invoca un método local de otro proceso� Se envían tanto los argumentos del método como el valor devuelto por el mismo

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

103

método1método2

Proceso 1Proceso 2

Objeto remoto

RMI

Entornos donde se usa Java RMI

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

104

Entornos donde se usa Java RMI

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

105

Modelo de objetos en sistemas distribuidos

Máquina A Máquina B Máquina C

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

106

� El soporte para RMI en Java está basado en las interfaces y clases definidas en los paquetes java.rmi y java.rmi.server.

� RMI ofrece:

� Mecanismos para crear servidores y objetos cuyos métodos se puedan invocar remotamente.

Java RMI (Remote Method Invocation)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

invocar remotamente.

� Mecanismos que permiten a los clientes localizar los objetos remotos.

� Servicio de directorios:

� rmiregistry, servicio de directorios de Java

� Se ejecuta en la máquina servidor objeto

107

Comparación RMI y sockets

� Ventajas:� Los programas RMI son más sencillos de diseñar

� Servidor RMI concurrente

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

108

� Servidor RMI concurrente

� Inconvenientes:� Sockets tienen menos sobrecarga� RMI sólo para plataformas Java

Arquitectura de RMI

Cliente de

objetos

Servidorde objetos

Servicio de directorios

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

109

stub

Referencia remota

Transporte

skeleton

Referencia remota

Transporte

Ruta de datos lógica

Ruta de datos física

Arquitectura de RMI

� Nivel de resguardo o stub� Se encarga del aplanamiento de los parámetros.

� Stub: resguardo local. Cuando un cliente realiza una invocación remota, en realidad hace una invocación de un método del resguardo local.

� Nivel de gestión de referencias remotas

stub

Referencia remota

Transporte

skeleton

Referencia remota

Transporte

Cliente deobjetos

Servidor

de objetos

Servicio de directorios

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

110

� Nivel de gestión de referencias remotas

� Interpreta y gestiona las referencias a objetos remotos.

� Invoca operaciones de la capa de transporte.

� Nivel de transporte� Se encarga de las comunicaciones y

de establecer las conexiones necesarias.

� Basada en protocolo TCP.

Arquitectura de RMI

skeleton

marshalEnvío petición

unmarshalInvoca método

MétodoRemoto

tiempo

stub

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

111

Invoca métodoEjecución del códigoDevuelve valor

Recibe el valor retornomarshalEnvía la respuesta

unmarshallDevuelve el valor retorno

Diseño de aplicaciones RMI

(.java)

1

2

3

4(.class)

Implementación de la interfaz remota

javac

Definición de la interfaz remota

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

112

javac

4

10

95

6

7

8

(.java)

usaCliente

EjectuarCliente

CLIENTE SERVIDOR

(.class)

Esqueleto(.class)

stub(.class)

Servidor(.class)

Arrancar RMIRegistry

Crear los objetos

Registrar los objetos

rmic

Diseño de aplicaciones RMI

(.java)

1

2

3

4(.class)

javac

Definición de la interfaz remota

Implementación de la interfaz remota

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

113

javac

4

10

95

6

7

8

(.java)

usaCliente

EjectuarCliente

CLIENTE SERVIDOR

(.class)

Esqueleto(.class)

stub(.class)

Servidor(.class)

Arrancar RMIRegistry

Crear los objetos

Registrar los objetos

rmic

Diseño de aplicaciones RMI

� Interfaz remota:� Clase que sirve de plantilla para otras clases.

import java.rmi.*;

public interface SomeInterface extends Remote {

// Cabecera del primer método remoto

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

114

public String someMethod1( )

throws java.rmi.RemoteException;

// Cabecera del segundo método remoto

public int someMethod2( float parameter) throws java.rmi.RemoteException;

}

Diseño de aplicaciones RMI

� Implementación de la interfaz remota� Realizado por el servidor

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

public class SomeImpl extends UnicastRemoteObject

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

115

public class SomeImpl extends UnicastRemoteObjectimplements SomeInterface

{ public SomeImpl() throws RemoteException { super( ); }

public String someMethod1( ) throws RemoteException{ /* Código fuente */ }

public int someMethod2(float a) throws RemoteExcepti on{ /* Código fuente */ }

}

Diseño de aplicaciones RMI

UnicastRemoteObjectSomeInterface

Method1Method2...

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

116

SomeImpl

Method2Method1

...

Diseño de aplicaciones RMI

(.java)

1

2

3

4(.class)

Implementación de la interfaz remota

javac

Definición de la interfaz remota

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

117

javac

4

10

95

6

7

8

(.java)

usa

EjectuarCliente

CLIENTE SERVIDOR

(.class)

Arrancar RMIRegistry

Crear los objetos

Registrar los objetos

rmic

ClienteEsqueleto

(.class)stub

(.class)

Servidor(.class)

Diseño de aplicaciones RMI

� Diseño por parte del servidor:� Implementación de la interfaz remota

� Generar el resguardo y el esqueleto

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

118

# rmic SomeImpl# ls SomeImp*.class

…………SomeImpl_skel.classSomeImpl_skel.classSomeImpl_skel.classSomeImpl_skel.classSomeImpl_stub.classSomeImpl_stub.classSomeImpl_stub.classSomeImpl_stub.class

nombre de la clase de la implementación de la interface remota

Invocación remota

Servidor de objetos

SomeInterface.class

Cliente de objetos

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

119

SomeInterface.class

SomeImpl.class

SomeServer.class

Skel.class

SomeClient.class

SomeInterface.class

Stub.class

Diseño de aplicaciones RMI

(.java)

1

2

3

4(.class)

Implementación de la interfaz remota

javac

Definición de la interfaz remota

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

120

javac

4

10

95

6

7

8

(.java)

usa

EjectuarCliente

CLIENTE SERVIDOR

(.class)

Esqueleto(.class)

stub(.class)

Arrancar RMIRegistry

Crear los objetos

Registrar los objetos

rmic Servidor(.class)

Cliente

Plantilla de clase de servidor de objeto

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

import java.rmi.registry.Registry;

import java.rmi.registry.LocateRegistry;

public class SomeServer {

public static void main(String args[]) {

try{

SomeImpl exportedObj = new SomeImpl();

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

121

int portNum=1099;

startRegistry(portNum );

registryURL = "rmi://localhost:"+portNum+"/some";

Naming.rebind(registryURL, exportedObj);

System.out.println("Some Server ready.");

}

}catch (Exception ex) {

System.out.println(“Exception: “+ex);}

Plantilla de clase de servidor de objeto

private static void startRegistry(int RMIPortNum)throws RemoteException

{try {

Registry registry= LocateRegistry.getRegistry(RMIPo rtNum);registry.list( );

}catch ( RemoteException ex)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

122

catch ( RemoteException ex) {

System.out.println("RMI registry cannot be located at port" + RMIPortNum);Registry registry= LocateRegistry.createRegistry(RM IPortNum);System.out.println("RMI registry created at port " + RMIPortNum);

}}

Alternativa: activar el registro manualmente conrmiregistry <número de puerto>

Plantilla de clase de cliente de objeto

import java.rmi.*;

public class SomeClient{

public static void main(String args[]) {

try {int portNum=1099;String registryURL ="rmi://serverhost:" + portNum + "/some";

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

123

String registryURL ="rmi://serverhost:" + portNum + "/some"; SomeInterface h = (SomeInterface)Naming.lookup(regis tryURL);

String message = h.someMethod1();System.out.println(message);

} catch (Exception e) {

System.out.println("Exception in SomeClient: " + e) ;}

} }

Invocación remota

rmiregistryRMI

Máquina 1Máquina 2

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

124

Cliente

Servidor

rmiregistryRMI

RMI RMI

Ejemplo (RMI)

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

125

resultado = 7

Modelización de la interfaz remota

(Sumador)

public interface Sumador

extends java.rmi.Remote

{

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

126

{

public int sumar(int a, int b)

throws java.rmi.RemoteException;

}

Clase que implementa la interfaz

(SumadorImpl)

import java.rmi.*;

import java.rmi.server.UnicastRemoteObject;

public class SumadorImpl

extends UnicastRemoteObject implements Sumador {

public SumadorImpl(String name) throws RemoteExcept ion {

super();

try {

System.out.println("Rebind objeto " + name);

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

127

System.out.println("Rebind objeto " + name);

Naming.rebind(name, this);

} catch (Exception e) {

System.out.println("Exception: " + e.getMessage());

e.printStackTrace();

}

}

public int sumar (int a, int b) throws RemoteExcept ion

{ return a + b; }

}

Registro del servicio

� Cualquier programa que quiera instanciar un objeto de esta clase debe realizar el registro con el servicio de nombrado. Ejemplo:

Sumador misuma =

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

128

Sumador misuma = (Sumador) Naming.lookup("rmi://" + args[0] + "/” + "MiSumador");

� Antes de arrancar el cliente y el servidor, se debe arrancar el programa rmiregistryen el servidor para el servicio de nombres.

Código del servidor

(SumadorServer)

import java.rmi.*;import java.rmi.server.UnicastRemoteobjeto;public class SumadorImpl

extends UnicastRemoteobjeto implements Sumador {public SumadorImpl(String name)

throws RemoteException {super();try {

System.out.println("Rebind objeto " + name);Naming.rebind(name, this);

}

import java.rmi.*;

import java.rmi.server.*;

public class SumadorServer {

public static void main (String args[]) {

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

129

public static void main (String args[]) {

try{

SumadorImpl misuma = new SumadorImpl("rmi://localhost/MiSumador");

} catch(Exception excr) {

System.out.println("Excepcion: "+excr);

}

}

}

Código en el cliente

(SumadorCliente)

public interface Sumador

extends java.rmi.Remote

{

public int sumar(int a, int b)

throws java.rmi.RemoteException;

}

import java.rmi.*;

public class SumadorClient {

public static void main(String args[]) {

int res = 0;

try {

System.out.println ("Buscando Objeto ");

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

130

System.out.println ("Buscando Objeto ");

Sumador misuma = (Sumador)Naming.lookup("rmi://" + args[0] + "/" +"MiSumador");

res = misuma.sumar(5, 2);

System.out.println("5 + 2 = " + res);

} catch(Exception e) { System.err.println(" System exception");

}

System.exit(0);

}

}

Invocación remota

Servidor de objetos

SumadorInterface.class

Cliente de objetos

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

131

SumadorInterface.class

SumadorImpl.class

SumadorServer.class

Skel.class

SumadorCliente.class

SumadorInterface.class

Stub.class

¿Cómo se ejecuta?

1. Compilación� javac Sumador.java� javac SumadorImpl.java� javac SumadorClient.java� javac Sumador Server.java

2. Generación de los esqueletos� rmic SumadorImpl

F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.

132

� rmic SumadorImpl3. Copiar SumadorImpl_Stub.class e

interfaz remota a clientes

4. Ejecución del programa de registro de RMI� rmiregistry

5. Ejecución del servidor� java SumadorServer

6. Ejecución del cliente� java SumadorCliente <host-del-servidor>