Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
Compilar un programa
Ejemplo de RPC
Invocación de métodos remotos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 2
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
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)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 3
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
RPC
Las RPCs ofrecen una interfaz sencilla para construir aplicaciones
distribuidas sobre TCP/IP
Aplicaciones/servicios
Sockets
Protocolo de transporte
UDP y TCP
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 4
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
RPC
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
5
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 6
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Comunicación cliente-servidor
Protocolo petición-respuesta
Cliente Servidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 7
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Estructura de los mensajes
petición-respuesta
Id. De petición
Id. De operación
argumentos
Resultado
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 8
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 9
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Llamada local
main(){ Pila del proceso
...
r = sumar (4, 5);
...
}
sumar(int a, int b)
int r;
r = a + b;
return r;
Dir retorno
}
a
Registro de activación
b
r
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 10
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Llamada a procedimiento remoto
Cliente
main(){
...
r = sumar (4, 5);
...
} Dir retorno
a
Stub sumar(int a, int b) b
send(a, b);
c
receive(r);
return(r);
servidor
}
peticion main(){
receive (4, 5)...
r = sumar (4, 5);
send (r)
respuesta }
sumar(int a, int b) Stub
int r;
r = a + b;
return r;
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 11
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 12
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Cliente
Stub
Servidor
Suplentes (stubs) Stub
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 13
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Cliente
Stub
Servidor
Suplentes (stubs) Stub
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
Funciones en el servidor:
Realizan tareas similares
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 14
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
RPC: protocolo básico
Preparar la respuesta
Desempaquetar y enviar
la respuesta
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 15
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
RPC: protocolo básico
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 16
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
RPC: protocolo básico
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
17
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
RPC: protocolo básico
Proceso servidor (llamado)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 18
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Modelos de RPCs
RPCs síncronas
RPCs asíncronas
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 19
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
localizar al Se registra en un
servidor servicio de nombres
preparar
parámetros,
enviar petición Recibir la petición
Ejecutar el
procedimiento
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 20
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Enlace entre el cliente y el servidor (binding)
Semántica de las RPC en presencia de fallos
Autenticación
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 21
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Lenguaje de Definición de Interfaces
Un Lenguaje de Definición de Interfaz (IDL) permite especificar el
formato de los procedimientos remotos y otras opciones de comunicación
Cliente
La interfaz es compartida por
Cliente Stub
Servidor
Servidor
Stub
<opciones de comunicación:
versión interfaz, tcp/udp, …
>
<interfaz remota:
suma (in int a, in int b, out int c) ; generador
> STUB
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 22
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Lenguaje de Definición de Interfaces
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 23
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 24
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
XML
<person>
<name>Smith</name>
<place>London</place>
<year>1934</year>
</person >
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 26
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 27
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 28
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Buscar la dirección correspondiente a un nombre de servicio
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 29
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Esquema de registro y enlace
5
11
cliente 6 servidor
4 7 2
3
1 Obtiene dirección
2 Registra dirección
3 Busca servidor
binder
4 Devuelve dirección
5 Petición
6 Respuesta
7 Borra dirección (fin del servicio)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 30
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Modelos híbridos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 31
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
El cliente falla después de enviar una petición
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 32
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 33
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 34
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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?
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 35
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 36
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 37
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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:
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.
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 38
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Algunos utilizan TCP o UDP como protocolos básicos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 39
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
El código del servidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 40
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Desarrollo de la aplicación con RPC
DESARROLLO FICHERO
DE LA DE DEFINICIÓN
DE INTERFAZ
INTERFAZ
COMPILADOR IDL
COMPILADOR C COMPILADOR C
@Fuente: Jesús Carretero,
OBJETO FICHEROS FICHEROS OBJETO Félix García, Pedro de
SUPLENTE OBJETO DEL BIBLIOT. BIBLIOT. OBJETO DEL SUPLENTE
RPC RPC
Miguel y Fernando Pérez.
EN CLIENTE CLIENTE SERVIDOR EN SERVIDOR
Mc Graw Hill
MONTADOR MONTADOR
EJECUTABLE
DESARROLLO EJECUTABLE DEL DESARROLLO
DEL
DEL CLIENTE SERVIDOR
CLIENTE SERVIDOR
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 41
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 o TCP
Cliente y servidor deben estar de acuerdo en el protocolo de transporte a
utilizar
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 42
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
RPC de SUN y el modelo OSI
7. Aplicación aplicación
6. Presentación XDR
5. Sesión RPC
4. Transporte
TCP UDP
3. Red IP
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 44
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Formato de definición de interfaz
program-def:
"program" identifier "{"
version-def
version-def *
"}" "=" constant ";“ /* Number of program */
version-def:
"version" identifier "{"
procedure-def
procedure-def *
"}" "=" constant ";" /* Number of version */
procedure-def:
type-specifier identifier "(" type-specifier
("," type-specifier )* ")"
"=" constant ";“ /* Number of procedure */
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 45
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 microseconds).
Returns -1 if the operation timed out.
*/
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 */
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 46
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 47
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 48
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
El portmapper devuelve el puerto del servidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 49
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
El proceso portmapper
./servidor &
rpcinfo –p guernika.lab.inf.uc3m.es
programa vers proto puerto
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
…
100024 1 udp 32772 status
100024 1 tcp 59338 status
99 1 udp 46936
99 1 tcp 40427
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 50
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
En el servidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 51
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
La biblioteca de funciones
rpc.h es una biblioteca de funciones para desarrollar
aplicaciones distribuidas que usan RPC:
#include <rpc/rpc.h>
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 52
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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:
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 53
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 54
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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:
clnt Manejador de RPC del cliente
S Mensaje de error
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 55
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 */
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 56
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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:
procedimiento_v Nombre del procedimiento a invocar
arg1,arg2,…,argn Argumentos del procedimiento
clnt Manejador de un cliente de RPC
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 57
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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,
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ón
NOTA: v se sustituye por el número de versión que se implementa
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 58
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
prototipos de procedimientos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 59
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Sintaxis de rpcgen
Compilar usando rpcgen
rpcgen 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]
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
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 60
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Ejemplo: aplicación con RPC
Máquina A Máquina B
sumar(5,2)
cliente servidor
5+2
RED
@Fuente: Jesús Carretero, Félix García, Pedro de Miguel y Fernando Pérez. Mc Graw Hill
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 61
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Esquema de la aplicación
cliente.c
Archivos para
el cliente
suma_clnt.c
suma_xdr.c
rpcgen Archivos
suma.x
comunes
suma.h
suma_svc.c
Ficheros generados por el programador
Archivos para
Ficheros generados mediante rpcgen suma.x
el servidor
servidor.c
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 62
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Ejemplo: suma.x
struct argumentos {
int a;
int b;
};
program SUMAR {
version SUMAVER {
int SUMA(argumentos) = 1;
int RESTA(argumentos) = 2;
} = 1;
} = 99;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 63
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Ejemplo: suma.h
#ifndef _SUMA_H_RPCGEN
#define _SUMA_H_RPCGEN
#include <rpc/rpc.h>
struct argumentos {
int a;
int b;
};
#endif /* !_SUMA_H_RPCGEN */
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 64
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Ejemplo: servidor.c
#include "suma.h"
if(argc < 2) {
printf("usage: %s server_host\n", argv[0]);
exit(1);
}
host = argv[1];
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 66
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Ejemplo: cliente.c (II)
/* Paso 1: localizar al servidor */
clnt = clnt_create(host, SUMAR, SUMAVER, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host);
exit(1);
} Binding:
Se contacta con el portmapper de host
Se indica el host:API:versión:protocolo
suma_1_arg.a = 5;
El portmapper indica la localización
suma_1_arg.b = 2;
(puerto)
/* 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 );
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 67
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 68
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Cliente
Stub Servidor
suma_clnt.c (stub del cliente) Stub
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 69
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma_svc.c Cliente
Stub Servidor
(stub del servidor) Stub
transp = svcudp_create(RPC_ANYSOCK);
svc_register(transp, SUMAR, SUMAVER, sumar_1, IPPROTO_UDP;
svc_run ();
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 70
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma_svc.c (II) Cliente
Stub Servidor
(stub del servidor) Stub
char *result;
xdrproc_t _xdr_argument, _xdr_result;
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;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 71
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma_svc.c (III) Cliente
Stub Servidor
(stub del servidor) Stub
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;
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 72
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 73
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 74
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma.x:
Ejemplo usando nuevas opciones
program SUMAR {
version SUMAVER {
int suma(int a, int b) = 1;
int resta(int a, int b) = 2;
} = 1; Nota:
La opción de
} = 99; compilación –N
permite que un
procedimiento
acepte más de un
argumento de
entrada
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 75
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
suma_svc.c: stub del servidor
suma_xdr.c: funciones XDR
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 76
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma.h
#include <rpc/rpc.h>
#include <pthread.h>
struct suma_1_argument {
int a;
int b;
};
typedef struct suma_1_argument suma_1_argument;
struct resta_1_argument {
int a;
int b;
};
typedef struct resta_1_argument resta_1_argument;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 77
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma.h (2)
#define SUMAR 99
#define SUMAVER 1
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 78
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma_client.c:
Ejemplo de cliente
#include "suma.h"
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 79
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma_client.c:
Ejemplo de cliente (2)
retval_1 = suma_1(suma_1_a, suma_1_b, &result_1, clnt);
if (retval_1 != RPC_SUCCESS) {
clnt_perror (clnt, "call failed");
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 80
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
suma_server:
Plantilla de servidor
#include "suma.h"
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 81
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
*/
*result = a + b;
retval = TRUE;
return retval;
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 82
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Al estilo UNIX, basado en uid y gid
Autenticación Kerberos
Mediante una clave compartida que se utiliza para firmar los
mensajes RPC
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 83
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Sintaxis de definición de un protocolo
definition-list:
definition;
definition; definition-list
definition:
const-definition
enum-definition
struct-definicion
union-definition
typedef-definition
program-definition
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 84
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Definición de constantes simbólicas
En XDR
const 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 85
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Tipos enumerados
En XDR:
enum color{
ROJO = 0;
VERDE = 1;
AZUL = 2;
};
Traducción a C:
enum color{
ROJO = 0;
VERDE = 1;
AZUL = 2
};
typedef enum color color;
bool_t xdr_color();
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 86
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Estructuras
En XDR:
struct punto{
int x;
int y;
};
Traducción a C:
struct punto{
int x;
int y;
};
typdef struct punto punto;
bool_t xdr_punto();
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 87
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Uniones
En XDR:
union resultado switch (int error){
case 0:
int n;
default:
void;
};
Traducción a C:
struct resultado {
int error;
union {
int n;
} resultado_u;
};
typdef struct resultado resultado;
bool_t xdr_resultado();
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 88
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Definición de tipos
En XDR:
typedef punto puntos[2];
Traducción a C:
Pasan sin modificación
typedef punto puntos[2];
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 89
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Definición de programas
programa-def:
"program" identifier "{"
version-def
version-def *
"}" "=" contant ";"
procedure-def:
type-ident procedure-ident "("type-ident")" "="
value
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 90
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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;
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;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 91
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Principales tipos de datos en XDR
Números en coma flotante:
Declaración: float a;
Equivalente en C: float c;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 92
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Españ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 93
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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;
int *a_val;
} a;
struct {
int b_len;
float *b_val;
} b;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 94
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Principales tipos de datos en XDR
Estructuras:
Declaración: struct t {
int c1;
string c2<20>;
};
t a;
Equivalente en C: struct t {
int c1;
string *c2;
};
typedef struct t t;
t a;
Constantes:
Declaración: const MAX = 12;
Equivalente en C: #define MAX 12
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 95
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Mensajes de petición-respuesta
Mensaje petición-respuesta
Id. de transacción
struct rpc_msg {
unsigned int xid;
union switch (msg_type mtype) {
case CALL:
call_body cbody;
enum msg_type {
case REPLY:
CALL = 0,
reply_body rbody;
REPLY = 1
} body; };
};
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 96
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Formato de los mensajes
0 31 0 31
XID XID
Programa Datos
Versión
Procedimiento
Credenciales (variable)
Verfificador (variable)
Datos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 97
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Evolución de las RPC
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
98
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Paradigmas de
procedimientos/métodos remotos
alto
bajo
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 99
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Proceso A proceso B
proc1(arg1, arg2)
proc2(arg1)
proc3(arg1,arg2,arg3)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 100
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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.
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)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 101
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Ejemplo:
Remote method invocation (RMI) de Java
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 102
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
Proceso 2
Proceso 1
RMI método1
método2
Objeto remoto
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 103
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Entornos donde se usa Java RMI
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 104
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Entornos donde se usa Java RMI
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 105
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Modelo de objetos en sistemas distribuidos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 106
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Java RMI (Remote Method Invocation)
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.
Servicio de directorios:
rmiregistry, servicio de directorios de Java
Se ejecuta en la máquina servidor objeto
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 107
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Comparación RMI y sockets
Ventajas:
Los programas RMI son
más sencillos de diseñar
Servidor RMI concurrente
Inconvenientes:
Sockets tienen menos sobrecarga
RMI sólo para plataformas Java
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 108
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Arquitectura de RMI
Servicio de directorios
Cliente de Servidor
objetos de objetos
stub skeleton
Transporte Transporte
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 109
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Servicio de directorios
Cliente de Servidor
objetos
de objetos
Nivel de transporte
Se encarga de las comunicaciones y
de establecer las conexiones necesarias.
Basada en protocolo TCP.
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 110
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Arquitectura de RMI
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 111
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Diseño de aplicaciones RMI
Definición de la
1 interfaz remota
2 Implementación de la
interfaz remota
(.java)
3
javac
(.class)
4
rmic Servidor
(.class)
8 usa stub
Esqueleto
Cliente (.class)
(.class)
(.java)
5
9 Arrancar RMIRegistry
javac
6
(.class) Crear los objetos
10
Ejectuar 7
Cliente Registrar los objetos
CLIENTE SERVIDOR
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 112
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Diseño de aplicaciones RMI
Definición de la
1 interfaz remota
2 Implementación de la
interfaz remota
(.java)
3
javac
(.class)
4
rmic Servidor
(.class)
8 usa stub
Esqueleto
Cliente (.class)
(.class)
(.java)
5
9 Arrancar RMIRegistry
javac
6
(.class) Crear los objetos
10
Ejectuar 7
Cliente Registrar los objetos
CLIENTE SERVIDOR
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 113
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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
public String someMethod1( )
throws java.rmi.RemoteException;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 114
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Diseño de aplicaciones RMI
Implementación de la interfaz remota
Realizado por el servidor
import java.rmi.*;
import java.rmi.server.*;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 115
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Diseño de aplicaciones RMI
SomeInterface
UnicastRemoteObject Method1
Method2
...
SomeImpl
Method1
Method2
...
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 116
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Diseño de aplicaciones RMI
Definición de la
1 interfaz remota
2 Implementación de la
interfaz remota
(.java)
3
javac
(.class)
4
rmic Servidor
(.class)
8 usa stub
Esqueleto
Cliente (.class)
(.class)
(.java)
5
9 Arrancar RMIRegistry
javac
6
(.class) Crear los objetos
10
Ejectuar 7
Cliente Registrar los objetos
CLIENTE SERVIDOR
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 117
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Diseño de aplicaciones RMI
Diseño por parte del servidor:
Implementación de la interfaz remota
Generar el resguardo y el esqueleto
# rmic SomeImpl
# ls SomeImp*.class
…
SomeImpl_skel.class
SomeImpl_stub.class
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 118
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Invocación remota
SomeInterface.class
SomeInterface.class
SomeServer.class
SomeClient.class SomeImpl.class
Stub.class Skel.class
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 119
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Diseño de aplicaciones RMI
Definición de la
1 interfaz remota
2 Implementación de la
interfaz remota
(.java)
3
javac
(.class)
4
rmic Servidor
(.class)
8 usa stub
Esqueleto
Cliente (.class)
(.class)
(.java)
5
9 Arrancar RMIRegistry
javac
6
(.class) Crear los objetos
10
Ejectuar 7
Cliente Registrar los objetos
CLIENTE SERVIDOR
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 120
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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();
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);
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 121
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Plantilla de clase de servidor de objeto
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 122
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Plantilla de clase de cliente de objeto
import java.rmi.*;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 123
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Invocación remota
Máquina 2 Máquina 1
RMI rmiregistry
Servidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 124
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Ejemplo (RMI)
resultado = 7
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 125
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Modelización de la interfaz remota
(Sumador)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 126
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
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 RemoteException {
super();
try {
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 RemoteException
{ return a + b; }
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 127
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Registro del servicio
Sumador misuma =
(Sumador) Naming.lookup("rmi://" + args[0] + "/” + "MiSumador");
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 128
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
import java.rmi.*;
Código del servidor import java.rmi.server.UnicastRemoteobjeto;
public class SumadorImpl
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 129
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
public interface Sumador
Código en el cliente extends java.rmi.Remote
{
(SumadorCliente) public int sumar(int a, int b)
throws java.rmi.RemoteException;
}
import java.rmi.*;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 130
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Invocación remota
SumadorInterface.class
SumadorInterface.class
SumadorServer.class
SumadorCliente.class SumadorImpl.class
Stub.class Skel.class
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 131
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
¿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
3. 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>
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García 132
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.