Tema4 Aplicaciones Cliente-servidor

55
Tema 4 El paradigma cliente-servidor 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

description

Sistemas Distribuidos

Transcript of Tema4 Aplicaciones Cliente-servidor

Page 1: Tema4 Aplicaciones Cliente-servidor

Tema 4

El paradigma cliente-servidorF. 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

Page 2: Tema4 Aplicaciones Cliente-servidor

Contenido

� Conceptos básicos

� Tipo de servidores

� Servidores secuenciales y concurrentes

� Servidores orientados a conexión y sin conexión

� Servidores con/sin información de estado

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.

� Sesión:

� interacción entre cliente y servidor

� Ejemplo:

� Cliente-servidor con paso de mensajes

� Guía de desarrollo de aplicaciones cliente-servidor

2

Page 3: Tema4 Aplicaciones Cliente-servidor

Una definición simple …

“El software del servidor acepta peticiones 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.

“El software del servidor acepta peticiones deservicio desde el software del cliente, calcula elresultado y lo devuelve al cliente”

3

Page 4: Tema4 Aplicaciones Cliente-servidor

Participantes

� Elementos de computación:

� Cliente

� Servidor

� Red de interconexió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.

Red de interconexión

4

Máquina cliente

Máquina del servidor

2) Respuesta

1) Petición

Page 5: Tema4 Aplicaciones Cliente-servidor

Ejemplo: HTTP

Cliente Servidor

1) Petición:http://www.arcos.inf.uc3m.es

2) Respuesta

1) Petición: 2) Respuesta:

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.

5

1) Petición:GET /index.html HTTP/1.1 Host: www.example.com User-Agent: nombre-cliente [Línea en blanco]

2) Respuesta:HTTP/1.1 200 OK Date: Fri, 31 Dec 2003 23:59:59 GMT Content-Type: text/html Content-Length: 1221

<html> <body>

<h1>Página www.uc3m.es</h1> (Contenido) . . . </body> </html>

Page 6: Tema4 Aplicaciones Cliente-servidor

Acceso distribuido vs.

computación distribuida

La computación de tipo cliente-servidor

es acceso distribuido

no computación distribuida !!!

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.

no computación distribuida !!!

6

Page 7: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor

� Asigna roles diferentes a los procesos que comunican: cliente y servidor

� Servidor:

� Ofrece un servicio

� Elemento pasivo: espera la llegada de peticiones

� Cliente:

� Solicita el servicio

� Elemento activo: invoca peticiones

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.

� Elemento activo: invoca peticiones

...

Petición de servicio

Proceso servidorProceso cliente

Servicio

Servidor Cliente 1

Cliente 2

7

Page 8: Tema4 Aplicaciones Cliente-servidor

Conceptos previos

� El modelo cliente-servidor es una abstracción eficiente para facilitar los servicios de red

� La asignación de roles asimétricos simplifica la sincronización

� Implementación mediante:

� Sockets

