Node.js Networking

Networking is a core aspect of many applications, allowing different systems to communicate with each other over a network. Node.js, being a server-side platform built on Chrome's V8 JavaScript engine, is well-suited for building scalable network applications. This chapter will cover the fundamentals of networking in Node.js, progressing to more advanced topics with detailed examples and explanations.

Overview of Networking in Node.js

Networking involves connecting multiple devices to share resources and information. In Node.js, networking is achieved through various built-in modules like http, https, net, and dgram. These modules provide the necessary tools to create servers and clients, handle various protocols, and manage network communication.

Setting Up a Simple HTTP Server

Node.js comes with a built-in http module, making it easy to set up a basic web server.

Example: Basic HTTP Server

				
					const http = require('http');

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello, World!\n');
});

const PORT = 3000;
server.listen(PORT, () => {
    console.log(`Server running at http://localhost:${PORT}/`);
});

				
			

Explanation:

  • require('http'): Imports the HTTP module.
  • http.createServer(): Creates an HTTP server that listens to server ports and gives a response back to the client.
  • req (request) and res (response): Represent the incoming request and outgoing response.
  • res.statusCode: Sets the HTTP status code.
  • res.setHeader(): Sets the content type header.
  • res.end(): Sends the response and signals that the response is complete.
  • server.listen(PORT, callback): Binds the server to a network port.

Output:

When you run this script and visit http://localhost:3000/ in your browser, you will see “Hello, World!”.

Understanding TCP and UDP

TCP (Transmission Control Protocol)

TCP is a connection-oriented protocol that ensures reliable and ordered delivery of data. It establishes a connection before transmitting data and guarantees that packets arrive in order and without errors.

UDP (User Datagram Protocol)

UDP is a connectionless protocol that is faster but less reliable than TCP. It sends messages, called datagrams, without establishing a connection and does not guarantee the order or delivery of packets.

Creating TCP Servers and Clients

Example: TCP Server

				
					const net = require('net');

const server = net.createServer((socket) => {
    socket.write('Echo server\r\n');
    socket.pipe(socket);
});

server.listen(1337, '127.0.0.1', () => {
    console.log('TCP server running on port 1337');
});

				
			

Example: TCP Client

				
					const net = require('net');

const client = new net.Socket();
client.connect(1337, '127.0.0.1', () => {
    console.log('Connected to TCP server');
    client.write('Hello, server!\r\n');
});

client.on('data', (data) => {
    console.log('Received: ' + data);
    client.destroy(); // Kill client after server's response
});

client.on('close', () => {
    console.log('Connection closed');
});

				
			

Explanation:

  • net.createServer(callback): Creates a TCP server.
  • socket.write(data): Sends data to the client.
  • socket.pipe(socket): Pipes the data received back to the client, effectively echoing it.
  • server.listen(port, host, callback): Binds the server to the specified port and host.

Output:

  • Running the server script starts a TCP server on port 1337.
  • Running the client script connects to the server, sends a message, and logs the echoed response.

Using the net Module

The net module provides an asynchronous network API for creating stream-based TCP or IPC servers and clients.

Example: Echo Server Using net Module

				
					const net = require('net');

const server = net.createServer((socket) => {
    console.log('Client connected');
    socket.on('end', () => {
        console.log('Client disconnected');
    });
    socket.write('Welcome to the echo server!\r\n');
    socket.pipe(socket);
});

server.listen(8124, () => {
    console.log('Server listening on port 8124');
});

				
			

Explanation:

  • net.createServer(): Creates a TCP server.
  • socket.on('end', callback): Listens for the end of the connection.
  • socket.write(data): Sends data to the client.
  • socket.pipe(socket): Echoes data received back to the client.

Working with the dgram Module for UDP

The dgram module provides an implementation of UDP datagram sockets.

