CHAPITRE 11. Temps réel Remy Sharp



Documents pareils
Introduction à HTML5, CSS3 et au responsive web design

Programmation Web. Madalina Croitoru IUT Montpellier

RÉALISATION D UN SITE DE RENCONTRE

Bien architecturer une application REST

L3 informatique TP n o 2 : Les applications réseau

CREG : versailles.fr/spip.php?article803

CRÉER, ROUTER ET GÉRER UNE NEWSLETTER, UN ING

Agence Web innovatrice

Firefox pour Android. Guide de l utilisateur. press-fr@mozilla.com

Géolocalisation. Remy Sharp

De EnvOLE 1.5 à EnvOLE 2. Document pour l administrateur

Performance Front-End

Ajax, RIA et HTML Prise en charge d Ajax

(structure des entêtes)

FAQ Trouvez des solutions aux problématiques techniques.

Veille technologique

Chapitre 1 Qu est-ce qu une expression régulière?

ANIMER UNE COMMUNAUTÉ CONSTRUCTION21

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

Architectures en couches pour applications web Rappel : Architecture en couches

FileMaker Server 11. Publication Web personnalisée avec XML et XSLT

Wildix Web API. Guide Rapide

Programmation Web. Introduction

Devenez un véritable développeur web en 3 mois!

Application Web et J2EE

CONTACT EXPRESS 2011 ASPIRATEUR D S

Comment utiliser FileMaker Pro avec Microsoft Office

E-TRANSACTIONS. Guide du programmeur API Plug-in. Version 1.1

Démonstration de la mise en cache via HTML 5 sur iphone

GER helpdesk permet de traiter et d optimiser la gestion de vos interventions au sein de chaque bureaux.

demander pourquoi mon site n'apparaît pas sur google ou pourquoi mon site n'est pas référencé par les moteurs de recherche?

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Dans cette Unité, nous allons examiner

1 Actuate Corporation de données. + d analyses. + d utilisateurs.

18 TCP Les protocoles de domaines d applications

Serveurs de noms Protocoles HTTP et FTP

Xi Ingénierie. La performance technologique au service de votre e-commerce. Comment exploiter les cookies sur vos applications web en toute légalité?

Activité sur Meteor. Annexe 1 : notion de client-serveur et notion de base de données

Des solutions sur mesure à partir de modules fonctionnels & CRM associés à un studio de customisation.

S7 Le top 10 des raisons d utiliser PHP pour moderniser votre existant IBM i

Ouvrez un compte Hotmail pour communiquer

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

Gestion de stock pour un magasin

Comment accéder à d Internet Explorer

HTTP Commander. Table des matières. 1-Présentation de HTTP Commander

CONCEPT de MICRO-DOMOTIQUE. Système STANTOR-DOMODULOR

Rapports d activités et financiers par Internet. Manuel Utilisateur

Echosgraphik. Ce document sert uniquement à vous donner une vision sur ma manière de travailler et d appréhender un projet

La protection des données par affilinet

Sage CRM. 7.2 Guide de Portail Client

TD n o 8 - Domain Name System (DNS)

e-marque Traitement des fichiers

Pierre-Louis Théron Nikolay Rodionov Axel Delmas

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

Design adaptatif. Guide de l utilisateur VIENNA LONDON MUNICH BERLIN PARIS HONG KONG MOSCOW ISTANBUL BEIJING ZURICH

Créer et partager des fichiers

Le stockage local de données en HTML5

Projet en nouvelles technologies de l information et de la communication

CONFÉRENCE WEB 2.0. UPDATE ASBL Michaël Barchy 23 janvier 2013

Dispositif e-learning déployé sur les postes de travail

Qu est ce qu une bibliothèque?

Rapport de stage. Création d un site web. Stage du 20/01/2013 au 21/02/2013

Guide d utilisation OGGI. Gestionnaire d incidents à l usage des clients. Date de rédaction : 04/02/2013. Version : 1.0.

Le serveur HTTPd WASD. Jean-François Piéronne

Spip 2. Premiers pas pour créer son site web. Anne-Laure Quatravaux Dominique Quatravaux. Avec la contribution de Sandrine Burriel

Intégration de systèmes

Paramétrage des navigateurs

Google Merchant Center

Guide utilisateur i-milo >> Décisionnel

Principaux utilisateurs du Réseau

WysiUpStudio. CMS professionnel. pour la création et la maintenance évolutive de sites et applications Internet V. 6.x