Llamada a procedimientos remotos (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.

� Llamada a procedimientos remotos (RPC)

� Invocación de métodos remotos (RMI, CORBA, …).

� Paradigma principalmente adecuado para servicios centralizados

� Ejemplos: servicios de Internet (HTTP, FTP, DNS, … )

8

Page 9: Tema4 Aplicaciones Cliente-servidor

Tipos de servidores de aplicaciones

� En función del número de peticiones que es capaz de atender:

� Secuencial: una petición

� Concurrente: múltiples peticiones atendidas al mismo tiempo

� En función de si existe una conexión preestablecida con el cliente

� Servidores orientados a conexión

� Servidores NO orientados a conexió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.

� Servidores NO orientados a conexión

� En función de si almacena o no el estado de la comunicación

� Servidores con estado

� Servidores sin estado

9

Page 10: Tema4 Aplicaciones Cliente-servidor

Modelo de servidor secuencial

� El servidor sirve las peticiones de forma secuencial

� Mientras está atendiendo a un cliente no puede aceptar peticiones de más clientes

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.

Cliente

petición

respuesta

servidor

10

Page 11: Tema4 Aplicaciones Cliente-servidor

Flujo de ejecución de un servidor

secuencial

Inicio de servicio

Aceptar petició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.

11

Aceptar petición de sesión

Procesar la petición del cliente

Servidor secuencial

Page 12: Tema4 Aplicaciones Cliente-servidor

Flujo de ejecución de un servidor

secuencial

Obtener el resultado

Inicio de servicio

Aceptar petició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.

12

Servidor secuencial

resultado+

Devolver la respuesta al cliente

Aceptar petición de sesión

Procesar la petición del cliente

Page 13: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor secuencial

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de servicio

while(){aceptar_peticion()tratar_peticion()

}

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

Cliente n

servicio

Page 14: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor secuencial

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de servicio

while(){aceptar_peticion()tratar_peticion()

}

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.

14

Cliente n

servicio

Page 15: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor secuencial

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de servicio

while(){aceptar_peticion()tratar_peticion()

}

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.

15

Cliente n

servicio

Page 16: Tema4 Aplicaciones Cliente-servidor

Modelo de servidor concurrente

� El servidor crea un hijo que atiende la petición y envía la respuesta al cliente

� Se pueden atender múltiples peticiones de forma concurrente

peticiónservidor

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.

Cliente

respuesta

Crea un procesohijo

Proceso hijo

16

Page 17: Tema4 Aplicaciones Cliente-servidor

Flujo de ejecución de un servidor

concurrente

Servidor concurrente

Inicio de servicio

Aceptar petición de 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.

17

Procesar la petición del cliente 1

Crear threadTrabajador 1

Procesar la petición del cliente 2

Crear threadTrabajador 2

Procesar la petición del cliente n

Crear threadTrabajador n

fin

fin

fin

Page 18: Tema4 Aplicaciones Cliente-servidor

Flujo de ejecución de un servidor

concurrente

Servidor concurrente

Inicio de servicio

Aceptar petición de sesión

Obtener el resultado

+Devolver la

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

18

Procesar la petición del cliente 1

Crear threadTrabajador 1

Procesar la petición del cliente 2

Crear threadTrabajador 2

Procesar la petición del cliente n

Crear threadTrabajador n

fin

fin

fin

Page 19: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

while(){

aceptar_peticion()pthread_create()

}

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesió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.

19

Cliente n

Sesión de servicio

Page 20: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de

while(){

aceptar_peticion()pthread_create()

}

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 n

Sesión de servicio

Page 21: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de

while(){

aceptar_peticion()pthread_create()

}

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.

21

Hilo 1

Cliente n

Sesión de servicio

Page 22: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de

while(){

aceptar_peticion()pthread_create()

}

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

Hilo 1

Cliente n

Sesión de servicio

Page 23: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de

while(){

aceptar_peticion()pthread_create()

}

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

Hilo 1

Cliente n

Sesión de servicio

Hilo 2

Page 24: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de

while(){

aceptar_peticion()pthread_create()

}

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

Hilo 1

Cliente n

Sesión de servicio

Hilo 2

Page 25: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de

while(){

aceptar_peticion()pthread_create()

}

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

Hilo 1

Cliente n

Sesión de servicio

Hilo 2

Hilo n

Page 26: Tema4 Aplicaciones Cliente-servidor

Cliente-Servidor concurrente

Servidor Cliente 1

Cliente 2

Solicitud de conexión

Sesión de

while(){

aceptar_peticion()pthread_create()

}

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

Hilo 1

Cliente n

Sesión de servicio

Hilo 2

Hilo n

Page 27: Tema4 Aplicaciones Cliente-servidor

� Distintas arquitecturas de SW para construir servidores paralelos:

� Un proceso distribuidor que acepta peticiones y las distribuye entre un pool de procesos ligeros

� Cada proceso ligero realiza las mismas tareas: aceptar peticiones, procesarlas y devolver su resultado

� Segmentación: cada trabajo se divide en una serie de fases, cada una de ellas se procesa por un proceso ligero especializado

Diseño de servidores concurrentes

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

Trabajador

Núcleo Sol

icitu

des

Núcleo Sol

icitu

des

E/SNúcleo

Distribuidor

Sol

icitu

des

E/S E/S

27

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

Page 28: Tema4 Aplicaciones Cliente-servidor

Servidores orientados a conexión

� En un servicio orientado a conexión, el cliente y el servidor establecen una conexión (que puede ser lógica), posteriormente insertan o extraen datos desde esa conexión, y finalmente la liberan

� El flujo de tráfico se representa mediante un identificador de conexió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.

conexión

� Los datos no incluyen información sobre la conexión establecida

� Direcciones origen y destino

� Ejemplo: TCP

28

Page 29: Tema4 Aplicaciones Cliente-servidor

Servidores sin conexión

� En un protocolo no orientado a conexión los datos son intercambiados usando paquetes independientes, auto-contenidos, cada uno de los cuales necesita explícitamente la información de conexión

� No existe acuerdo previo

� Ejemplo: IP, UDP

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.

� Ejemplo: IP, UDP

29

Page 30: Tema4 Aplicaciones Cliente-servidor

Concepto de sesión

� Sesión: Interacción entre cliente y servidor

� Cada cliente entabla una sesión separada e independiente con el servidor

� El cliente conduce un diálogo con el servidor hasta obtener el servicio deseado

El servidor ejecuta indefinidamente:

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.

30

� El servidor ejecuta indefinidamente:

� Bucle continuo para aceptar peticiones de las sesiones de los clientes

� Para cada cliente el servidor conduce una sesión de servicio

Page 31: Tema4 Aplicaciones Cliente-servidor

Protocolo de servicio

� Se necesita un protocolo para especificar las reglas que deben observar el cliente y el servidor durante una sesión de servicio

� En cada sesión el diálogo sigue un patrón especificado por el protocolo

� Los protocolos de Internet están publicados en las RFCs

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.

31

� Los protocolos de Internet están publicados en las RFCs

� Definición del protocolo de servicio:

� Localización del servicio

� Secuencia de comunicación entre procesos

� Representación en interpretación de los datos

Page 32: Tema4 Aplicaciones Cliente-servidor

Tipos de servidores

� Servidores sin estado:

� Cada mensaje de petición y respuesta es independiente de las demás

� Ejemplo: HTTP

� Servidores con estado:

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

� Servidores con estado:

� Debe mantener información de estado (por ej. anteriores conexiones de clientes) para proporcionar su servicio

� Cada petición/respuesta puede depender de otras anteriores

� Ejemplo: Telnet

Page 33: Tema4 Aplicaciones Cliente-servidor

Información de estado

� Información de estado global

� El servidor mantiene información para todos los clientes durante la vida del servidor

� Ejemplo: servidor de tiempo

� Información de estado de 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.

33

� Información de estado de sesión

� El servidor mantiene información específica para cada sesión iniciada por los clientes

� Ejemplo: FTP (File Transfer Protocol)

Page 34: Tema4 Aplicaciones Cliente-servidor

Arquitectura de SW

� La arquitectura de SW de una aplicación cliente-servidor consta de tres niveles:

� Nivel de presentación: cliente y servidor precisan una interfaz de usuario

� Nivel de lógica de aplicación: en el lado del servidor necesita procesarse la petición del cliente, calcular el resultado y devolverlo al cliente. En el lado del cliente se necesita enviar al servicio la petición del usuario y procesar el resultado (por ejemplo, mostrarlo por pantalla)

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.

procesar el resultado (por ejemplo, mostrarlo por pantalla)

� Nivel de servicio: los servicios requeridos para dar soporte a la aplicación son (1) en el servidor aquellos que permiten procesar la petición y 2) el mecanismo de IPC

