Sockets al limite, como explotar los sockets al límite en un proyecto de Symfony2
1213 Sockets [4] Servidors i fils
-
Upload
oriol-torres -
Category
Documents
-
view
60 -
download
1
Transcript of 1213 Sockets [4] Servidors i fils
SÒCOLS
4 Servidors i fils
SERVIDORS Servidors iteratius
① Escolta una petició d’un client.
② Processa la petició del client.
③ Respon al client.
④ Torna a bloquejar-se a l’espera d’una nova petició.
⑤ Mentre es processa la petició del 1r client, poden arribar
noves peticions que hauran de quedar a l’espera.
Servidor
En el sistema solament existirà 1 petició com a
màxim que s’estigui resolent.
Aquesta solució solament s’utilitza quan la petició del
client es pot gestionar en un temps molt petit.
SERVIDORS Servidors iteratius
Crida bloquejant
Bucle infinit
Inici del servidor
Crear ServerSocket
socket = serverSocket.accept()
Processar missatge
Llegir missatge del socket
Enviar resposta pel socket
SERVIDORS Servidors iteratius: Desavantatges
El problema és que tot client ha d’esperar el seu
torn per ser atès.
Si un d’ells demana un arxiu molt gran, la resta
haurà d’esperar.
La major part d’espera és degut a les operacions
I/O, hi ha capacitat de CPU desaprofitada.
SERVIDORS Servidors multicast (Broadcasting)
El multicast és un mètode d’adreçament IP. Una
adreça multicast està associada amb un grup de
receptors interessats.
D’acord amb el RFC 3171, les adreces IP des de
la 224.0.0.0 a les 239.255.255.255 estan
adreçades per ser adreces de multicast.
SERVIDORS Servidors multicast (Broadcasting)
Aquest rang s’anomena, formalment, “classe D”.
L’emissor envia un únic datagrama (des de
l’adreça unicast de l’emissor) a l’adreça multicast
i l’encaminador s’encarregarà de fer còpies i
enviar-les a tots els receptors que hagin informat
del seu interès per les dades d’aquest emissor.
SERVIDORS Servidors multicast: El servidor
// Crearem el MulticastSocket sense especificar el port
MulticastSocket s = new MulticastSocket ();
// Crearem el grup multicast:
InetAddress group = InetAddress.getByName (“231.0.0.1”);
// Crearem un datagrama buit en principi:
byte [] buit = new byte [0];
// Crear el Datagrama (missatge, grandària miss, grup Multicast i port):
DatagramPacket dgp = new DatagramPacket (buit, 0, group, 100000);
// Enviem el paquet
s.send (dgp);
//Tanquem el socket
s.close ();
SERVIDORS Servidors multicast: El client
// Crearem un socket multicast en el port 10000
MulticastSocket s = new MulticastSocket (10000);
// Configurarem el grup (IP) al que ens connectarem:
InetAddress group = InetAddress.getByName (“231.0.0.1”);
// Ens unim al grup:
s.joinGroup (group);
// Rebem el paquet del socket:
DatagramPacket dgp = new DatagramPacket (buffer, buffer.length);
s.receive (dgp);
// Sortim del grup multicast
s.leaveGroup (group);
//Tanquem el socket
s.close ();
SERVIDORS Servidors multicast: Servidor (1)
Tot el que escrivim per teclat des del servidor multicast serà
rebut pels clients.
SERVIDORS Servidors multicast: Servidor (2)
Tot el que escrivim per teclat des del servidor multicast serà
rebut pels clients.
SERVIDORS Servidors multicast: Client (1)
El client estarà subscrit a l’adreça multicast en el port específic per
rebre tot el que emeti el servidor. sempre estarà escoltant al servidor
multicast
SERVIDORS Servidors multicast: Client (2)
El client estarà subscrit a l’adreça multicast en el port específic per
rebre tot el que emeti el servidor. sempre estarà escoltant al servidor
multicast
SERVIDORS Servidors concurrents
① Escolta una petició d’un client.
② Quan li arriba una petició del client, comença un nou procés
per gestionar aquesta consulta.
③ El nou servidor gestiona la totalitat de la consulta.
④ Quan s’ha processat completament, aquest nou procés
finalitza.
⑤ Es torna al primer punt.
Servidor
El servidor executa un nou procés per gestionar cada consulta.
Cada client té el seu “propi” servidor.
SERVIDORS Servidors concurrents
SERVIDORS Servidors concurrents
SERVIDOR
CLIENT
CLIENT
CLIENT
4444
Hi ha processos separats per atendre el port i
per transferir la resposta i/o el resultat de la
petició
SERVIDORS Servidors concurrents
SERVIDOR
CLIENT
4444
Hi ha processos separats per atendre el port i
per transferir la resposta i/o el resultat de la
petició
SERVIDORS Servidors concurrents
Després de que el client contacti amb el servidor, aquest
crea un altre procés per atendre al client i quedar-se
escoltant el port 4444 a l’espera d’un nou client
SERVIDOR CLIENT
CLIENT 4444
SERVIDORS Servidors concurrents
Després de que el client contacti amb el servidor, aquest
crea un altre procés per atendre al client i quedar-se
escoltant el port 4444 a l’espera d’un nou client
SERVIDOR CLIENT
CLIENT 4444
SERVIDORS Servidors concurrents
El servidor crea un altre procés i es queda escoltant el
port 4444 a l’espera d’un nou client
SERVIDOR CLIENT
CLIENT 4444
SERVIDORS Servidors concurrents
Un tercer client contacta amb el servidor..
SERVIDOR CLIENT
CLIENT
CLIENT
4444
SERVIDORS Servidors concurrents
Es crea un tercer procés esclau (un nou fil)..
SERVIDOR CLIENT
CLIENT
CLIENT
4444
SERVIDORS Servidors concurrents: La classe Thread
En Java, la concurrència l’aconseguim
utilitzant fils d’execució
Es defineix una classe
derivada de Thread
Codi a executar en
cada fil dins del
mètode run( )
Es llença el fil
amb start ( )
SERVIDORS Servidors concurrents: Diversos fils d’execució
En el fil principal s’executa permanentment el mètode
accept( )
S’espera l’establiment de noves connexions
Per cada client que es connecta, es llença un nou fil
d’execució per gestionar aquesta connexió
Master
Servidor 1
Servidor 2
Servidor 3
Client 1
Client 2
Client 3
Transport
Xarxa
Enllaç
Físic
Servidor 2
Socket
SERVIDORS Servidors concurrents
Ara tenim varis sòcols (sockets) associats al mateix port. Per identificar al sòcol destí s’ha de tenir en compte
l’adreça (adreça IP + port) del sòcol origen.
Servidor 1
Socket
Master Socket
Transport
Xarxa
Enllaç
Físic
Client 1
Socket Transport
Xarxa
Enllaç
Físic
Client 2
Socket
Internet
IP:
132.1.5.5
Port: 1245
IP:
62.7.8.9
Port: 80
IP:
62.7.8.9
Port: 80
IP:
183.7.6.5
Port: 2115
SERVIDORS Servidor concurrent TCP
El servidor enviaria a cada client el temps transcorregut
en milisegons.
SERVIDORS Microservidor web iteratiu
SERVIDORS Microservidor web iteratiu
• La clase StringTokenizer permet dividir un string en
substrings o tokens en base a un altre string.
Per exemple, si treballem amb un string consistent en
nom i cognoms separats per espais en blanc, la classe
StringTokenizer facilitarà trencar aquest string en 3
substrings basat en que el caràcter delimitador és un
espai en blanc.
• El mètode nextToken() retorna una subcadena (String) que
és el següent token de la cadena. Podríem imaginar que,
per cada cop que es crida a aquest mètode hi ha un
apuntador que es posiciona en el següent token.
SERVIDORS Microservidor web iteratiu
El servidor no implementa el protocol
HTTP correctament.
Funciona gràcies a que el navegador
s’adapta.
SERVIDORS Servidor multiprotocol
Inici
Servei A
Servei B Servei C
Es tracta d’un servidor que
proporciona diversos serveis:
Per exemple, servidor d’eco
TCP i UDP en la mateixa
aplicació.
Es llencen varis fils
d’execució perquè un
bloqueig en un accept() o
en un receive() no bloquegi
el funcionament de la resta
de serveis.
SERVIDORS Servidor multiprotocol