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.

F1ATB André

Ham Radio - Home automation - Photovoltaic