Académique Documents
Professionnel Documents
Culture Documents
Node.js est souvent associé à la notion de JavaScript Natif (développement JavaScript sans
utiliser de framework), ce qui peut faire fuir de nombreux développeurs formés sur jQuery.
Je propose donc à tous ces développeurs, qui s'intéressent à Node.js mais qui ne veulent
pas perdre la puissance et l'expérience acquise sur jQuery, cet article qui les guidera pas à
pas et de façon ludique dans le développement d'un système de messagerie instantanée.
Commentez
Node.js pour les développeurs jQuery par Marc Buils
I - Introduction..............................................................................................................................................................3
II - Présentation........................................................................................................................................................... 3
III - Installation............................................................................................................................................................. 3
IV - Votre premier serveur HTTP................................................................................................................................ 3
IV-A - Rappel sur la communication Navigateur/Serveur...................................................................................... 4
IV-B - Fonctions nécessaires au développement du serveur................................................................................ 4
IV-B-1 - Inclusion d'un module JavaScript....................................................................................................... 4
IV-B-2 - Module http......................................................................................................................................... 4
IV-B-3 - Exécution d'un script Node.js............................................................................................................. 5
IV-C - Exercice....................................................................................................................................................... 6
IV-D - Exemple de solution.................................................................................................................................... 6
V - Développement d'un serveur HTTP générique..................................................................................................... 7
V-A - Quelques rappels sur jQuery....................................................................................................................... 7
V-A-1 - Encapsulation jQuery........................................................................................................................... 7
V-A-2 - Plugin jQuery........................................................................................................................................8
V-A-3 - .data...................................................................................................................................................... 8
V-B - Fonctions nécessaires au développement du serveur................................................................................. 9
V-B-1 - Module url............................................................................................................................................ 9
V-B-2 - Module fs..............................................................................................................................................9
V-B-3 - Installation de module.......................................................................................................................... 9
V-C - Exercice...................................................................................................................................................... 10
V-D - Exemple de solution................................................................................................................................... 11
VI - Développement d'un serveur WebSocket générique......................................................................................... 13
VI-A - Quelques rappels sur jQuery.....................................................................................................................13
VI-A-1 - .on() et .trigger().................................................................................................................................13
VI-B - Fonctions nécessaires au développement du serveur.............................................................................. 14
VI-B-1 - Module websocket.server..................................................................................................................14
VI-C - Exercice..................................................................................................................................................... 15
VI-D - Exemple de solution.................................................................................................................................. 16
VII - Développement d'un système de messagerie instantanée............................................................................... 19
VII-A - Exercice.................................................................................................................................................... 19
VII-B - Exemple de solution................................................................................................................................. 20
VIII - Conclusion........................................................................................................................................................ 23
IX - Remerciements................................................................................................................................................... 23
-2-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
I - Introduction
Node.js pour les développeurs jQuery est un article destiné aux développeurs front end qui souhaitent se lancer dans
l'aventure du développement JavaScript côté serveur.
Vous allez découvrir, pour ceux qui en doutaient encore, que la réputation de jQuery ne tient pas seulement à sa
faculté de manipuler facilement les éléments du DOM ou d'être compatible avec la majorité des navigateurs. Mais il
la tient aussi par ses patterns, son concept d'objet unique, son système de plugins et surtout sa faculté à être simple,
accessible et en perpétuelle évolution.
Cet article est articulé autour d'exercices et d'exemples de solutions qui vont vous permettre d'appréhender quelques
concepts de Node.js et jQuery, tout en développant des briques logicielles qui pourront vous suivre sur vos futurs
projets.
Les exemples de code décrits dans cet article sont téléchargeables ici ou disponibles sur
github.
Les descriptions d'API données dans cet article ne sont pas forcément complètes.
Elles se limitent aux fonctionnalités nécessaires pour suivre les exemples de l'article.
N'hésitez pas à visiter la documentation officielle des API pour avoir une description
exhaustive.
II - Présentation
Au même titre que les interpréteurs Perl, Python ou encore PHP, Node.js est un interpréteur pour le langage
JavaScript. Basé sur le moteur JavaScript V8 de Chrome, il fait partie des moteurs JavaScript les plus performants.
À l'inverse du PHP qui se greffe sur un serveur Web (Apache, IIS…) afin de s'acquitter de la gestion du protocole
HTTP, Node.js propose de créer votre propre serveur Web ou WebSocket grâce à son framework qui, heureusement,
vous simplifie grandement la tâche.
Cependant, rien ne vous oblige à créer votre serveur Web en JavaScript. Node.js peut aussi servir de complément
à un serveur Web plus robuste afin de ne gérer que la partie communication temps réel (sa spécialité...).
III - Installation
L'installation étant assez simple que ce soit sous Windows, Mac OS X ou Linux, je ne m'étendrais pas sur ce
paragraphe. Sachez seulement que Node.js fait office de serveur Web. À ce titre, il doit être installé sur la machine
qui tiendra le rôle de serveur.
À la fin de ce chapitre, vous comprendrez le mécanisme de Node.js et vous serez capable de créer un serveur
HTTP de base.
-3-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
Avant d'aller plus loin, il faut bien comprendre le principe de communication entre le navigateur internet de l'utilisateur
et le serveur Web.
Voici ce qui se passe lorsqu'un utilisateur entre une URL sur son navigateur internet :
La fonction require permet d'inclure un fichier JavaScript. À la différence des fichiers JavaScript côté client, avec
Node.js on parle de « module ».
Un « module » peut retourner un résultat qui, dans le framework de Node.js, est en général un objet à instancier.
Pour que votre module retourne une valeur, il suffit de donner cette valeur à la variable globale
module.exports.
Nous n'étudierons pas plus cette notion dans cet article, mais il important de la connaître car
le framework de Node.js est basé sur ce principe.
La fonction require ne recharge pas les modules à chaque fois, mais elle ne les charge que
lors du premier appel.
Par la suite, elle se contente de retourner l'instance stockée.
Le module http est intégré de base avec Node.js. Il retourne un objet JavaScript qui permet de créer un serveur
HTTP facilement.
-4-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
Pour créer l'instance de votre serveur, vous devez utiliser la commande http.createServer( callback( request,
response ) ).
Exemple d'utilisation :
La fonction callback est appelée à chaque fois qu'un utilisateur appelle une page depuis son
navigateur.
La commande précédente permet de créer l'instance du serveur, mais il faut maintenant que ce dernier se mette en
écoute sur un port IP. C'est le rôle de la commande listen( port, name ).
Exemple d'utilisation :
Enfin, il y a les commandes response.writeHead et response.end qui permettent respectivement de renvoyer la partie
HEADER du protocole HTTP et la partie données.
La partie HEADER du protocole HTTP est invisible pour l'utilisateur mais nécessaire au
navigateur, entre autres pour indiquer de quelle manière il doit afficher les données (page
HTML, page Ajax, fichier ZIP…).
Le paramètre code correspond au code HTTP de retour. Les plus utilisés sont le code 200 =
statut OK, et le code 404 = fichier non trouvé.
Vous trouverez sur Wikipedia la liste complète des codes HTTP.
1. node {nom_du_fichier}
-5-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
IV-C - Exercice
Vous devez créer dans le fichier hello-world.js un serveur HTTP qui retourne Hello World quelle que soit la page
demandée par l'utilisateur.
hello-world.js
1. /**
2. * Simple Hello World
3. */
4. ;(function( http /* variable qui reçoit le module http */ ){
5. // Création du serveur HTTP
6. http.createServer( function (req, res) { // fonction de callback appelée pour chaque appel
de page
7. // code de statut 200 (OK) et retourne un fichier de type 'text/plain'
8. res.writeHead(200, {'Content-Type': 'text/plain'});
9.
10. // Le fichier retourné contient le texte 'Hello World'
11. res.end('Hello World\n');
12. } )
13. .listen(1337, "127.0.0.1"); // Le serveur écoutera le port 1337
14. })( require('http') /* inclue le module http */ );
-6-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
Vous remarquerez que notre code est encapsulé dans une fonction anonyme. Ce n'est pas
obligatoire, mais c'est pratique pour fournir les modules nécessaires à notre code tout en
créant un contexte de développement dédié.
Vous remarquerez également que le premier caractère (en dehors des commentaires) est
un ';'.
Ça permet de protéger votre code contre les scripts qui se terminent sans ';' dans le cas où
vous utiliseriez un outil pour compresser tous vos scripts en un seul et unique fichier.
Maintenant que vous maitrisez le concept de Node.js, nous allons pouvoir intégrer les notions de jQuery qui vont
vous permettre de faire évoluer votre serveur HTTP actuel vers un serveur plus générique comme Apache (mais
en moins poussé bien sûr).
Avant de commencer nos développements jQuery, nous allons commencer par quelques petits rappels sur certaines
spécificités de jQuery.
Lorsqu'on développe côté front end, on utilise généralement la fonction jQuery avec deux types de données :
• les chaines de caractères, avec une expression CSS afin de sélectionner un élément du DOM ou une liste
d'éléments du DOM contenus dans notre page HTML (exemple : $('#id_mon_element')) ;
• des fonctions qui sont appelées lorsque le document est initialisé (exemple : $(function(){ /* code appelé une
fois la page complètement chargée */ })).
Mais la fonction jQuery peut aussi être appelée avec d'autres types de données, comme des structures (exemple :
$({})) ou des tableaux (exemple : $([{}, {}])).
L'intérêt de cette utilisation côté front end est limité à des cas très particuliers. Par contre vous verrez que pour un
développement Node.js, cette faculté va nous être particulièrement utile.
-7-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
Une autre particularité de jQuery qu'on apprécie beaucoup côté front end, est sa gestion des plugins. Encore une
fois, côté client, on se limite plus souvent à utiliser des plugins existants plutôt qu'à en créer de nouveaux.
Sur Node.js ce sera l'inverse, on va plutôt avoir tendance à en créer. Surtout aujourd'hui où le nombre de plugins
jQuery pour Node.js est très limité.
Voici un petit rappel sur la façon (plutôt une des façons) de créer un plugin jQuery :
1. ;(function($){
2. $.fn.notrePlugin = function(/* liste des paramètres si nécessaire */){
3. // 'this' correspond ici à l'objet jQuery auquel s'applique le plugin (celui qui l'a
appelé)
4. this.each(function(){
5. // ici, 'this' correspond à la valeur en cours de l'itération
6. }) ;
7.
8. return this ; // on retourne toujours notre objet jQuery pour ne pas casser la chaine
9. } ;
10. )(jQuery) ;
V-A-3 - .data
Une autre fonctionnalité de jQuery qu'on va utiliser dans cet article est la fonction .data. Cette fonction nous permet
d'enregistrer des informations sur un objet encapsulé par jQuery.
-8-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
1. var mon_objet = {} ;
2.
3. $(mon_objet).data('donnee', 'Donnée enregistrée') ;
4. console.log( $(mon_objet).data('donnee') ) ; // Affiche dans la console 'Donnée enregistrée'
Le module url permet de simplifier la lecture d'une URL. Pour votre serveur HTTP, je vous propose d'utiliser la fonction
url.parse afin de récupérer le pathname de l'URL.
V-B-2 - Module fs
Le module fs (File System) permet d'accéder au système de fichier du serveur. Il peut, entre autres, nous permettre
de lire un fichier grâce à la fonction fs.readFile.
Lors de l'installation de Node.js, vous avez aussi installé NPM (Node Packaged Modules). Cet outil permet d'installer
des modules complémentaires pour votre projet.
Vous devez ouvrir un terminal dans le répertoire de votre projet avant d'exécuter cette
commande.
La plupart des frameworks existants pour une utilisation front end ne sont pas compatibles
directement avec Node.js à cause de la notion de DOM qui n'existe pas côté serveur.
-9-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
C'est par exemple le cas de jQuery. Heureusement, ces bibliothèques sont généralement
disponibles via NPM !
V-C - Exercice
L'objectif de cet exercice est de faire un serveur HTTP qui retourne les pages demandées par l'utilisateur si elles
existent dans le répertoire www. Dans le cas contraire, il retourne la fameuse erreur 404 indiquant que le fichier n'a
pas été trouvé.
Ce serveur devra se présenter sous la forme d'un plugin jQuery, à appliquer sur une structure contenant un champ
port.
Ce champ port devra correspondre au port écouté par votre serveur.
Pour vous aider, voici un schéma qui décrit les étapes que doit suivre votre serveur :
- 10 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
starthttp.js
1. ;(function( $ ){
2. $({
3. port: 8090
4. })
5. .httpserver();
6. })( require('jquery'), // charge jQuery
7. require('./src/jquery.httpserver') ); // charge votre serveur HTTP
www/hello-world.html
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta charset="utf-8" />
5. <title>Exemple 2: Votre premier serveur HTTP générique</title>
6. </head>
7. <body>
8. <h1>Hello World</h1>
9. </body>
10. </html>
starthttp.js
1. ;(function( $ ){
2. $({
3. port: 8090
4. }).httpserver();
5. })( require("jquery"), // charge jQuery
6. require('./src/jquery.httpserver') ) ; // charge votre serveur HTTP
src/jquery.httpserver.js
1. ;(function(http, url, fs, $){
2. $.fn.httpserver = function( ){
3. return this.each(function(){
4. var _options = $.extend( {}, {
5. port: 80, // port par défaut
6. path: './www', // répertoire par défaut
7. types: { // liste des types de fichier acceptes
8. "html": 'text/html'
9. }
10. }, this ); // merge les options de la structure 'this' avec les options par
défaut
11.
12. // Création du serveur HTTP
13. var _serveur = http.createServer( function (req, res) { // fonction de callback
appelée pour chaque appel de page
14. var _pathname = url.parse(req.url).pathname;
15. var _ext = _pathname.split('/');
16. _ext = _ext[_ext.length-1].split('.');
17. _ext = ( _ext.length < 2 ? '' : _ext[_ext.length-1] );
18.
19. fs.readFile( _options.path + _pathname, function(err, data){
20. if ( err ){
- 11 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
src/jquery.httpserver.js
21. // code de statut 404 (FILE_NOT_FOUND) et retourne un fichier de
type 'text/plain'
22. res.writeHead(404, {'Content-Type': 'text/plain'});
23. // Affiche une erreur
24. res.end('Ereur 404: Fichier non trouve\n');
25. } else {
26. // code de statut 200 (OK) et retourne un fichier de type 'text/
plain'
27. res.writeHead(200, {'Content-Type': typeof(_options.types[
_ext ]) != "undefined" ? _options.types[ _ext ] : 'text/plain' });
28. // retourne le fichier trouvé
29. res.end( data );
30. }
31. });
32. } )
33. .listen( _options.port, '127.0.0.1' ); // Le serveur écoutera le
port 8090
34.
35. // Partage le serveur
36. $(this).data( 'httpserver', _serveur );
37. });
38. };
39. })( require('http'), // charge le module http
40. require('url'), // charge le module url
41. require('fs'), // charge le module file system
42. require('jquery') ); // charge le module jQuery
www/hello-world.html
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta charset="utf-8" />
5. <title>Exemple 2: Votre premier serveur HTTP générique</title>
6. </head>
7. <body>
8. <h1>Hello World</h1>
9. </body>
10. </html>
- 12 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
Vous remarquerez que pour utiliser jQuery, on ne donne pas en paramètre l'objet jQuery
comme on l'aurait fait pour du JavaScript client, mais on utilise la commande require.
En Node.js, jQuery est un module qui retourne l'objet jQuery.
On charge un module ./src/httpserver mais on ne récupère pas la valeur de retour dans une
variable comme on peut le faire pour le module jQuery. httpServeur est en fait un plugin jQuery
qu'on a développé pour créer notre serveur Web. Et comme en jQuery, tous les plugins sont
attachés à l'objet jQuery, notre module ne retourne aucune valeur.
Vous remarquerez la syntaxe var _options = $.extend( {}, { /* options par défaut */ }, this ). Pour
le même résultat, on aurait pu écrire var _options = $.extend( { /* options par défaut */ }, this ).
Cependant la première syntaxe met en avant le fait que le premier paramètre est en lecture/
écriture (il reçoit la même valeur que la variable _options).
Vous pouvez vous passer de la variable _options en mergeant directement les options sur
notre structure this.
Mais attention, ça modifie votre structure d'origine ce qui pourrait impacter le fonctionnement
des autres plugins jQuery utilisés sur cette même structure.
Vous remarquerez aussi dans le code source qu'on enregistre notre instance de serveur sur
l'objet this via la fonction .data de jQuery. Cette instance est nécessaire à la création d'un
serveur WebSocket que nous allons créer dans le prochain exemple.
Dans cet exercice, nous allons intégrer la notion d'évènement grâce aux fonctions on et trigger dans leur utilisation
la plus basique.
- 13 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
Donc voici des petits exemples d'utilisation histoire de faire une petite piqure de rappel :
Pour notre exemple, seul websocket.server va nous intéresser puisqu'il permet de créer un serveur WebSocket.
Vous avez peut-être remarqué que pour créer un serveur WebSocket, il faut fournir l'instance
d'un serveur HTTP.
- 14 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
Cela vient du fait qu'avant d'ouvrir une connexion WebSocket, la demande d'ouverture est faite
via le protocole HTTP. C'est seulement dans un second temps que la socket HTTP ouverte
est transformée en socket WebSocket.
VI-C - Exercice
Pour cet exercice, vous devez créer un plugin jQuery wsserveur qui ouvre une connexion WebSocket. Pour ce faire,
vous allez pouvoir réutiliser le serveur HTTP que vous avez développé pour l'exercice précédent.
Votre plugin doit faire remonter l'évènement request sur la structure qui contient la configuration du serveur, avec
en paramètre la connexion ouverte.
Il doit également faire remonter sur cette connexion les évènements message et close lorsque la connexion reçoit
un nouveau message depuis l'IHM ainsi que lorsqu'elle est coupée.
startws.js
1. ;(function( $ ){
2. $({
3. port: 8091,
4. types: {
5. "js": 'text/js',
6. "html": 'text/html'
7. }
8. })
9. .httpserver()
10. .wsserver()
11. .on('request', function( event, _connection ){
12. console.log('Nouvelle connexion');
13.
14. $( _connection )
15. .on('message', function(event, message){
16. console.log('Nouveau message: %s', message);
17. })
18. .on('close', function(){
19. console.log('Une connexion s\'est fermee');
20. });
21. });
22. })( require('jquery'), // charge jQuery
23. require('./src/jquery.httpserver'), // charge votre serveur HTTP
24. require('./src/jquery.wsserver') ); // charge votre serveur WebSocket
www/ws.html
1. <!doctype html>
2. <html>
3. <head>
4. <meta charset="utf-8" />
5. <title>Demo Node.js avec jQuery</title>
6. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
7. <script src="ws.js"></script>
8. </head>
9. <body>
10. <h1>Node.js pour les developpeurs jQuery</h1>
11. <input type="text" id="texte" /><input type="button" id="envoyer" value="Envoyer" />
12. </body>
13. </html>
www/ws.js
1. ;(function($){
- 15 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
www/ws.js
2. $(function(){
3. window.WebSocket = window.WebSocket || window.MozWebSocket;
4.
5. var _connection = new WebSocket('ws://' + document.URL.substr(7).split('/')[0]);
6.
7. $('#envoyer').click(function(){
8. _connection.send( $('#texte').val() );
9. });
10. });
11. })(jQuery);
startws.js
1. ;(function( $ ){
2. $({
3. port: 8091,
4. types: {
5. "js": 'text/js',
6. "html": 'text/html'
7. }
8. })
9. .httpserver()
10. .wsserver()
11. .on('request', function( event, _connection ){
12. console.log('Nouvelle connexion');
13.
14. $( _connection )
15. .on('message', function(event, message){
16. console.log('Nouveau message: %s', message);
17. })
18. .on('close', function(){
19. console.log('Une connexion s\'est fermee');
20. });
21. });
22. })( require('jquery'), // charge jQuery
23. require('./src/jquery.httpserver'), // charge votre serveur HTTP
24. require('./src/jquery.wsserver') ); // charge votre serveur WebSocket
src/jquery.wsserver.js
1. ;(function( WebSocketServer, $ ){
2. $.fn.wsserver = function(){
- 16 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
src/jquery.wsserver.js
3. return this.each(function(){
4. var $_this = $(this);
5. var _wsserver = null;
6. var _connections = {
7. list: []
8. };
9.
10. try {
11. // vérifie si le serveur Web a bien été initialisé
12. if ( typeof( $_this.data('httpserver') ) == "undefined" ){
13. throw "Serveur HTTP non initialisé";
14. }
15.
16. // Partage la liste des connexions
17. $_this.data('connections', _connections);
18.
19. // Crée le serveur de WebSocket
20. _wsserver = new WebSocketServer({
21. httpServer: $_this.data('httpserver')
22. });
23.
24. // Surveille les évènements
25. _wsserver
26. .on('request', function(request) {
27. var _connection = request.accept(null, request.origin);
28.
29. // ajoute la nouvelle connexion à la liste des connexions
30. _connections.list.push( _connection );
31.
32. // diffuse l'information d'une nouvelle connexion
33. $_this.trigger('request', [_connection])
34.
35. // écoute les événements de la connexion
36. _connection
37. .on('message', function(message) {
38. if (message.type === 'utf8') {
39. // diffuse le message reçu
40.
$(_connection).trigger('message', [message.utf8Data]);
41. }
42. })
43. .on('close', function(connection) {
44. // suppression de la connection de la liste
45.
_connections.list.splice(_connections.list.indexOf(_connection), 1);
46.
47. // diffuse la fermeture de connection
48. $(_connection).trigger('close');
49. });
50. });
51.
52. } catch( e ) {
53. console.error( "Erreur du plugin wsserver: %s", e )
54. }
55. });
56. }
57. })( require('websocket').server,
58. require('jquery') );
www/ws.html
1. <!doctype html>
2. <html>
3. <head>
4. <meta charset="utf-8" />
5. <title>Demo Node.js avec jQuery</title>
6. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
7. <script src="ws.js"></script>
- 17 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
www/ws.html
8. </head>
9. <body>
10. <h1>Node.js pour les developpeurs jQuery</h1>
11. <input type="text" id="texte" /><input type="button" id="envoyer" value="Envoyer" />
12. </body>
13. </html>
www/ws.js
1. ;(function($){
2. $(function(){
3. // if user is running mozilla then use it's built-in WebSocket
4. window.WebSocket = window.WebSocket || window.MozWebSocket;
5.
6. var _connection = new WebSocket('ws://' + document.URL.substr(7).split('/')[0]);
7.
8. $('#envoyer').click(function(){
9. _connection.send( $('#texte').val() );
10. });
11. });
12. })(jQuery);
- 18 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
VII-A - Exercice
Maintenant que le plus dur est derrière vous, vous avez pour mission d'écrire le serveur d'une messagerie instantanée
multiutilisateur.
• lorsqu'un utilisateur se connecte, l'IHM envoie le message JSON suivant : {type : 'open', login : login} ;
• lorsqu'un utilisateur envoie un message, l'IHM envoie le message suivant : {type : 'message', message}.
startchat.js
1. ;(function( $ ){
2. $({
3. port: 8092,
4. path: './www',
5. types: {
6. "js": 'text/js',
7. "html": 'text/html'
8. }
9. })
10. .httpserver()
11. .wsserver()
12. .chatserver();
13. })( require("jquery"), // charge jQuery
14. require('./src/jquery.httpserver'), // charge votre serveur HTTP
15. require('./src/jquery.wsserver'), // charge votre serveur WebSocket
16. require('./src/jquery.chatserver') ); // charge votre serveur de messagerie
www/chat.html
1. <!doctype html>
2. <html>
3. <head>
4. <meta charset="utf-8" />
5. <title>Demo Node.js avec jQuery</title>
6. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
7. <script src="chat.js"></script>
8. </head>
9. <body>
10. <h1>Node.js pour les developpeurs jQuery</h1>
11. <input type="text" id="texte" /><input type="button" id="envoyer" value="Envoyer" />
12. <div id="salon"></div>
13. </body>
14. </html>
www/chat.js
1. ;(function($){
2. $(function(){
- 19 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
www/chat.js
3. var _login = prompt("Entrez votre login");
4.
5. window.WebSocket = window.WebSocket || window.MozWebSocket;
6.
7. var _connection = new WebSocket('ws://' + document.URL.substr(7).split('/')[0]);
8.
9. _connection.onopen = function () {
10. _connection.send( JSON.stringify({
11. type: 'open',
12. login: _login
13. }) );
14. };
15.
16. _connection.onmessage = function (_message) {
17. var _data = JSON.parse(_message.data);
18.
19. if ( _data.type == 'chatopen' ){
20. $('#salon').prepend( $('<li></li>').text( ">>> "+_data.login+" vient
d'arriver") );
21. }else if ( _data.type == 'chatmessage' ){
22. $('#salon').prepend( $('<li></li>').text( _data.login+": "+_data.message) );
23. }else if ( _data.type == 'chatclose' ){
24. $('#salon').prepend( $('<li></li>').text( _data.login+" vient de partir") );
25. }
26. };
27.
28. $('#envoyer').click(function(){
29. _connection.send( JSON.stringify({
30. type: 'message',
31. message: $('#texte').val()
32. }) );
33. });
34. });
35. })(jQuery);
startchat.js
1. ;(function( $ ){
2. $({
3. port: 8092,
4. path: './www',
5. types: {
6. "js": 'text/js',
7. "html": 'text/html'
8. }
9. })
10. .httpserver()
11. .wsserver()
12. .chatserver();
13. })( require("jquery"), // charge jQuery
14. require('./src/jquery.httpserver'), // charge votre serveur HTTP
15. require('./src/jquery.wsserver'), // charge votre serveur WebSocket
16. require('./src/jquery.chatserver') ); // charge votre serveur de messagerie
www/chat.html
1. <!doctype html>
2. <html>
- 20 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
www/chat.html
3. <head>
4. <meta charset="utf-8" />
5. <title>Demo Node.js avec jQuery</title>
6. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
7. <script src="chat.js"></script>
8. </head>
9. <body>
10. <h1>Node.js pour les developpeurs jQuery</h1>
11. <input type="text" id="texte" /><input type="button" id="envoyer" value="Envoyer" />
12. <div id="salon"></div>
13. </body>
14. </html>
www/chat.js
1. ;(function($){
2. $(function(){
3. var _login = prompt("Entrez votre login");
4.
5. // if user is running mozilla then use it's built-in WebSocket
6. window.WebSocket = window.WebSocket || window.MozWebSocket;
7.
8. var _connection = new WebSocket('ws://' + document.URL.substr(7).split('/')[0]);
9.
10. _connection.onopen = function () {
11. _connection.send( JSON.stringify({
12. type: 'open',
13. login: _login
14. }) );
15. };
16.
17. _connection.onmessage = function (_message) {
18. var _data = JSON.parse(_message.data);
19.
20. if ( _data.type == 'chatopen' ){
21. $('#salon').prepend( $('<li></li>').text( ">>> "+_data.login+" vient
d'arriver") );
22. }else if ( _data.type == 'chatmessage' ){
23. $('#salon').prepend( $('<li></li>').text( _data.login+": "+_data.message) );
24. }else if ( _data.type == 'chatclose' ){
25. $('#salon').prepend( $('<li></li>').text( _data.login+" vient de partir") );
26. }
27. };
28.
29. $('#envoyer').click(function(){
30. _connection.send( JSON.stringify({
31. type: 'message',
32. message: $('#texte').val()
33. }) );
34. });
35. });
36. })(jQuery);
src/jquery.chatserver.js
1. ;(function($){
2. $.fn.chatserver = function(){
3. return this.each(function(){
4. var $_this = $(this);
5.
6. // s'abonne aux nouveaux clients
7. $_this.on('request', function(_event, _connection){
8. $( _connection )
9. // on vient de se connecter
10. .on('open', function(__event){
11. // rien à faire
- 21 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
src/jquery.chatserver.js
12. })
13. // on reçoit un message de l'IHM
14. .on('message', function(__event, _message){
15. // on parse la réponse avant de la traiter
16. var _data = JSON.parse(_message);
17.
18. // l'utilisateur vient de se connecter sur l'IHM
19. if ( _data.type == 'open' ){
20. $( _connection ).data( 'login', _data.login ); // on
enregistre nom login
21.
22. $( $_this.data('connections').list )
23. .trigger( 'chatopen', [_data.login] );
24. }else if ( _data.type == 'message' ){
25. $( $_this.data('connections').list )
26. .trigger( 'chatmessage', [$(_connection).data('login'),
_data.message] );
27. }
28. })
29. .on('close', function(__event){
30. var _connections = $_this.data('connections') ;
31.
32. $( _connections.list )
33. .trigger( 'chatclose', [$(_connection).data('login')] );
34. })
35. // un nouvel utilisateur vient d'arriver
36. .on('chatopen', function(__event, _login){
37. // on envoie l'information à l'IHM
38. _connection.sendUTF( JSON.stringify({
39. type: 'chatopen',
40. login: _login
41. }) );
42. })
43. // on recoit un message d'un autre utilisateur du chat
44. .on('chatmessage', function(__event, _login, _message){
45. // on envoie l'information à l'IHM
46. _connection.sendUTF( JSON.stringify({
47. type: 'chatmessage',
48. login: _login,
49. message: _message
50. }) );
51. })
52. // un utilisateur vient de partir
53. .on('chatclose', function(__event, _login){
54. // on envoie l'information à l'IHM
55. _connection.sendUTF( JSON.stringify({
56. type: 'chatclose',
57. login: _login
58. }) );
59. });
60. });
61. });
62. };
63. })( require('jquery') );
- 22 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/
Node.js pour les développeurs jQuery par Marc Buils
VIII - Conclusion
Grâce à l'utilisation de jQuery, vous avez réussi à développer un serveur de messagerie instantanée en temps réel,
grâce à des plugins réutilisables, complètement autonomes, mais qui communiquent entre eux.
Le tout en ayant plus de 60 % du code qui peut être réutilisé sur vos prochains projets.
Imaginez ce que pourront donner nos développements jQuery pour Node.js si nous arrivons à avoir la même banque
de plugins qu'en front end !
Alors, vous pensez toujours que jQuery est seulement fait pour gérer les éléments du DOM ?
IX - Remerciements
Merci à Bovino et ClaudeLELOUP pour leurs relectures et leurs corrections de cet article.
- 23 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2012 Marc Buils. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
http://marcbuils.developpez.com/cours/javascript/nodejs-developpement-jquery/