El paradigma Cliente-Servidor
El trmino paradigma/modelo Cliente-Servidor se utiliza en contextos muy diferentes En cada uno de estos contextos, su significado cambia sutilmente Eso es porque el modelo cliente-servidor es a la vez Una abstraccin que simplifica el modelo de paso de mensajes Un patrn arquitectural para software distribuido Un patrn de protocolo conversacional Una arquitectura de sistemas distribuidos En todos los casos, hablar de modelo cliente-servidor implica: Que existe una comunicacin entre dos entidades Que esas entidades son asimtricas (realizan acciones diferentes) Una de las entidades de denomina cliente El cliente siempre origina el dilogo entre las entidades La otra de las entidades se denomina servidor El servidor siempre presta un servicio al cliente
El servidor
Es pasivo, espera las peticiones de los clientes Cuando recibe peticiones, debe procesarlas y ofrecer una respuesta Suele ser diseado con objetivos de eficiencia El cliente Es activo, tiene la iniciativa de iniciar el dilogo con el servidor enviando peticiones Por cada peticin enviada, se debe obtener una respuesta Suele ser diseado con el objetivo de interaccionar con el usuario final
peticin
Servidor
respuesta
Cliente
Ejemplos: La API estndar de Java llama ServerSocket a la clase que espera conexiones
Pero un ServerSocket no tiene por qu formar parte de un servidor (entendido como patrn arquitectural). Podemos definir una aplicacin basada en un modelo P2P en los que cada uno de los peers utiliza instancias de la clase ServerSocket
Clientes y Servidores
El cliente es la parte de la aplicacin que interacciona con el usuario El cliente no comparte (sus recursos no son vistos por otros clientes) El cliente no tiene restricciones especiales en trminos de Prestaciones: No suelen requerir capacidades especiales Fiabilidad: Si falla un cliente, el resto del sistema puede seguir funcionando Escalabilidad: Cada cliente ejecuta en su propio ordenador El cliente tiene restricciones especiales en trminos de Ergonoma: Debe adaptarse a la interaccin con el usuario Seguridad: No debe comprometer la seguridad de otras aplicaciones El servidor es la parte de la aplicacin que presta servicios al cliente El servidor comparte sus recursos con todos los clientes que lo usan El servidor tiene restricciones especiales en trminos de Prestaciones: Cuando queremos que numerosos clientes lo usen Fiabilidad: Si el servidor falla, los clientes no pueden continuar Escalabilidad: Queremos que el nmero de clientes pueda si se requiere Seguridad: No debe comprometer la seguridad de los clientes ni de los datos El servidor no tiene prestaciones especiales en trminos de Ergonoma: Lo controla un administrador experto
S S
Capacidad de acceder a ficheros identificados por un path HTTP S Comprimir y descomprimir un fichero (si se soporta el encoding gzip) C
Tema IV: El paradigma Cliente-Servidor
Capacidad para representar e interpretar otros tipos datos (pdf, applets, etc.) C La lgica de la aplicacin requiere, entre otros:
Gestin de los inventarios (actualizar stock, pedir ms, etc.) S Gestin de los pedidos (realizar acciones para envo del pedido) S Gestin contable (actualizar tesorera con ingresos por venta, etc.) S
}
Quin hace qu? Evidentemente, las tablas de datos deben estar en el servidor para que diferentes tiendas puedan compartirlas (servicio de BBDD) Evidentemente, en el cliente hay una GUI que permite al vendedor introducir su identificador, el nmero de productos vendidos y el coste por producto pactado Quin implementa la lgica de negocio? Qu pinta tiene el protocolo de nivel de aplicacin que necesitamos? Ambas respuestas estn muy relacionadas
Un servidor con estados, en sentido estricto, debe contener un modelo (en forma de mquina de estados) por cada uno de los clientes que se conectan
Pueden existir modelos hbridos en los que el servidor guarda cierto estado del cliente, pero sin llegar a disponer de un modelo completo
NO DISPONIBLE
Hay que anular Anula reserva Avin Pars-Roma Anula reserva Hotel Pars Anula reserva Avin Madrd-Pars
NO DISPONIBLE
Hay que anular Anula transaccin T
ANULADO
Mecanismos de Cach
El mecanismo de cach, en el contexto de las redes de ordenadores, consiste en duplicar (una parte de) los datos que posee un nodo, en otro distinto del original, con el objetivo de mejorar las prestaciones del acceso a los mismos Las cachs son un elemento esencial de las aplicaciones cliente-servidor
cach
servidor
Mecanismos de Cach
El mecanismo de cach, en el contexto de las redes de ordenadores, consiste en duplicar (una parte de) los datos que posee un nodo, en otro distinto del original, con el objetivo de mejorar las prestaciones del acceso a los mismos Las cachs son un elemento esencial de las aplicaciones cliente-servidor
cach
servidor
Mecanismos de Cach
El mecanismo de cach, en el contexto de las redes de ordenadores, consiste en duplicar (una parte de) los datos que posee un nodo, en otro distinto del original, con el objetivo de mejorar las prestaciones del acceso a los mismos Las cachs son un elemento esencial de las aplicaciones cliente-servidor
cach
servidor
GET recurso HTTP/1.1 ... if (now() < tCaduc) recurso es vlido else recurso es invlido
clientes
cach
Tema IV: El paradigma Cliente-Servidor
Servidor
clientes
cach
Tema IV: El paradigma Cliente-Servidor
Servidor
El servidor, sin embargo, adems de implementar el servicio de comunicaciones, debe ser diseado con objetivos de escalabilidad en mente
Un servidor tanto ms til cuantos ms clientes lo comparten Cmo podemos lograr que muchos clientes compartan un mismo servidor? Hay muchas soluciones, las ms habituales son Usar un modelo de servidor multihilo Usa operaciones de comunicaciones (sockets) bloqueantes El desarrollo del servidor es ms intuitivo
Llamada bloqueante
Procesar mensaje
Todo el tiempo de espera por operaciones de entrada/salida se desperdicia (no es aprovechado para el procesamiento de ninguna peticin de clientes)
Tiempo
Llamada bloqueante
Bucle infinito socket = serverSocket.accept() Cada sesin TCP del protocolo se atiende en un hilo de ejecucin diferente
lanzaThread(socket)
m = leerMensaje()
m = leerMensaje()
m = leerMensaje()
procesar(m)
procesar(m)
procesar(m)
enviarRespuesta()
enviarRespuesta()
enviarRespuesta()
Cuando un hilo se bloquea por una operacin de entrada/salida, el S.O. planifica otro diferente. Se pierde el tiempo asociado a los cambios de contexto y a creacin/destruccin de hilos.
Tiempo
Si evento es de lectura
Si evento es de escritura
Todas las operaciones de entrada/salida se gestionan a travs del bucle de gestin de eventos (sockets, ficheros, etc)
Tiempo
Nivel servidor: Que se reparte con el nivel intermedio la lgica de negocio y los servicios, dependiendo del modelo arquitectural que se elija
Middle tier
Es un proceso independiente que suele residir en su propio nodo de procesamiento Se ocupa de proporcionar a la aplicacin buenas propiedades en cuanto a Flexibilidad: Independizando el cliente y el servidor Escalabilidad: Realizando parte del trabajo del servidor y permitiendo el balanceo de carga entre diferentes servidores Robustez: Permitiendo el uso de servidores replicados
Cliente
Servidor
Cliente
Arquitecturas en N niveles
En los ltimos aos, la arquitectura en 3 nivele se ha visto generalizada a N En la arquitectura en N niveles, es posible insertar diferentes capas de procesamiento o provisin de servicios entre el cliente los datos de aplicacin La inclusin de mltiples niveles tiene un efecto negativo sobre la latencia Las aplicaciones distribuidas basadas en componentes suelen tomar forma de arquitecturas de N niveles
Cliente
Datos
Cliente
Nivel Intermedio 1
Nivel Intermedio 2
Nivel Intermedio 3
Cliente Datos
Cliente
CRLF
mtodo
sp
recurso
sp
versin
mtodo
sp
recurso
sp
versin
CRLF
CRLF
mtodo
sp
recurso
sp
versin
CRLF
versin
sp
cdigo de estado
sp
CRLF
CRLF
versin
sp
cdigo de estado
sp
CRLF
CRLF
CRLF
Cliente
Servidor
Paso 1 El usuario introduce la URL a la que quiere conectarse en el navegador web: Ejemplo: http://www.google.com/
S.O.
S.O.
Internet
Cliente
Servidor
Paso 2 El navegador resuelve el nombre de dominio de la URL indicada y obtiene la direccin IP del servidor en el que se localiza el recurso
S.O.
S.O.
Internet
Cliente
Servidor
S.O.
Paso 3 El navegador crea un socket TCP y lana una conexin entre el mismo y el servidor. Obsrvese que se conocen la direccin IP y el puerto (80) donde est escuchando el servidor
S.O.
Internet
Cliente
Servidor
Paso 4 El cliente crea el mensaje HTTP de peticin solicitando el recurso deseado y lo enva a travs de la conexin
S.O.
S.O.
Internet
Cliente
Servidor
Paso 5 El servidor analiza la peticin del cliente y recupera el recurso solicitado (normalmente un fichero que se encuentra en el disco o en memoria)
(servidor web)
S.O.
S.O.
Internet
Cliente
Servidor
Paso 6 El servidor construye el mensaje de respuesta, incluyendo el recurso solicitado en el cuerpo del mensaje (asumimos que no se produce ningn error)
S.O.
S.O.
Internet
Cliente
Servidor
Paso 7 El servidor enva el mensaje de respuesta al cliente, con el recurso solicitado dentro del cuerpo del mismo
S.O.
S.O.
Internet
Cliente
Servidor
Paso 8 El cliente recupera el recurso solicitado y cierra la conexin con el servidor. Acto seguido puede representar el recurso como considere oportuno
S.O.
S.O.
Internet
<html> <head><title>Pgina HTML de prueba</title></head> <body> <FORM METHOD=GET ACTION=/index.html"> Input de texto: <INPUT TYPE="text" SIZE="50" NAME="nombre"><BR> Input de password: <INPUT TYPE="password" SIZE="20" NAME="clave"><BR> Checkbox: <INPUT TYPE="checkbox" NAME="rapido"><BR> Radio: <INPUT TYPE="radio" NAME="pago" VALUE="contado"> <INPUT TYPE="radio" NAME="pago" VALUE="visa"><BR> Opcin: <SELECT NAME="producto"> <OPTION SELECTED>Ordenador</OPTION> <OPTION>Camara de fotos</OPTION> <OPTION>Disco duro</OPTION> <OPTION>DVD</OPTION> </SELECT><BR> Reset: <INPUT TYPE="reset" VALUE="Reset"><BR> Submit: <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </body> </html>
Peticin HTTP generada por el navegador al pulsar sobre Enviar GET /index.html?nombre=Luis+L%F3pez&clave=rata3&rapido=on&pago=visa&producto=DVD HTTP/1.1 Host: localhost Parmetros como pares nombre=valor codificados en formato URLEncoded
Qu sucede si el mtodo es POST? POST /index.html HTTP/1.1 Host: localhost Content-type: application/x-www-form-urlencoded Content-length: ... ... Tema IV: El paradigma Cliente-Servidor nombre=Luis+L%F3pez&clave=rata3&rapido=on&pago=visa&producto=DVD HTTP/1.1
Servidor-Contenedor Recepcin del mensaje de peticin Anlisis del mensaje + decodificacin Cliente String nombre=Luis Lpez String clave = rata String producto = DVD
public class Serv1 extends { Contenedor public void doGet() { public void doPost() { public class Serv2 extends { public void doGet() {
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ExampleServlet extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>Example servlet</title></head>"); out.println("<body>"); out.println("<h1>Hola mundo</h1>"); out.println("</body>"); out.println("</html>"); } }
public class LectorParametros extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String param1 = request.getParameter("nombre"); String param2 = request.getParameter("clave"); String param3 = request.getParameter("pago"); String param4 = request.getParameter("producto"); PrintWriter pw = response.getWriter(); response.setContentType("text/html"); pw.println("Usted es " + param1 + "<br>"); pw.println("Su clave es " + param2 + "<br>"); pw.println("El pago vale " + param3 + "<br>"); pw.println("El producto es " + param4); }
La cabecera Set-Cookie
La RFC 2109 define la cabecera Set-Cookie como mecanismo para que un servidor enve cookies a un cliente (en mensajes de respuesta HTTP) Formato: Nombre de cabecera: Set-Cookie: Nombre de la cookie y valor que se le asocia: nombre=valor_de_la_cookie Mxima edad de la cookie: Max-Age=segundos Path: path=/el/path Dominio: domain=.el.dominio.com
S.O.
S.O.
Internet
GET /main/shop/menu.php HTTP/1.1 Host: www.tienda.com
Si deposita una cookie, el servidor puede elegir los parmetros asociados a la misma: nombre, valor, fecha, etc. En este caso el servidor deposita la cookie utilizando la cabecera Set-Cookie
S.O.
S.O.
Una cookie que se acepta es almacenada de manera persistente (en el disco duro) hasta que se alcanza su fecha de expiracin El navegador suele tener un fichero en el que almacena todas las cookies activas
S.O.
shopC ...
Antes de enviar una peticin (cualquiera que sea) el navegador chequea si es necesario incluir una o varias cookies en la peticin HTTP
S.O.
Internet
La cabecera Cookie
La RFC 2109 define la cabecera Cookie como mecanismo para que un cliente enve cookies a un servidor (en mensajes de respuesta HTTP) Con cookies habilitadas, cada vez que el navegador enva un peticin HTTP debe comprobar si es necesario incluir una o varias cookies en la peticin
La inclusin de una cookie permite devolver al servidor el valor que este deposit en la misma
S.O.
shopC ...
S.O.
S.O.
shopC ...
El valor de la cookie es un identificador nico que permite recuperar campos de una base de datos El valor de la cookie es un identificador nico que coincide con el nombre de un fichero en el que se incluye la informacin de sesin
S.O.
Internet
Servlets y sesiones
Es posible utilizar variables de sesin dentro de la API de servlets HTTP puede soportar sesiones basadas en Uso de cookies: Cada sesin est asociada a un identificador nico que el cliente enva al servidor en cada peticin que se realiza dentro de una cabecera cookie URL-rewriting: Cada sesin est asociada a un identificador nico que el cliente enva al servidor como parte de la URI a la que se accede. En este caso, hay que garantizar que todas las URIs que aparecen en las pginas (bien dentro de anclas, bien dentro de atributos ACTION) contienen el citado identificador nico Las variables de sesin Permiten la persistencia de datos asociados a un mismo cliente a lo largo de una sesin (un conjunto de pares peticin/respuesta) El programador puede crear variables de sesin, asignarles un valor u obtener el valor previo El programador puede invalidar la sesin borrando todas las variables previamente establecidas Muchos entornos de pginas activas (PHP, ASP, etc.) permiten que una sesin se invalide automticamente tras cierto tiempo de inactividad
<HTML> <HEAD> <TITLE>Formulario de comercio electrnico</TITLE> </HEAD> <BODY> <BR><BR><HR><HR> <P> <H1 ALIGN="center">Bienvenido al bazar de los reyes magos</H1> </P><HR> <P ALIGN="center"> <FORM METHOD=GET ACTION="/ExampleServlet/carrito"> Escriba el regalo que desea recibir en el formulario<BR> <INPUT TYPE="text" SIZE="50" NAME="regalo"><BR> <INPUT TYPE="checkbox" NAME="borrarTodo"> Borrar los regalos elegidos anteriormente<BR> <INPUT TYPE="submit" VALUE="Aadir regalo a mi lista"> </FORM> <P><HR><BR><HR><BR> </BODY> </HTML>