Sockets

Maintenant que le serveur HTTP est déployé, il est temps de mettre en place une méthode de communication bidirectionnelle temps réel à base de sockets.

socket.io

socket.io est un module pour Node.js permettant d'utiliser des sockets. Il est composé d'une partie serveur et d'une bibliothèque à destination des clients.

Après avoir installé le module,

npm install socket.io

Ajouter le code ci-dessous aux fichiers server.js et client.js.

/*
 * server.js
 *
 */
 
 
/*
 * Binds a socket server to the current HTTP server
 *
 */
let socketServer = require('socket.io')(http);

// Registers an event listener ('connection' event)
socketServer.on('connection', (socket) => {
  console.log('A new user is connected...');
});
/*
 * client.js
 *
 */


let socketClient = io();

Envoi et réception de messages

La communication bidirectionnelle avec socket.io repose sur des méthodes d'envoi et de réception de messages, disponibles côté serveur et côté client.

Côté serveur

socketServer.emit() Envoie un message à tous les clients connectés
socket.emit() Envoie un message au client connecté via l'objet socket
socket.broadcast.emit() Envoie un message à tous les clients à l'exception de celui connecté via l'objet socket
socketServer.on() Enregistre un écouteur d'événement émanant de tous les clients
socket.on() Enregistre un écouteur d'événement émanant du client connecté via l'objet socket

Côté client

socketClient.emit() Envoie un message au serveur
socketClient.on() Enregistre un écouteur d'événement émanant du serveur

Afin d'illustrer l'utilisation de ces méthodes, voici un exemple simple de communication à l'aide des sockets. Ajoutez les lignes ci-dessous aux fichiers server.js et client.js et observez les échanges à l'aide du terminal (côté serveur) et de la console JavaScript (côté client).

/*
 * server.js
 */


 /*
 * Binds a socket server to the current HTTP server
 *
 */
let socketServer = require('socket.io')(http);

socketServer.on('connection', function (socket) {
  console.log('A new user is connected...');

  /*
   * Registers an event listener
   *
   * - The first parameter is the event name
   * - The second parameter is a callback function that processes
   *   the message content.
   */
  socket.on('hello', (content) => {
    console.log(content + ' says hello!');

    // Pushes an event to all the connected clients
    socketServer.emit('notification', content + ' says hello!');

    // Pushes an event to the client related to the socket object
    socket.emit('hello', 'Hi ' + content + ', wassup mate?');
  });
});
/*
 * client.js
 */


let socketClient = io();

/*
 * Emits an event to the server
 *
 * - The first parameter is the event name.
 * - The second parameter is the message content: it can be a number,
 *   a string or an object.
 */
socketClient.emit('hello', 'Olivier');

/*
 * Registers event listeners
 *
 * - The first parameter is the event name
 * - The second parameter is a callback function that processes
 *   the message content.
 */
socketClient.on('notification', (content) => {
  console.log(content);
});

socketClient.on('hello', (content) => {
  console.log(content);
});