Http and Https Server with Node JS and Socket.io
Behind this barbaric title, you will find below an example of a web server under linux with Node JS which allows:
- access in http: port 80
- access in https: port 443
- an express-based web server for simple pages
- permanent and fast access between client and server using socket.io to send a stream of bytes
Node JS Installation
Switch to root:
sudo su
Download version 16 or more recent of Node JS then launch the installation.
curl -sL https://deb.nodesource.com/setup_16.x | bash -
apt-get install -y nodejs
For a first installation to create a project, you need several additional modules to manage web pages and network communications. Create a mkdir…. project folder and do in that folder.
npm install
npm install html
npm install https
npm install express
npm install jquery
npm install socket.io
npm install fs
Generation of a security certificate
Open SSL must be installed on your system. It allows the installation of a self-signed security certificate in order to access your site in https. Run the following command:
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout selfsigned.key -out selfsigned.crt
In the project launch file with node, here MyServer.js, you need the following lines:
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.');
This double server, http and https is simply launched with the command:
node MyServer.js
In a ‘public’ subfolder of the project folder, we put a simple html page with some javascript to send:
- news periodically in the form of text etc.
- 1k byte arrays
The server in return thanks us, by return messages.
<!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>
The purpose of this example is to help create exchanges in the form of permanent data stream between several clients and a web server.
Recent Comments