À cette étape, vous travaillerez à la fois sur le programme
prog_server.cpp et sur le code JavaScript de
client.html.
Pour réduire le délai constaté précédemment, il faut offrir au serveur
un moyen de délivrer de l'information aux clients même quand ces
derniers n'effectuent pas de requête.
Effectivement, en l'état, ces informations ne sont véhiculées que par
les réponses aux requêtes des clients, et la fonction
APPLI.ping()
sert justement à créer une opportunité d'obtenir une telle réponse.
Le protocole
websocket sert notamment à répondre à la problématique
de l'envoi spontané d'information du serveur vers les clients sans même
que ces derniers ne produisent de sollicitations répétées à cet effet.
La fonction
http_dialog() doit maintenant être complétée pour
accepter un passage au protocole
websocket sur la réception
des requêtes
“GET /channel”.
Une fois ce changement de protocole accepté, la suite du dialogue via
la
websocket sera confiée à la fonction
handle_websocket()
avant sa terminaison.
Vous devez compléter la fonction
handle_websocket() afin de
réaliser une boucle qui réagit à chaque nouvelle réception d'un message
par ce moyen.
L'intérêt essentiel ici est qu'après chaque réception par une telle
websocket, des informations pourront être délivrées à
toutes les
websockets connues du serveur, et non seulement à celle qui
vient d'être utilisée pour la réception.
L'acquisition d'un accès exclusif à l'application est bien entendu toujours
nécessaire durant le traitement de la réception d'un message ;
toutefois, l'attente de la réception d'un tel message ne doit pas
monopoliser l'application.
Naturellement, le fichier
client.html doit être modifié pour bénéficier
de ce nouveau moyen de communication.
Des commentaires au niveau des fonctions
APPLI.setup_channel et
APPLI.to_server, dans le code JavaScript fourni, vous guideront
et il faudra vous inspirer de
TopDir/wsAppli.html dans le sujet
L09_HttpServer.
Il ne s'agit ici que de communication
textuelle ; ne vous souciez
donc pas de ce qui concerne la communication binaire.
Une page obtenue en HTTP utilisera
“ws:” comme protocole
websocket
alors qu'une page obtenue en HTTPS utilisera
“wss:”.
De nouveaux tests complets de l'application, en HTTP et HTTPS, doivent vous
faire constater une très nette amélioration de sa réactivité.
Remarquez qu'en théorie la fonction
APPLI.ping() ne devrait plus
être nécessaire désormais, puisque les informations en provenance
du serveur peuvent dorénavant être délivrées spontanément.
Toutefois, nous allons la conserver car dans le cas où les fenêtres des
navigateurs resteraient calmes pendant un long moment, aucun message ne
circulerait et les connexions pourraient être fermées (par le navigateur,
le proxy...).
Puisque aucune garantie ne peut être donnée quant à la persistance des
connexions, l'application s'appuie uniquement sur la date du dernier
message reçu pour considérer que l'utilisateur de l'application est
toujours en ligne.
La fonction
APPLI.ping() permet alors, même à un rythme très
faible
Ici, nous avons choisi arbitrairement une période de deux secondes
pour ces messages et l'application considère qu'après cinq secondes
sans message l'utilisateur n'est plus en ligne.
Maintenant que l'interactivité est assurée par les websockets,
il serait tout à fait envisageable d'allonger ces durées.
, de signaler au serveur la présence de l'utilisateur.
Vous pouvez notamment améliorer la robustesse en envisageant une reconnexion
dans le cas où la
websocket serait fermée involontairement.