L’objectif de ce chapitre est de vous permettre de créer une application “temps réel” :
Avant de commencer
Dans votre répertoire <APP>, créez une application React.js appelée client par la commande suivante :
npx create-react-app client
ou alors téléchargez l’archive suivante qui contient une application React vide.
Ajoutez le package bootswatch à votre client npm i bootswatch pour pouvoir disposer du style bootstrap utilisé dans le code présenté par la suite.
Supprimez le code du fichier client/src/App.js et remplacez-le progressivement en suivant les différentes étapes ci-dessous :
function App() {
  const [messages, setMessages] = useState([]);
messages qui est un tableau, vide à l’origine.Ajoutez ensuite la fonction suivante :
function setNewMessage(msg) {
    setMessages([
      ...messages,
      msg
    ]);
  }
messages par un nouveau tableau qui contient un message en plus.Poursuivez en ajoutant la fonction suivante :
function sendMessage(e) {
    e.preventDefault();
    const msg = {
      username: e.target.username.value,
      text: e.target.text.value
    };
    setNewMessage(msg);
  }
username et un champ text qui contiennent l’identité d’une personne qui poste un message, ainsi que le texte de ce message.setNewMessage permet de réafficher la page à chaque nouveau message.Terminant en plaçant le code suivant qui clos la définition de la fonction :
  return (
      <div className="container">
        <div className="row">
          <div className="col-4">
            <div className="card">
              <div className="card-body">
                <div className="card-title">My first chat</div>
                <hr/>
                <div className="messages">
                  {messages.map(msg => {
                    return (
                        <div key>{msg.username}: {msg.text}</div>
                    )
                  })}
                </div>
              </div>
              <form onSubmit={e => sendMessage(e)}>
                <div className="card-footer">
                  <input id="username"
                         type="text"
                         placeholder="Username"
                         className="form-control"
                  />
                  <br/>
                  <input id="text"
                         type="text"
                         placeholder="Your message"
                         className="form-control"
                  />
                  <br/>
                  <button type="submit"
                          className="btn btn-primary form-control">
                    send
                  </button>
                </div>
              </form>
            </div>
          </div>
        </div>
      </div>
  );
}
export default App;
Dans <APP>, créez un répertoire server.
Dans le répertoire server saisissez la commande npm init -y pour créer votre serveur.
Créez le fichier server/server.js
Modifiez l’entrée “scripts” du fichier server/package.json comme suit :
"scripts": {
    "start": "nodemon server.js"
  },Ajoutez les packages express et socket.io :
npm i express socket.ioVous pouvez maintenant recopier le code suivant dans server/server.js :
const express = require('express');
const socket = require('socket.io');
const app = express();
const PORT = 8000;
const server = app.listen(PORT, () => {
    console.log('server is running on port ' + PORT)
});
const io = socket(server);
io.on('connection', socket => {
    console.log("socket=",socket.id);
});
Socket qui interagit avec votre navigateur. (voir la documentation ici)connection est détecté et la fonction anonyme associée est déclenchée.Lancez maintenant le serveur :
npm start
A chaque fois qu’un client établit une connection à votre serveur, l’identifiant de connexion s’affiche au niveau du serveur. Pour le moment rien ne s’affiche car le client n’établit pas de connexion.
Sur le client, ajoutez le package socket.io-client :
npm i socket.io-clientImportez le package dans client/App.js :
import io from 'socket.io-client';A la suite de la déclaration de la variable d’état messages, ajoutez la connexion au serveur :
const socket = io('localhost:8000');
Ajoutez ensuite le code suivant :
socket.on('SERVER_MSG', msg => {
    setNewMessage(msg);
});
socket intercepte un évènement SERVER_MSG, il déclenche la fonction anonyme associée.Modifiez comme suit la fonction sendMessage :
function sendMessage(e) {
    e.preventDefault();
    const msg = {
        username: e.target.username.value,
        text: e.target.text.value
    };
    socket.emit('CLIENT_MSG', msg);
    setNewMessage(msg);
}
socket.emit('CLIENT_MSG', msg); qui permet d’envoyer un message sur le port 8000 à l’aide de la méthode emit. Cette méthode génère un évènement CLIENT_MSG, qu’il revient au serveur d’intercepter.http://localhost:3000/.Modifiez le serveur comme suit :
io.on('connection', socket => {
    console.log("socket=",socket.id);
    socket.on('CLIENT_MSG', data => {
        console.log("msg=",data);
        io.emit('SERVER_MSG', data);
    })
});
CLIENT_MSG émis sur le port 8000 et renvoie les données reçues de cette manière en émettant un évènement SERVER_MSG qui renvoie les mêmes données.SERVER_MSG intercepte les messages.