Example: UDP Server

				
					const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
    console.log(`Server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
    server.send(msg, 0, msg.length, rinfo.port, rinfo.address);
});

server.bind(41234, () => {
    console.log('UDP server listening on port 41234');
});

				
			

Example: UDP Client

				
					const dgram = require('dgram');
const message = Buffer.from('Hello UDP server');
const client = dgram.createSocket('udp4');

client.send(message, 0, message.length, 41234, 'localhost', (err) => {
    if (err) {
        console.error(err);
    }
    client.close();
});

				
			

Explanation:

  • dgram.createSocket(type): Creates a UDP socket.
  • server.on('message', callback): Listens for messages from clients.
  • server.send(msg, offset, length, port, address): Sends a message to the specified client.

Output:

  • Running the server script starts a UDP server on port 41234.
  • Running the client script sends a message to the server, which echoes it back.

Building WebSocket Servers and Clients

WebSockets are designed to be implemented in web browsers and web servers, but they can be used by any client or server application. Unlike HTTP, WebSockets provide a persistent connection that allows for low-latency communication between the client and server.

Key Features of WebSockets:

  • Full-duplex communication: Allows simultaneous two-way communication.
  • Low latency: Reduces the overhead of establishing new connections, providing real-time interaction.
  • Persistent connection: Once established, the connection remains open until either the client or server decides to close it

Setting Up

First, you need to install the ws module, which is a simple WebSocket library for Node.js:

				
					npm install ws

				
			

WebSocket Server

Let’s start by creating a WebSocket server.

File: server.js

				
					const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('connection', (ws) => {
    console.log('New client connected');

    // Send a welcome message to the new client
    ws.send('Welcome to the WebSocket server');

    // Handle incoming messages from the client
    ws.on('message', (message) => {
        console.log('Received:', message);
        // Echo the message back to the client
        ws.send(`You said: ${message}`);
    });

    // Handle client disconnection
    ws.on('close', () => {
        console.log('Client disconnected');
    });
});

console.log('WebSocket server running on port 8080');

				
			

Explanation:

  • WebSocket.Server: Creates a new WebSocket server that listens on the specified port.
  • server.on('connection'): Listens for new client connections. When a new client connects, it triggers the callback function.
  • ws.send(message): Sends a message to the connected client.
  • ws.on('message'): Listens for incoming messages from the client.
  • ws.on('close'): Listens for the disconnection of a client.

Output:

Running the server script starts a WebSocket server on port 8080. When a client connects, the server sends a welcome message. The server also echoes back any messages received from the client.

WebSocket Client

Next, let’s create a WebSocket client that connects to our server.

File: client.js

				
					const WebSocket = require('ws');

const client = new WebSocket('ws://localhost:8080');

client.on('open', () => {
    console.log('Connected to WebSocket server');
    // Send a message to the server
    client.send('Hello from the client');
});

client.on('message', (message) => {
    console.log('Received from server:', message);
});

client.on('close', () => {
    console.log('Disconnected from server');
});

				
			

Explanation:

  • new WebSocket(url): Creates a new WebSocket client that connects to the specified server URL.
  • client.on('open'): Listens for the connection open event. When the client successfully connects to the server, it triggers the callback function.
  • client.send(message): Sends a message to the server.
  • client.on('message'): Listens for messages from the server.
  • client.on('close'): Listens for the disconnection event.

Output:

Running the client script connects to the WebSocket server and sends a message. The client logs any messages received from the server and notifies when it disconnects.

Running the Example

To run the example, open two terminal windows. In the first terminal, start the WebSocket server:

				
					node server.js

				
			

In the second terminal, start the WebSocket client:

				
					node client.js

				
			

Expected Output:

				
					// Server Terminal
WebSocket server running on port 8080
New client connected
Received: Hello from the client
Client disconnected

				
			
				
					// Client Terminal:
Connected to WebSocket server
Received from server: Welcome to the WebSocket server
Received from server: You said: Hello from the client
Disconnected from server

				
			

Enhancing the WebSocket Server

For more complex applications, you might want to handle different types of messages and manage multiple clients more effectively. Here’s an enhanced version of the WebSocket server that broadcasts messages to all connected clients.

File: enhanced_server.js

				
					const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

const clients = new Set();

server.on('connection', (ws) => {
    console.log('New client connected');
    clients.add(ws);

    ws.on('message', (message) => {
        console.log('Received:', message);
        // Broadcast the message to all connected clients
        for (const client of clients) {
            if (client !== ws && client.readyState === WebSocket.OPEN) {
                client.send(`Broadcast: ${message}`);
            }
        }
    });

    ws.on('close', () => {
        console.log('Client disconnected');
        clients.delete(ws);
    });
});

console.log('Enhanced WebSocket server running on port 8080');

				
			

Explanation:

  • const clients = new Set(): A Set to keep track of all connected clients.
  • clients.add(ws): Adds a new client to the Set when they connect.
  • for (const client of clients): Iterates over all connected clients to broadcast messages.
  • clients.delete(ws): Removes a client from the Set when they disconnect.

Output:

Running this enhanced server allows for broadcasting messages to all connected clients, providing a more dynamic and interactive communication environment.

Handling HTTPS and Secure Communication

For secure communication, you can use the https module, which is similar to the http module but adds security through SSL/TLS.

Example: HTTPS Server

First, generate SSL certificates:

				
					openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out csr.pem
openssl x509 -req -in csr.pem -signkey key.pem -out cert.pem

				
			
				
					const https = require('https');
const fs = require('fs');

const options = {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem')
};

const server = https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end('Hello, Secure World!\n');
});

server.listen(8443, () => {
    console.log('HTTPS server running on port 8443');
});

				
			

Explanation:

  • https.createServer(options, callback): Creates an HTTPS server.
  • fs.readFileSync(): Reads the SSL certificate and key files.
  • res.writeHead(statusCode): Sets the HTTP status code for the response.
  • res.end(data): Sends

    the response data and signals that the response is complete.

Output:

When you run this script and visit https://localhost:8443/ in your browser, you will see “Hello, Secure World!” after accepting the self-signed certificate.

Advanced Networking Topics

In this section, we delve deeper into advanced networking concepts and tools provided by Node.js, including clustering, load balancing, and handling network errors.

Clustering and Load Balancing

Node.js runs in a single-threaded environment. However, with the cluster module, you can create child processes (workers) that share the same server port to utilize multi-core systems efficiently.

Example: Clustering with cluster Module

				
					const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    console.log(`Master ${process.pid} is running`);

    // Fork workers
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died`);
    });
} else {
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('Hello, Clustered World!\n');
    }).listen(8000);

    console.log(`Worker ${process.pid} started`);
}

				
			