34

Page 35: Tema4 Aplicaciones Cliente-servidor

Interfaz de usuario

Lógica de presentación

Arquitectura de las aplicaciones

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.

Lógica de aplicación

Lógica de servicio

35

Page 36: Tema4 Aplicaciones Cliente-servidor

¿Donde se ejecutan las tareas?

� En el software del cliente (lado del cliente)

� En el software del servidor (lado del 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.

36

Page 37: Tema4 Aplicaciones Cliente-servidor

Responsabilidades en el cliente

� Cliente:

� Genera un mensaje de petición de servicio

� Se conecta al servidor (dirección IP y puerto) [Solo orientado a conexión]

� Envía el mensaje de petición de servicio

� Espera por la respuesta

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.

� Espera por la respuesta

� Procesa la respuesta: imprimir, almacenar, etc.

� Desconexión [Solo orientado a conexión]

37

Page 38: Tema4 Aplicaciones Cliente-servidor

Responsabilidades en el servidor

� Servidor:

1. Espera conexiones entrantes de los clientes

� Una conexión entrante es una petición de servicio

2. Por cada conexión:

� Genera un thread de servicio [Solo servidores concurrentes]

� El proceso principal:

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 proceso principal:

� Vuelve a esperar por nuevas conexiones entrantes

� El thread de servicio:

1. Procesa la petición

2. Calcula el resultado

3. Devuelve la respuesta al cliente

4. Finaliza su ejecución

38

Page 39: Tema4 Aplicaciones Cliente-servidor

Aplicaciones cliente-servidor usando colas

de mensajes

� Modelo proceso ligero distribuidor:

� Cada petición al proceso ligero distribuidor supone la creación de un proceso ligero trabajador

� El proceso ligero trabajador responde al proceso cliente

� Procesa la petición

� Envía la respuesta al servidor

Una vez finalizada la sesión con el cliente, el proceso ligero se destruye

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

� Una vez finalizada la sesión con el cliente, el proceso ligero se destruye

� Modelo concurrente:

� Los procesos distribuidor y trabajador ejecutan de forma concurrente

� Modelo secuencial:

� Sólo un proceso distribuidor

Page 40: Tema4 Aplicaciones Cliente-servidor

Ejemplo: sumar dos números

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

5+2

Resultado = 7 NÚCLEO

RED

40

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

Page 41: Tema4 Aplicaciones Cliente-servidor

Ejemplo: Definición de tipos#define MAXSIZE 256

struct peticion {

int a; /* operando 1 */

int b; /* operando 2 */

char q_name[MAXSIZE]; /* nombre de la cola clientedonde debe enviar la respuesta 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.

el servidor */

};

41

Page 42: Tema4 Aplicaciones Cliente-servidor

Ejemplo: Proceso servidor secuencial#include “mensaje.h”

#include <mqueue.h>

void main (void) {

mqd_t q_servidor; /* cola de mensajes del servidor */

mqd_t q_cliente; /* cola de mensajes del cliente */

struct peticion pet;

int res;

struct mq_attr attr;

attr.mq_maxmsg = 20;

attr.mq_msgsize = sizeof ( struct peticion );

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.

attr.mq_msgsize = sizeof ( struct peticion );

q_servidor = mq_open(“SERVIDOR_SUMA”, O_CREAT|O_READ, 0700, &attr);

while(1 ) {

mq_receive(q_servidor, &pet, sizeof(pet), 0);

res = pet.a + pet.b;

/* se responde al cliente abriendo previamente su cola */

q_cliente = mq_open(pet.q_name, O_WRONLY);

mq_send(q_cliente, &res, sizeof(int), 0);

mq_close(q_cliente);

}

}

42

Page 43: Tema4 Aplicaciones Cliente-servidor

Ejemplo: Proceso cliente#include “mensaje.h”

#include <mqueue.h>

void main (void) {

mqd_t q_servidor; /* cola de mensajes del proceso servidor */

mqd_t q_cliente; /* cola de mensajes para el proceso cliente */

struct peticion pet;

int res;

struct mq_attr attr;

attr.mq_maxmsg = 1;

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.

attr.mq_maxmsg = 1;

attr.mq_msgsize = sizeof(int);

q_cliente = mq_open(“CLIENTE_UNO”, O_CREAT|O_RDONLY, 0700, &attr);

q_servidor = mq_open(“SERVIDOR_SUMA”, O_WRONLY);

/* se rellena la petición */

pet.a = 5; pet.b = 2; strcpy(pet.q_name, “CLIENTE_UNO”);

mq_send(q_servidor, &pet, sizeof(struct petiticion), 0);

mq_receive(q_cliente, &res, sizeof(int), 0);

mq_close(q_servidor);

mq_close(q_cliente);

mq_unlink(“CLIENTE_UNO”);

}43

Page 44: Tema4 Aplicaciones Cliente-servidor

Ejemplo II: Servidor concurrente

NÚCLEO

cliente sumar(5,2)

5+2

Resultado = 7

servidor

Máquina A

Máquina B

RED

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.

5+2

NÚCLEO

RED

44

NÚCLEO

cliente

Máquina A

Page 45: Tema4 Aplicaciones Cliente-servidor

Estructura de un servidor multihread

Proceso cliente

Cola del cliente

Proceso cliente

Cola del cliente

Cola del

Proceso servidor

petición

petición

respuesta

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.

Cola del servidor

respuestarespuesta

Creación delthread

Creación delthread

Thread quesirve la petición

Thread quesirve la petición

45

Page 46: Tema4 Aplicaciones Cliente-servidor

Cliente-servidor con colas de mensajesProceso cliente

Proceso servidor

Cola del cliente

respuesta

petición

mensaje

Proceso ligero principal

while (1){ mq_receive

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.

Copia delmensaje

principal mq_receive se crea el proceso ligero esperar la copia del mensaje}

Copia el mensajedespierta al principalcontinua la ejecuciónresponde al cliente

46

Page 47: Tema4 Aplicaciones Cliente-servidor

Servidor multithread con colas de mensajes

(I)#include “mensaje.h”

#include < mqueue.h>

#include <pthread.h>

#include <stdio.h>

/* mutex y variables condicionales para proteger la copia del mensaje*/

pthread_mutex_t mutex_mensaje;

int mensaje_no_copiado = TRUE; /* TRUE con valor a 1 */

pthread_cond_t cond_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.

pthread_cond_t cond_mensaje;

int main (void)

{

mqd_t q_servidor; /* cola del servidor */

struct peticion mess; /* mensaje a recibir */

struct mq_attr q_attr; /* atributos de la cola */

pthread_attr_t t_attr; /* atributos de los threads */

attr.mq_maxmsg = 20;

attr.mq_msgsize = sizeof (struct peticion));

47

Page 48: Tema4 Aplicaciones Cliente-servidor

Servidor multithread con colas de mensajes

(II)

q_servidor = mq_open(“SERVIDOR”, O_CREAT|O_RDONLY, 0700, &attr);

if (q_servidor == -1) {

perror(”No se puede crear la cola de servidor”);

return 1;

}

pthread_mutex_init (&mutex_mensaje, NULL);

pthread_cond_init (&cond_mensaje, NULL);

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.

pthread_cond_init (&cond_mensaje, NULL);

pthread_attr_init (&attr);

/* atributos de los threads */

pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);

