2. SERVIDORS
Servidors iteratius
① Escolta una petició d’un client.
② Processa la petició del client.
③ Respon al client.
Servidor ④ 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.
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.
3. SERVIDORS
Servidors iteratius
Inici del servidor
Crear ServerSocket Crida bloquejant
Bucle infinit
socket = serverSocket.accept()
Llegir missatge del socket
Processar missatge
Enviar resposta pel socket
4. 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.
5. 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.
6. 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.
7. 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 ();
8. 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 ();
9. SERVIDORS
Servidors multicast: Servidor (1)
Tot el que escrivim per teclat des del servidor multicast serà
rebut pels clients.
10. SERVIDORS
Servidors multicast: Servidor (2)
Tot el que escrivim per teclat des del servidor multicast serà
rebut pels clients.
11. 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
12. 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
13. 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.
Servidor ③ El nou servidor gestiona la totalitat de la consulta.
④ Quan s’ha processat completament, aquest nou procés
finalitza.
⑤ Es torna al primer punt.
El servidor executa un nou procés per gestionar cada consulta.
Cada client té el seu “propi” servidor.
15. SERVIDORS
Servidors concurrents
Hi ha processos separats per atendre el port i
per transferir la resposta i/o el resultat de la
petició
CLIENT
SERVIDOR
4444 CLIENT
CLIENT
16. SERVIDORS
Servidors concurrents
Hi ha processos separats per atendre el port i
per transferir la resposta i/o el resultat de la
petició
CLIENT
SERVIDOR
4444
17. 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
CLIENT
SERVIDOR
4444
CLIENT
18. 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
CLIENT
SERVIDOR
4444
CLIENT
19. SERVIDORS
Servidors concurrents
El servidor crea un altre procés i es queda escoltant el
port 4444 a l’espera d’un nou client
CLIENT
SERVIDOR
4444
CLIENT
20. SERVIDORS
Servidors concurrents
Un tercer client contacta amb el servidor..
CLIENT
SERVIDOR
4444
CLIENT
CLIENT
21. SERVIDORS
Servidors concurrents
Es crea un tercer procés esclau (un nou fil)..
CLIENT
SERVIDOR
4444
CLIENT
CLIENT
22. 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 ( )
23. 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ó
Client 1 Master
Servidor
Client 2 1
Servidor
2
Servidor
Client 3 3
24. 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.
IP: IP: IP: IP:
132.1.5.5 62.7.8.9 62.7.8.9 183.7.6.5
Port: 1245 Port: 80 Port: 80 Port: 2115
Master Servidor 1Servidor 2
Socket Socket Socket
Transport
Client 1 Client 2
Xarxa
Socket Socket
Transport Enllaç Transport
Xarxa Físic Xarxa
Enllaç Enllaç
Físic Internet Físic
25. SERVIDORS
Servidor concurrent TCP
El servidor enviaria a cada client el temps transcorregut
en milisegons.
27. 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.
28. SERVIDORS
Microservidor web iteratiu
El servidor no implementa el protocol
HTTP correctament.
Funciona gràcies a que el navegador
s’adapta.
29. SERVIDORS
Servidor multiprotocol
Es tracta d’un servidor que
proporciona diversos serveis:
Per exemple, servidor d’eco
Inici
TCP i UDP en la mateixa
aplicació.
Servei
Es llencen varis fils Servei B Servei C
A
d’execució perquè un
bloqueig en un accept() o
en un receive() no bloquegi
el funcionament de la resta
de serveis.