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.io
Vous 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-client
Importez 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.