…..

48

Page 49: Tema4 Aplicaciones Cliente-servidor

Servidor multithread con colas de mensajes

(III)

while (TRUE) {

mq_receive(q_servidor, &mess, sizeof(struct mensaje), 0);

pthread_create (&thid, &attr, tratar_mensaje , &mess);

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

Page 50: Tema4 Aplicaciones Cliente-servidor

Servidor multithread con colas de mensajes

(IV)

while (TRUE) {

mq_receive(q_servidor, &mess, sizeof(struct mensaje), 0);

pthread_create (&thid, &attr, tratar_mensaje , &mess);

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.

}

}

Condición de carrera

50

Page 51: Tema4 Aplicaciones Cliente-servidor

Servidor multithread con colas de mensajes

(V)

while (TRUE) {

mq_receive(q_servidor, &mess, sizeof(struct mensaje), 0);

pthread_create (&thid, &attr, tratar_mensaje , &mess);

/* se espera a que el thread copie el mensaje */

pthread_mutex_lock (&mutex_mensaje);

Sección crítica

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.

pthread_mutex_lock (&mutex_mensaje);

while (mensaje_no_copiado)

pthread_cond_wait (&cond_mensaje, &mutex_mensaje);

mensaje_no_copiado = TRUE;

pthread_mutex_unlock (&mutex_mensaje);

} /* FIN while */

} /* Fin main */