les techniques d'extraction, les formulaires et intégration dans un site WEB

La rencontre des mondes virtuels et du web au service de puissantes applications accessibles à tous

Point sur les solutions de développement d apps pour les périphériques mobiles

FileMaker Server 14. Aide FileMaker Server

Description des pratiques à adopter pour la mise à jour du layout en utilisant le gestionnaire de conception de Sharepoint 2013

Configuration du driver SIP dans ALERT. V2

Informatique & Systèmes de Communication. Stages de 12 à 16 semaines aux Etats-Unis

HTTP 1.1. HyperText Transfer Protocol TCP IP ...

HTML. Notions générales

Modules InnovationCRM

Développer des Applications Internet Riches (RIA) avec les API d ArcGIS Server. Sébastien Boutard Thomas David

L identité numérique. Risques, protection

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

En date du 11 décembre 2008

FICHE PRODUIT COREYE CACHE Architecture technique En bref Plateforme Clients Web Coreye Cache applicative Références Principe de fonctionnement

Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et

GWT à l'épreuve du feu. by Sami Jaber (DNG Consulting)

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

Remote Cookies Stealing SIWAR JENHANI (RT4) SOUHIR FARES (RT4)

Service intervenant. Version 6.3

Accès à distance sécurisé au Parlement (ADSP)

Mandataires, caches et filtres

I. QU'EST-CE QU'UN ORDINATEUR? Un ordinateur est relié à plein de périphériques

Exploration des technologies web pour créer une interaction entre Mahara et les plateformes professionnelles et sociales

Les grandes facettes du développement Web Nicolas Thouvenin - Stéphane Gully

SITE I NTERNET. Conception d un site Web

Transcription:

CHAPITRE 11 Temps réel Remy Sharp LE WEB EN TEMPS RÉEL fait partie de ces aspects d Internet qu on apprécie d utiliser mais qui peuvent être assez effrayants quand il faut les mettre en place. Ce chapitre présente les différentes technologies et la simplicité du code client. Pour ajouter du temps réel à une application web, deux options s offrent à vous : WebSockets et Server-Sent Events. WebSockets permet de créer un flux connecté vers votre serveur (une connexion TCP, donc) afin de mettre en place une communication bidirectionnelle et en temps réel entre le serveur et le client. Un exemple d application classique est un client de chat, mais ses possibilités sont infinies. Les sockets web ont un long chemin à parcourir pour remplacer le code qui repose sur Comet. Ce dernier utilise en effet un grand nombre de techniques qui sont assez souvent du bricolage pour mettre en place un flux de données en temps réel à partir d un serveur. Comme nous le verrons plus loin, WebSockets simplifie ce traitement du côté client.

248 INTRODUCTION À HTML5 Server-Sent Events, également appelé EventSource, pousse en temps réel des messages du serveur vers le navigateur client. Cette API convient donc parfaitement aux applications qui attendent des informations d un serveur sans nécessiter d interaction de la part de l utilisateur pour les mises à jour en direct d informations, par exemple. WebSockets et flux de données NOTE Si votre navigateur ne reconnaît pas nativement les sockets web, vous pouvez vous replier sur Flash. Hiroshi Ichikawa a en effet écrit une rustine en Flash pour les sockets web, disponible à l URL http://github.com/gimite/ web-socket-js. WebSockets, l API des sockets web, ne fait pas partie de la spécification HTML5, mais elle est très importante pour certaines des applications web en temps réel qui sont apparues ces dernières années. Les sockets web fournissent une connexion bidirectionnelle entre le serveur et le client. Cette connexion est en temps réel et reste ouverte tant qu elle n est pas fermée explicitement. Lorsque le serveur veut envoyer un message au client, ce message est donc immédiatement poussé vers le navigateur. C est exactement le but que poursuivait Comet : Comet permet de créer une connexion en temps réel vers un serveur, mais en passant par plusieurs astuces différentes. Si aucune de ces astuces ne fonctionne, il se replie vers une interrogation Ajax qui accède constamment au serveur et ne s adapte donc pas très bien à la montée en charge. Si vous disposez d une socket ouverte, en revanche, le serveur peut pousser les données vers toutes les sockets connectées et n a pas besoin de répondre constamment aux requêtes Ajax. On passe donc du polling au pushing du réactif au proactif. Ce que Comet tentait d obtenir par des astuces, les sockets web l intègrent nativement dans le navigateur. Diminution de la latence des applications temps réel Un énorme avantage des sockets web est la diminution de la latence. Une socket étant toujours ouverte et en écoute, les données n ont plus qu à parvenir à votre navigateur dès qu elles ont été poussées par le serveur : la latence est donc extrêmement faible par rapport à celle d une requête Ajax reposant sur XMLHttpRequest. En théorie, avec Google Wave (ce projet a, depuis, été abandonné par Google), les personnes qui partageaient un document voyaient immédiatement toutes les touches tapées par les autres à mesure qu elles saisissaient du texte. Avec de l Ajax de base, en revanche, vous devriez créer un objet XHR chaque fois qu une touche est pressée et il faudrait donc envoyer tous les en-têtes d une requête XHR classique : agent utilisateur, types de contenus acceptés, etc. Cela fait beaucoup pour une seule frappe de touche

