Diseño de aplicaciones telemáticas Paradigmas de comunicación Paradigmas de comunicación ● ● ● El nivel de red como IP provee un servicio muy simple. – Best effort – Sin garantias Un nivel de transporte como TCP – Hace que las comunicaciones sean fiables – Todos los datos llegan – Y en orden Para cualquier otra funcionalidad – El SO no da más servicios por lo que desarrolla en el nivel de aplicación – La implementación será independiente de las capas inferiores Paradigmas de comunicación ● Cliente/servidor ● P2P ● Híbrido Cliente/Servidor Cliente/Servidor ● Esta formado por dos partes: – – Cliente ● Inicia la comunicación ● Normalmente la finaliza Servidor ● ● – Atiende las peticiones de servicio realizadas por los clientes – Modelo de Petición / Respuesta – Modelo de notificaciones (PUSH) Es el mas pesado y requiere de gran poder de cómputo en comparación al cliente Ejemplo: Firebug Cliente/Servidor ● Trabajan directamente sobre el API de sockets del sistema – Utilizan las implementaciones de red del sistema operativo. ● ● UDP – Cabecera muy pequeña – Sin componentes de señalización extra – La fiabilidad se implementa en la capa de aplicación TCP – Cabecera más grande – Componentes o mensajes extra de señalización que ralentizan el envío de datos – Costes adicionales de establecimiento y cierre de aplicación – Proporciona un servicio fiable Cliente/Servidor Características Comunicación Actividad Direcionamiento - IP - Puerto Concurrencia Carga computacional BW Cliente ~1 servidor no se comunica con otros clientes Intermitente Dinámico Baja Baja Baja Servidor N clientes Continua, máquina siempre activa Fijo, conocido a priori ¿Dinámico? Alta Alta Alta Cliente/Servidor ● Modelo con petición respuesta: Cliente Servidor SYN Suscribir Respuesta ... Petición Respuesta FIN Tiempo Cliente/Servidor ● Ejemplo de notificaciones (PUSH): Cliente Servidor Suscribir Suscrito OK Evento 1 ... Evento N Cancelar suscripción Suscripción cancelada Tiempo Sockets Sockets ● Los sockets es una abstracción análoga a un descriptor de fichero – ● Permite leer y escribir , igual que un fichero regular ● Cuando escribimos: enviamos datos al otro extremo ● Cuando leemos: lo hacemos de los datos que ha enviado el otro extremo El socket se vincula: – Al menos a un protocolo concreto – Cuando está a la ESCUCHA (i.e. en modo PASIVO): ● – Cuando está ESTABLECIDO (i.e. en modo ACTIVO): ● ● A un endpoint concreto: Endpoint = dirección IP + puerto A una conexión: Endpoint remoto + endpoint local Una vez reservado y establecido – Permite la comunicación extremo a extremo Sockets en php ● Así se reserva un socket en PHP: – Primero se especifica el protocolo, TCP o UDP: ● ● $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); Una vez reservado: – Establezco una conexión con un servidor: ● – socket_connect($socket, $IP, $PUERTO); O hago un servidor a espera de clientes: ● socket_bind($sock, $IP,$PUERTO); ● socket_listen($sock,$maxconn); ● $cliente = socket_accept($sock)) Sockets en php ● Al comportarse como ficheros: – Para leer y escribir del socket generado: ● Escribir: – ● Leer: – – socket_write($newc,$string,$leng); socket_read($newc,1024); A veces interesa que las lecturas o escrituras no bloqueen el programa: ● socket_set_nonblock($sock); Sockets en php ● Si deseamos atender a varios clientes a la vez: – Hay que implementar una forma de que se ejecuten a la vez. – Por ejemplo con procesos: ● Pongo cada cliente en un proceso nuevo – pcntl_fork() Devuelve 0 si es el proceso hijo ● El PID si es el proceso padre – Si soy el padre vuelvo al bucle de escucha ● – Si soy el hijo atiendo al cliente que toque Sockets en php ● Si deseamos atender a varios clientes a la vez: – Los procesos/hilos no solucionan el problema de acceso concurrente ● – Al final necesitaremos algo que intermedie Con sondeo: ● Un único proceso que monitoriza cuando una operación puede ejecutarse sin ser bloqueante, en un bucle: – socket_select(&$read,&$write,&$except,&$seconds) $read = array() ● Devuelve el número de sockets listos ● Comprobar si hay que aceptar clientes → if (in_array($sock, $read))… ● Aceptar clientes: socket_accept($sock) – Procesar clientes conectados: ● ● ● for ($read as $csock)… socket_read($csock, 1024) Sockets en el resto de lenguajes ● Mismo funcionamiento o muy parecido – Recordad los sockets en java Programa servidor sencillo $sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); socket_bind($sock, '127.0.0.1',5001); socket_listen($sock,10); $i=0; while(true) { if(($newc = socket_accept($sock)) !== false) { echo "Client $newc has connected\n"; cliente($newc); } } Programa servidor sencillo function cliente($newc){ if(pcntl_fork() == 0){ socket_write($newc,"hola",4); while(true){ $lee = socket_read($newc,1024); if($lee == false){ exit(); } if($lee != ""){ echo $lee."\n"; } } }else{ socket_close($newc); } }