51

Page 52: Tema4 Aplicaciones Cliente-servidor

Servidor multithread con colas de mensajes

(VI)void tratar_mensaje (struct mensaje *mes){

struct peticion mensaje; /* mensaje local */

struct mqd_t q_cliente; /* cola del cliente */

int resultado; /* resultado de la operación */

/* el thread copia el mensaje a un mensaje local */

pthread_mutex_lock (&mutex_mensaje);

memcpy((char *) &mensaje, (char *)&mes, sizeof(struct peticion ));

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.

peticion ));

/* ya se puede despertar al servidor*/

mensaje_no_copiado = FALSE; /* FALSE con valor 0 */

pthread_cond_signal (&cond_mensaje);

pthread_mutex_unlock (&mutex_mensaje);

52

Page 53: Tema4 Aplicaciones Cliente-servidor

Servidor multithread con colas de mensajes

(VII)

/* ejecutar la petición del cliente y preparar resp uesta */

resultado = mensaje_local.a + mensaje_local.b;

/* Se devuelve el resultado al cliente */

/* Para ello se envía el resultado a su cola */

q_cliente = mq_open(mensaje_local.nombre, O_WRONLY);

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 (q_cliente == -1)

perror(”No se puede abrir la cola del cliente */

else {

mq_send(q_cliente, (char *) &resultado, sizeof(int), 0);

mq_close (q_cliente);

}

pthread_exit (0);

}