Explanation:

  • cluster.isMaster: Checks if the current process is the master process.
  • cluster.fork(): Forks a new worker process.
  • cluster.on('exit', callback): Listens for worker exit events.

Output:

Running this script starts multiple worker processes (equal to the number of CPU cores) that share the same server port.

Handling Network Errors

Network errors are inevitable, and handling them gracefully is crucial for building robust applications.

Example: Handling Errors in an HTTP Server

				
					const http = require('http');

const server = http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello, Error Handling!\n');
});

server.on('error', (err) => {
    console.error('Server error:', err);
});

server.listen(3000, () => {
    console.log('Server running at http://localhost:3000/');
});

				
			

Explanation:

  • server.on('error', callback): Listens for error events on the server and logs them.

Output:

Running this script starts an HTTP server that logs any errors that occur.

Using Socket.io for Real-Time Applications

Socket.io is a library that enables real-time, bidirectional, and event-based communication between web clients and servers.

Example: Real-Time Chat Application Using Socket.io

First, install the necessary modules:

npm install socket.io express

Server-Side Code

				
					const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});

io.on('connection', (socket) => {
    console.log('A user connected');
    socket.on('chat message', (msg) => {
        io.emit('chat message', msg);
    });
    socket.on('disconnect', () => {
        console.log('User disconnected');
    });
});

server.listen(3000, () => {
    console.log('Socket.io server running at http://localhost:3000/');
});

				
			

Client-Side Code (index.html)

				
					<!doctype html>
