Serveur Http et Https avec Node JS et Socket.IO

Derrière ce titre compliqué, vous trouverez ci-dessous un exemple d’un serveur web sous linux avec Node JS qui permet :

  • un accès en http: port 80
  • un accès en https: port 443
  • un serveur basé sur express pour des pages simples
  • un accès permanent et rapide entre le client et le serveur à l’aide de socket.io pour envoyer un flux d’octets

Installation Node JS

Passer en root si besoin avec:

sudo su

Téléchargez la version 16 ou une plus récente de Node JS puis lancez l’installation.

curl -sL https://deb.nodesource.com/setup_16.x | bash -
apt-get install -y nodejs

Pour une première installation permettant de créer un projet, il faut plusieurs modules complémentaires pour gérer des pages web et les communications réseau. Créer un dossier projet mkdir…. et faire dans ce dossier .

npm install
npm install html
npm install https
npm install express
npm install jquery
npm install socket.io
npm install fs

Géneration d’un certificat de sécurité

Open SSL doit être installé de base sur votre système. Il permet l’installation d’un certificat de sécurité autosigné afin d’accéder à votre site en https. Lancez la commande suivante:

openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout selfsigned.key -out selfsigned.crt

Dans le fichier de lancement du projet avec node, ici MyServer.js, il faut les lignes suivantes :

const express = require('express');
const app = express();
app.use(express.static(__dirname + '/public/'));
app.use('/jquery', express.static(__dirname + '/node_modules/jquery/dist'));
app.use('/socket.io', express.static(__dirname + '/node_modules/socket.io/client-dist'));

const http = require('http');
const https = require('https');
const net = require('net');
const fs = require('fs');
const Conf = require('./remsdr_modules/configuration.js')
    const {
    Server
} = require("socket.io");
//HTTP Server
const httpserver = http.createServer(app);
const io = new Server(httpserver);
httpserver.listen(80);
//HTTPS Server
const options = {
    key: fs.readFileSync('selfsigned.key'),
    cert: fs.readFileSync('selfsigned.crt')
};
const https_Server = https.createServer(options, app).listen(443);
const ioS = new Server(https_Server);


io.on("connection", (socket) => {
    ServersReceived(socket);
});
ioS.on("connection", (socket) => {
    ServersReceived(socket);
});

function ServersReceived(socket) {
    socket.on("Hello", (arg, callback) => {
        console.log(arg); // "Hello Server"
        callback("Thanks,got it");
    });
    socket.on("News", (data, callback) => {
        console.log(data, data.N);
        callback("Received News from:" + data.U + " at :" + new Date().toLocaleString());
    });
    socket.on("BigData_Bytes", (user, data) => {
        console.log(user, data.length);
    });
}

console.log('Server on port 80 in http and port 443 in https.CTRL+C to quit.');

Ce double serveur, http et https se lance simplement avec la commande:

node MyServer.js

Dans un sous-dossier ‘public’ du dossier projet, on met une page html simple avec un peu de javascript pour envoyer:
– des news périodiquement sous forme de texte etc
– des tableaux de 1k bytes

Le serveur en retour nous remercie, par des messages retour.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Client</title>
<script  src="/jquery/jquery.min.js" ></script>
<script src="/socket.io/socket.io.js"></script>
<script>
</script>
</head>
<body>
<h4>Message from server</h4>
<div id="messageFromServer"></div>
</body>
<script>
//User name.  Random pseudo
var User="";
for (i=0;i<5;i++){
	User +=String.fromCharCode(Math.floor(65+63*Math.random()));
}
socket = io();
socket.on("connect", () => {
  console.log(socket.connected); // true
  $("#messageFromServer").html("Connected to Server")
});
socket.on("disconnect", () => {
  socket.connect();
});
socket.emit("Hello", "Hello Server", (response) => {
  console.log(response); // Thanks,got it
});
function emission(){
	var tableauType = new Uint8Array(1000);
    for (var i = 0; i < 1000; i++) {
        tableauType[i] = i % 250;	
    }
	socket.emit("BigData_Bytes", User,tableauType);
}
setInterval(emission , 500);
function news(){	
	console.log("Client news to Server")
	socket.emit("News", {U:User,N:"The news from a client"}, (response)=>{ 
	    console.log(response); 
		$("#messageFromServer").html(response)
	});
}
setInterval(news , 5000);
</script>
</html>

Le but de cet exemple est d’aider à la réalisation d’échanges sous forme de flux de données permanent entre plusieurs clients et un serveur web.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.