53

Page 54: Tema4 Aplicaciones Cliente-servidor

Proceso cliente#include “mensaje.h”

#include <mqueue.h>

void main(void) {

mqd_t q_servidor; /* cola de mensajes del proceso ser vidor */

mqd_t q_cliente; /* cola de mensajes para el proceso cliente */

struct peticion pet;

int res;

struct mq_attr attr;

attr.mq_maxmsg = 1;

attr.mq_msgsize = sizeof(int);

q_cliente = mq_open(“CLIENTE_UNO”, O_CREAT|O_RDONLY, 0700, & attr );

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.

q_cliente = mq_open(“CLIENTE_UNO”, O_CREAT|O_RDONLY, 0700, & attr );

q_servidor = mq_open(“SERVIDOR_SUMA”, O_WRONLY);

/* se rellena la petición */

pet.a = 5; pet.b = 2; strcpy(pet.q_name, “CLIENTE_UN O”);

mq_send(q_servidor, &pet, sizeof(struct petiticion), 0);

mq_receive (q_cliente, &res, sizeof(int), 0);

mq_close (q_servidor);

mq_close (q_cliente);

mq_unlink (“CLIENTE_UNO”);

}

54

Page 55: Tema4 Aplicaciones Cliente-servidor

Guía de desarrollo de aplicaciones

cliente-servidor con paso de mensajes

1. Identificar el cliente y el servidor� Cliente: elemento activo, varios� Servidor: elemento pasivo

2. Protocolo del servicio� Identificar los tipos mensajes y la secuencia de intercambios de

mensajes (peticiones y respuestas)

3. Elegir el tipo de 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.

55

3. Elegir el tipo de servidor� UDP sin conexión� TCP :

� Una conexión por sesión

� Una conexión por petición

4. Identificar el formato de los mensajes (representación de los datos)

� Independencia (lenguaje, arquitectura, implementación, …)