Chapitre 11 : TEMPS réel 249 Avec les sockets, la connexion étant toujours ouverte, il suffit d envoyer le caractère saisi, qui sera ensuite diffusé à tous les clients connectés au serveur. Seule cette information sera envoyée. Le volume des données transmises passe donc de 200-300 octets (avec Ajax) à 10-20 octets (avec une socket) : l ensemble sera donc plus réactif et les données seront transmises plus rapidement aux clients connectés. NOTE La mise en place d un serveur pour le protocole ws:// sort du cadre de ce livre, mais il existe déjà plusieurs bibliothèques permettant de l ajouter. En utilisant des serveurs comme Node.js, on peut obtenir un serveur de sockets web en moins de 20 minutes. Cette mise en œuvre est décrite dans l article http://remysharp.com/ slicehost-nodejs-websockets/. CONSEIL L URL utilisée pour la socket web ne doit pas nécessairement avoir la même origine que votre document. Cela signifie que vous pouvez vous connecter à des serveurs tiers, ce qui étend d autant plus les possibilités qui s offrent à vous. L API WebSocket L API WebSocket est très simple à utiliser. Comme nous l avons vu avec l API de messagerie et les Web Workers, les navigateurs actuels (à l exception de Firefox et des Web Workers) ne savent envoyer que des chaînes avec postmessage et onmessage. Il en va de même pour les sockets. Cela signifie que vous ne pouvez pas (actuellement) envoyer des données binaires. Mais, dans le monde du Web, nous avons l habitude de travailler avec JSON et il n est pas très difficile d encoder les messages en JSON à mesure qu ils arrivent d une socket, puisque c est ce que nous faisons déjà pour les requêtes JSON Ajax. L API se borne à créer la connexion, à envoyer et recevoir des données sur la socket, et à fermer celle-ci. Elle propose également un gestionnaire d erreur et un indicateur d état signalant que la connexion est en cours d établissement, qu elle est ouverte, en cours de fermeture ou fermée. Une socket fermée est définitivement inutilisable et ne peut plus être rouverte : vous devrez créer une nouvelle socket. La création d une socket web est très simple et ressemble beaucoup à celle d un Web Worker. Le protocole de l URL doit être ws://, mais le reste peut être structuré comme n importe quelle autre URL : var socket = new WebSocket( ws://monserveur.com/tweets:8080/ ); Dans cet exemple, j attends les messages provenant de l URL tweets. Chacun d eux est un nouveau tweet de Twitter, que mon serveur écoute puisqu il a été configuré pour cela (voir Figure 10.4). Les messages du serveur, récupérés à partir de l API Twitter, sont délivrés en JSON. Quand ils arrivent, il faut donc extraire les données et afficher le tweet à l écran : socket.onmessage = function(event) { var tweetnode = rendertweet(json.parse (event.data)); document.getelementbyid( tweets ).appendchild(tweetnode); En quatre lignes de JavaScript (si l on ne tient pas compte du code de la fonction rendertweet, qui se contente de transformer les données JSON en fragment HTML pour l ajouter à la page), je peux donc afficher en temps réel les tweets sur ma page.

