Uploaded by TheBeruGamer YT

tema.1

advertisement
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);
}
}
Download