<html>
<head>
    <title>Chat</title><style>ul { list-style-type: none; margin: 0; padding: 0; }
        li { padding: 8px; margin-bottom: 10px; background-color: #f9f9f9; }
        input { padding: 10px; width: 300px; }</style></head>
<body>
    <ul id="messages"></ul>
    <form id="form" action="">
        <input id="input" autocomplete="off" /><button>Send</button>
    </form> <script type="litespeed/javascript" data-src="/socket.io/socket.io.js"></script> <script type="litespeed/javascript">const socket=io();const form=document.getElementById('form');const input=document.getElementById('input');form.addEventListener('submit',(e)=>{e.preventDefault();if(input.value){socket.emit('chat message',input.value);input.value=''}});socket.on('chat message',(msg)=>{const item=document.createElement('li');item.textContent=msg;document.getElementById('messages').appendChild(item)})</script> <script data-no-optimize="1">!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function i(t){return e({},it,t)}function o(t,e){var n,a="LazyLoad::Initialized",i=new t(e);try{n=new CustomEvent(a,{detail:{instance:i}})}catch(t){(n=document.createEvent("CustomEvent")).initCustomEvent(a,!1,!1,{instance:i})}window.dispatchEvent(n)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,bt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,bt,e)}function r(t){return s(t,null),0}function u(t){return null===c(t)}function d(t){return c(t)===vt}function f(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function _(t,e){nt?t.classList.add(e):t.className+=(t.className?" ":"")+e}function v(t,e){nt?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function b(t,e){!e||(e=e._observer)&&e.unobserve(t)}function p(t,e){t&&(t.loadingCount+=e)}function h(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function m(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function E(t){return!!t[st]}function I(t){return t[st]}function y(t){return delete t[st]}function A(e,t){var n;E(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[st]=n)}function k(a,t){var i;E(a)&&(i=I(a),t.forEach(function(t){var e,n;e=a,(t=i[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function L(t,e,n){_(t,e.class_loading),s(t,ut),n&&(p(n,1),f(e.callback_loading,t,n))}function w(t,e,n){n&&t.setAttribute(e,n)}function x(t,e){w(t,ct,l(t,e.data_sizes)),w(t,rt,l(t,e.data_srcset)),w(t,ot,l(t,e.data_src))}function O(t,e,n){var a=l(t,e.data_bg_multi),i=l(t,e.data_bg_multi_hidpi);(a=at&&i?i:a)&&(t.style.backgroundImage=a,n=n,_(t=t,(e=e).class_applied),s(t,ft),n&&(e.unobserve_completed&&b(t,e),f(e.callback_applied,t,n)))}function N(t,e){!e||0<e.loadingCount||0<e.toLoadCount||f(t.callback_finish,e)}function C(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function M(t){return!!t.llEvLisnrs}function z(t){if(M(t)){var e,n,a=t.llEvLisnrs;for(e in a){var i=a[e];n=e,i=i,t.removeEventListener(n,i)}delete t.llEvLisnrs}}function R(t,e,n){var a;delete t.llTempImage,p(n,-1),(a=n)&&--a.toLoadCount,v(t,e.class_loading),e.unobserve_completed&&b(t,n)}function T(o,r,c){var l=g(o)||o;M(l)||function(t,e,n){M(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";C(t,a,e),C(t,"error",n)}(l,function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_loaded),s(e,dt),f(n.callback_loaded,e,a),i||N(n,a),z(l)},function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_error),s(e,_t),f(n.callback_error,e,a),i||N(n,a),z(l)})}function G(t,e,n){var a,i,o,r,c;t.llTempImage=document.createElement("IMG"),T(t,e,n),E(c=t)||(c[st]={backgroundImage:c.style.backgroundImage}),o=n,r=l(a=t,(i=e).data_bg),c=l(a,i.data_bg_hidpi),(r=at&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),L(a,i,o)),O(t,e,n)}function D(t,e,n){var a;T(t,e,n),a=e,e=n,(t=It[(n=t).tagName])&&(t(n,a),L(n,a,e))}function V(t,e,n){var a;a=t,(-1<yt.indexOf(a.tagName)?D:G)(t,e,n)}function F(t,e,n){var a;t.setAttribute("loading","lazy"),T(t,e,n),a=e,(e=It[(n=t).tagName])&&e(n,a),s(t,vt)}function j(t){t.removeAttribute(ot),t.removeAttribute(rt),t.removeAttribute(ct)}function P(t){m(t,function(t){k(t,Et)}),k(t,Et)}function S(t){var e;(e=At[t.tagName])?e(t):E(e=t)&&(t=I(e),e.style.backgroundImage=t.backgroundImage)}function U(t,e){var n;S(t),n=e,u(e=t)||d(e)||(v(e,n.class_entered),v(e,n.class_exited),v(e,n.class_applied),v(e,n.class_loading),v(e,n.class_loaded),v(e,n.class_error)),r(t),y(t)}function $(t,e,n,a){var i;n.cancel_on_exit&&(c(t)!==ut||"IMG"===t.tagName&&(z(t),m(i=t,function(t){j(t)}),j(i),P(t),v(t,n.class_loading),p(a,-1),r(t),f(n.callback_cancel,t,e,a)))}function q(t,e,n,a){var i,o,r=(o=t,0<=pt.indexOf(c(o)));s(t,"entered"),_(t,n.class_entered),v(t,n.class_exited),i=t,o=a,n.unobserve_entered&&b(i,o),f(n.callback_enter,t,e,a),r||V(t,n,a)}function H(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function B(t,i,o){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?q(t.target,t,i,o):(e=t.target,n=t,a=i,t=o,void(u(e)||(_(e,a.class_exited),$(e,n,a,t),f(a.callback_exit,e,n,t))));var e,n,a})}function J(e,n){var t;et&&!H(e)&&(n._observer=new IntersectionObserver(function(t){B(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function K(t){return Array.prototype.slice.call(t)}function Q(t){return t.container.querySelectorAll(t.elements_selector)}function W(t){return c(t)===_t}function X(t,e){return e=t||Q(e),K(e).filter(u)}function Y(e,t){var n;(n=Q(e),K(n).filter(W)).forEach(function(t){v(t,e.class_error),r(t)}),t.update()}function t(t,e){var n,a,t=i(t);this._settings=t,this.loadingCount=0,J(t,this),n=t,a=this,Z&&window.addEventListener("online",function(){Y(n,a)}),this.update(e)}var Z="undefined"!=typeof window,tt=Z&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),et=Z&&"IntersectionObserver"in window,nt=Z&&"classList"in document.createElement("p"),at=Z&&1<window.devicePixelRatio,it={elements_selector:".lazy",container:tt||Z?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",rt="srcset",ct="sizes",lt="poster",st="llOriginalAttrs",ut="loading",dt="loaded",ft="applied",_t="error",vt="native",gt="data-",bt="ll-status",pt=[ut,dt,ft,_t],ht=[ot],mt=[ot,lt],Et=[ot,rt,ct],It={IMG:function(t,e){m(t,function(t){A(t,Et),x(t,e)}),A(t,Et),x(t,e)},IFRAME:function(t,e){A(t,ht),w(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){A(t,ht),w(t,ot,l(t,e.data_src))}),A(t,mt),w(t,lt,l(t,e.data_poster)),w(t,ot,l(t,e.data_src)),t.load()}},yt=["IMG","IFRAME","VIDEO"],At={IMG:P,IFRAME:function(t){k(t,ht)},VIDEO:function(t){a(t,function(t){k(t,ht)}),k(t,mt),t.load()}},kt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,i=this._settings,o=X(t,i);{if(h(this,o.length),!tt&&et)return H(i)?(e=i,n=this,o.forEach(function(t){-1!==kt.indexOf(t.tagName)&&F(t,e,n)}),void h(n,0)):(t=this._observer,i=o,t.disconnect(),a=t,void i.forEach(function(t){a.observe(t)}));this.loadAll(o)}},destroy:function(){this._observer&&this._observer.disconnect(),Q(this._settings).forEach(function(t){y(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;X(t,n).forEach(function(t){b(t,e),V(t,n,e)})},restoreAll:function(){var e=this._settings;Q(e).forEach(function(t){U(t,e)})}},t.load=function(t,e){e=i(e);V(t,e)},t.resetStatus=function(t){r(t)},Z&&function(t,e){if(e)if(e.length)for(var n,a=0;n=e[a];a+=1)o(t,n);else o(t,e)}(t,window.lazyLoadOptions),t});!function(e,t){"use strict";function a(){t.body.classList.add("litespeed_lazyloaded")}function n(){console.log("[LiteSpeed] Start Lazy Load Images"),d=new LazyLoad({elements_selector:"[data-lazyloaded]",callback_finish:a}),o=function(){d.update()},e.MutationObserver&&new MutationObserver(o).observe(t.documentElement,{childList:!0,subtree:!0,attributes:!0})}var d,o;e.addEventListener?e.addEventListener("load",n,!1):e.attachEvent("onload",n)}(window,document);</script><script data-no-optimize="1">var litespeed_vary=document.cookie.replace(/(?:(?:^|.*;\s*)_lscache_vary\s*\=\s*([^;]*).*$)|^.*$/,"");litespeed_vary||fetch("/wp-content/plugins/litespeed-cache/guest.vary.php",{method:"POST",cache:"no-cache",redirect:"follow"}).then(e=>e.json()).then(e=>{console.log(e),e.hasOwnProperty("reload")&&"yes"==e.reload&&(sessionStorage.setItem("litespeed_docref",document.referrer),window.location.reload(!0))});</script><script data-optimized="1" type="litespeed/javascript" data-src="https://diginode.in/wp-content/litespeed/js/097f261601025361dc475e1c9b4cfeeb.js?ver=7a317"></script><script>const litespeed_ui_events=["mouseover","click","keydown","wheel","touchmove","touchstart"];var urlCreator=window.URL||window.webkitURL;function litespeed_load_delayed_js_force(){console.log("[LiteSpeed] Start Load JS Delayed"),litespeed_ui_events.forEach(e=>{window.removeEventListener(e,litespeed_load_delayed_js_force,{passive:!0})}),document.querySelectorAll("iframe[data-litespeed-src]").forEach(e=>{e.setAttribute("src",e.getAttribute("data-litespeed-src"))}),"loading"==document.readyState?window.addEventListener("DOMContentLoaded",litespeed_load_delayed_js):litespeed_load_delayed_js()}litespeed_ui_events.forEach(e=>{window.addEventListener(e,litespeed_load_delayed_js_force,{passive:!0})});async function litespeed_load_delayed_js(){let t=[];for(var d in document.querySelectorAll('script[type="litespeed/javascript"]').forEach(e=>{t.push(e)}),t)await new Promise(e=>litespeed_load_one(t[d],e));document.dispatchEvent(new Event("DOMContentLiteSpeedLoaded")),window.dispatchEvent(new Event("DOMContentLiteSpeedLoaded"))}function litespeed_load_one(t,e){console.log("[LiteSpeed] Load ",t);var d=document.createElement("script");d.addEventListener("load",e),d.addEventListener("error",e),t.getAttributeNames().forEach(e=>{"type"!=e&&d.setAttribute("data-src"==e?"src":e,t.getAttribute(e))});let a=!(d.type="text/javascript");!d.src&&t.textContent&&(d.src=litespeed_inline2src(t.textContent),a=!0),t.after(d),t.remove(),a&&e()}function litespeed_inline2src(t){try{var d=urlCreator.createObjectURL(new Blob([t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1"))}return d}</script></body>
</html>

				
			

Explanation:

  • express(): Creates an Express application.
  • http.createServer(app): Creates an HTTP server with the Express app.
  • socketIo(server): Attaches Socket.io to the HTTP server.
  • io.on('connection', callback): Listens for new client connections.
  • socket.on('chat message', callback): Listens for chat messages from clients.
  • io.emit('chat message', msg): Emits the chat message to all connected clients.

Output:

Running the server script and opening http://localhost:3000/ in a browser allows users to chat in real-time.

Node.js provides powerful networking capabilities through its built-in modules (http, https, net, dgram) and third-party libraries like Socket.io. From setting up simple HTTP servers to creating real-time applications and handling secure communications, Node.js offers a robust and flexible platform for building networked applications. By mastering these concepts and tools, you can create efficient, scalable, and secure network applications with ease.Happy coding !❤️

Table of Contents

Contact here

Copyright © 2025 Diginode

Made with ❤️ in India