250 INTRODUCTION À HTML5 FIGURE 11.1 Connexion montrant les tweets que mon serveur écoute. Manipulation d une socket Comme nous l avons mentionné, il existe également des méthodes permettant de faire autre chose que simplement écouter une socket. À titre d exemple, voici à quoi ressemblerait le code d un client chat programmé avec WebSocket : var socket = new WebSocket( ws://mon_serveur_chat.com:8080/ ), me = getusername(); socket.onmessage = function(event) { var data = JSON.parse(event.data); if (data.action == joined ) { initialisechat(); } else { shownewmessage(data.who, data.text); }

Chapitre 11 : TEMPS réel 251 socket.onclose = function () { socket.send(json.stringify({ action: logoff, username: me })); showdisconnectmsg(); socket.onopen = function() { socket.send(json.stringify ({ action: join, username: me })); Cet extrait utilise les mêmes techniques que celles que nous avons employées avec l API de messagerie pour contourner la limite des messages en texte pur : l API des sockets est aussi simple que cela. Toute la négociation de la communication est prise en charge par le navigateur, sans que vous ayez à vous en soucier, et il en va de même pour la gestion du tampon (bien que vous puissiez vérifier la valeur de la propriété bufferedamount de la socket). En fait, le processus de communication est encore plus simple que la configuration d un objet XHR! Server-Sent Events Dans certaines situations, vous avez simplement besoin que le serveur envoie des messages à votre application. L API Server-Sent Events est particulièrement bien adaptée aux applications qui affichent en temps réel des changements de prix, ou les dernières dépêches, ou toute information devant parvenir unilatéralement au navigateur en temps réel si, en revanche, vous avez besoin d une communication en temps réel bidirectionnelle, c est WebSockets qu il vous faut. Server-Sent Events fournit EventSource, dont le fonctionnement ressemble beaucoup à celui d une socket web : on crée un nouvel EventSource en lui passant l URL à laquelle se connecter et le navigateur commence immédiatement à établir une connexion. Un objet EventSource reconnaît trois événements simples : open. Lorsque la connexion a été établie. message. Lorsqu un nouveau message arrive la propriété data de l événement contient alors le message brut. error. Si une erreur est survenue. Ce qui rend un EventSource unique est la façon dont il gère les connexions coupées et le suivi des messages.

252 INTRODUCTION À HTML5 Si la connexion d un objet EventSource est coupée pour une raison ou une autre, l API tentera automatiquement de se reconnecter. Si vous utilisez des identifiants de message, l objet indiquera au serveur lors de sa reconnexion l identifiant du dernier message qu il a reçu, ce qui permettra au serveur (si votre application le demande) d envoyer au client la liste des messages qu il a manqués. Supposons, par exemple, que votre application trace un graphique en temps réel représentant le nombre de fois où Bruce évoque sa peluche rose favorite sur Twitter. Cette application représentera donc les sentiments de Bruce au cours du temps vous saurez ainsi s il est content ou non de la couleur, de la texture et de l aspect général de l objet. Le navigateur se contentant de recevoir passivement des données du serveur, l API Server-Sent Events semble tout particulièrement adaptée. Supposons maintenant que votre connexion se coupe alors que vous surveillez attentivement les émerveillements de Bruce. Lorsque vous vous reconnecterez, EventSource indiquera au serveur que le dernier message avait l identifiant 69. Si le serveur en est au message 78, l application sur le serveur réalisera qu elle en a manqué un certain nombre et le serveur lui renverra alors tous les messages à partir du 70. Le code du client n a pas besoin d être modifié car chacun de ces messages manquants déclenchera simplement l événement message et tout sera représenté correctement sur le graphique. Voici un exemple de code de cette application : var es = new EventSource( /bruces-pink-toy ); es.onopen = function () { initialisechart(); es.onmessage = function (event) { var data = JSON.parse(event.data); chart.plot(data.time, data.sentiment); Server-Side Events technologie côté serveur Côté serveur, vous pourriez utiliser une configuration reposant sur PHP (LAMP, par exemple) mais, Apache (le A de LAMP) ne supportant pas très bien les connexions persistantes, la connexion sera sans cesse coupée. L objet EventSource passera donc son temps à se reconnecter automatiquement, ce qui produira un résultat semblable à une application Ajax de type polling. Ce n est donc pas la meilleure façon de procéder, mais il faut bien reconnaître que PHP est sûrement le ticket d entrée le moins cher pour la plupart d entre nous. Quoi qu il en soit, pour vraiment tirer parti d un EventSource, vous avez besoin d une connexion persistante au serveur ce qu une configuration LAMP classique ne peut pas vous fournir. Vous pouvez, et vous devriez sûrement, choisir un serveur reposant sur les événements. Entrer dans les détails sort du cadre de ce livre mais je vous conseille d étudier Node.js (une plateforme serveur reposant sur JavaScript) ou Twisted for Python.

Chapitre 11 : TEMPS réel 253 Le serveur doit garder ouverte la connexion avec le client et il doit lui envoyer un en-tête avec le type MIME text/event-stream. Il doit envoyer les nouveaux messages sous la forme suivante : id: 1\n data: { sentiment : aime, time : 2011-06-23 16:43:23 }\n\n Les deux retours à la ligne servent à signaler la fin du message. L API permet également d envoyer plusieurs lignes, grâce à quoi nous pouvons envoyer des phrases en texte clair (et non en JSON comme ci-dessus) : data: C est ma première ligne vraiment, vraiment, vraiment très très\n data : longue, mais je n ai pas encore fini.\n\n data: Comme je suis placé après deux retours à la ligne, je suis un data: nouveau message.\n\n Dans cet exemple deux messages seulement seront envoyés. En outre, vous noterez qu aucun identifiant n est utilisé ils ne sont pas obligatoires mais vous en aurez besoin si vous voulez pouvoir reprendre à partir d où vous avez été coupé. Exemple de serveur EventSource simple Voici un code Node.js très simple qui accepte les connexions à un serveur EventSource et qui envoie des messages. Là encore, nous n expliquerons pas le fonctionnement du serveur car cela sortirait du cadre de ce livre, mais ce code devrait vous donner un bon point de départ. Nous avons également simplifié la solution afin que le serveur se contente de prévenir les utilisateurs connectés en leur envoyant le nom de l agent utilisateur des autres visiteurs connectés au même service. Nous garderons les graphiques sur le jouet spécial de Bruce pour un autre jour! /** Lorsqu ils créent un nouvel EventSource */ response.writehead(200, { Content-Type : text/event-stream, Cache-Control : no-cache }); // on récupère le dernier événement et on force sa conversion en nombre var lastid = req.headers[ last-event-id ]*1; if (lastid) { for (var i = lastid; i < eventid; i++) { response.write( data: + JSON.stringify(history[eventId]) + \ nid: + eventid + \n\n ); } } // Enfin, on met en cache la réponse connections.push(response); /** Réception d une requête web classique */

254 INTRODUCTION À HTML5 connections.foreach(function (response) { history[++eventid] = { agent: request.headers[ user-agent ], time: + new Date response.write( data: + JSON.stringify(history[eventId]) + nid: + eventid + \n\n ); }); Le code client ressemble à celui-ci : var es = new EventSource( /eventsource ); es.onmessage = function (event) { var data = JSON.parse(event.data); log.innerhtml += <li><strong> + data.agent + </strong><br> connecté le <em> + (new Date(data.time)) + </em></li> ; C est donc une application très simple mais, en coulisse, tout le travail s effectue à l aide d événements push produits en temps réel par le serveur. Implémentations disponibles EventSource est assez bien reconnu. Chrome, Safari, Firefox et Opera le gèrent très bien à l heure où ce livre est écrit, on ne sait pas très bien s il en sera de même pour IE10. Cependant, EventSource se repliant vers le polling, il est très facile de simuler cette API pour créer une rustine en JavaScript et en Ajax (vous trouverez quelques exemples à l URL https://github.com/modernizr/ Modernizr/wiki/HTML5-Cross-browser-Polyfills sous la rubrique EventSource ). J ai également remarqué que si l on créait un EventSource pendant ou immédiatement après le chargement d une page, certains navigateurs continuaient à afficher leur icône de chargement, ce qui pourrait laisser croire que le chargement de la page n est pas terminé alors que ce n est pas le cas. Je ne sais pas si c est un bogue dans l implémentation ou une fonctionnalité pour garder les développeurs en éveil, mais il suffit d attendre que le document ait fini son chargement et d envelopper le code d initialisation de l objet EventSource dans un appel à settimeout(init, 10) pour éviter ce problème. Résumé Ce chapitre vous a présenté un terme à la mode : temps réel. Cela dit, l ajout du temps réel à un site web permet de le rendre vraiment attractif maintenant que vous savez qu il est très simple à mettre en œuvre en JavaScript, je suis sûr que vous ne pourrez plus résister. Il reste bien sûr un peu de configuration à effectuer sur le serveur mais, une fois cela mis en place, vous pourrez capter l attention de tous ceux qui ont tendance à zapper de site en site. Passons maintenant à un sujet épous-tou-flant.