NODE HELP

Socket io node.js (How It Works For Developers)

Published September 29, 2024
Share:

Real-time interactivity and dynamic content creation are now prerequisites in the world of modern web development in order to provide compelling user experiences. Instantaneous data sharing is made possible by technologies like Socket.IO, which enables bidirectional, real-time communication between clients and servers. Meanwhile, IronPDF provides powerful features for producing PDF documents of excellent quality from HTML text in a Node.js environment.

When Socket.IO and IronPDF are integrated, developers may construct apps that let users interact in real time and see the effects of their activities right away. Examples of these applications include the ability to generate and download PDF reports, invoices, and other dynamically created documents. This potent combination is best suited for use cases in e-commerce, reporting systems, educational platforms, and other areas where real-time updates and prompt feedback are needed.

In order to show how these technologies may be combined to produce a smooth and engaging user experience, we will look at how to put up a Node.js application that uses Socket.IO for real-time socket communication and IronPDF for PDF generation.

What is Socket.IO Node.js JS?

Real-time, bidirectional, and event-based communication between clients and servers is made possible by the robust client javascript library of Socket.IO. Constructed as an extension of WebSockets, it offers supplementary functionalities and fallback choices to guarantee dependable communication in diverse settings. For creating dynamic online applications that need to share data instantly, such as chat programs, teamwork tools, real-time updates, and gaming platforms, the Socket.IO javascript client library is a great option.

Socket io node.js (How It Works For Developers): Figure 1 - Socket.IO: Bidirectional and low-latency commination for every platform.

Advantages of Socket IO

Real-Time Communication

Allows the HTTP server, the client, the IO app, and the IO server, to communicate in both directions instantly. It is perfect for applications that need real-time data updates since it guarantees low-latency message delivery.

Event-Driven Architecture

Enables developers to build and manage bespoke events with ease thanks to the use of an event-based paradigm. reduces the complexity of managing intricate client-server interactions.

Cross-Browser Compatibility

Functions flawlessly across various systems and browsers. offers fallback choices (such as extended polling) in situations when WebSockets are not supported.

Scalability

Supports the connection of several adapters, including Redis, for horizontal connection scaling, enabling the application to connect and manage many connected clients at once. Because of its efficient resource utilization design, it can be used in high-traffic applications.

Automatic Reconnection

Resilience and dependability by automatically attempting to successfully connect again and reconnect forever rejoin in the event that a connection is lost. Reconnection logic that can be configured to regulate the frequency and nature of reconnection attempts.

Room Support

Makes it possible to organize sockets connected to clients into "rooms" so that messages may be broadcast to a socket object a particular client or socket client subsets more easily. Dynamically entering and exiting rooms is supported, which makes it helpful for gaming, chat apps, and other languages and teamwork tools.

Middleware

Permits the processing of events, event data emitting events, and messages by middleware functions prior to their receipt by handlers. beneficial for jobs like data validation chat messages, chat message logging, and authentication.

Security

supports a number of security features, including authorization, authentication, and CORS (Cross-Origin Resource Sharing) settings. Integrates with HTTPS and other security protocols to guarantee secure communication pathways.

Debugging and Logging

Integrated debugging and logging capabilities facilitate problem diagnosis following code, and behavior monitoring of the program. Adjustable logging levels allow you to manage the console log output's level of detail.

Create and config Socket.io

The Socket.IO library allows clients and servers to communicate in real time, both ways and based on events. Here's a step-by-step tutorial on configuring a Socket.IO client in a Node.js program.

Install Required Packages

Use npm to install socket.io and express package:

npm install express
npm install socket.io
npm install express
npm install socket.io
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'npm install express npm install socket.io
VB   C#

Create the Server

Establish the foundational Express WebSocket server with Socket.IO integration by creating a file called server.js.

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);
// Serve static files from the "public" directory
app.use(express.static('public'));
// Handle socket connection
io.on('connection', (socket) => {
    console.log('a user connected');
    // Handle custom event from client
    socket.on('message', (msg) => {
        console.log('message received: ' + msg);
        // Broadcast the message to all clients
        io.emit('message', msg);
    });
    // Handle disconnection
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
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);
// Serve static files from the "public" directory
app.use(express.static('public'));
// Handle socket connection
io.on('connection', (socket) => {
    console.log('a user connected');
    // Handle custom event from client
    socket.on('message', (msg) => {
        console.log('message received: ' + msg);
        // Broadcast the message to all clients
        io.emit('message', msg);
    });
    // Handle disconnection
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
Private const express = require( 'express');
Private const http = require( 'http');
Private const socketIo = require( 'socket.io');
Private const app = express()
Private const server = http.createServer(app)
Private const io = socketIo(server)
' Serve static files from the "public" directory
app.use(express.static( 'public'));
' Handle socket connection
io.on( 'connection', (socket) =>
If True Then
	console.log( 'a user connected');
	socket.on( 'message', (msg) =>
	If True Then
		console.log( 'message received: ' + msg);
		io.emit( 'message', msg);
	End If
	)
	socket.on( 'disconnect', () =>
	If True Then
		console.log( 'user disconnected');
	End If
	)
End If
)
const PORT = process.env.PORT OrElse 3000
server.listen(PORT, Sub()
	console.log(`TypeOf Server Is running on port ${PORT}`)
End Sub)
VB   C#

Socket io node.js (How It Works For Developers): Figure 2 - Console output displaying that the Server is running on port 3000, a user connected and the message received is Hello Hi.

Create the Client

To act as the client, create a directory called public and a file called index.html inside of it.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Socket.IO Demo</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <h1>Socket.IO Demo</h1>
    <button onclick="sendMessage()">Send</button>
    <ul id="messages"></ul>
    <script>
        const socket = io();
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
        // Function to send a message to the server
        function sendMessage() {
            const msg = document.getElementById('messageInput').value;
            socket.emit('message', msg);
            document.getElementById('messageInput').value = '';
        }
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Socket.IO Demo</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <h1>Socket.IO Demo</h1>
    <button onclick="sendMessage()">Send</button>
    <ul id="messages"></ul>
    <script>
        const socket = io();
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
        // Function to send a message to the server
        function sendMessage() {
            const msg = document.getElementById('messageInput').value;
            socket.emit('message', msg);
            document.getElementById('messageInput').value = '';
        }
    </script>
</body>
</html>
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id="messages"></ul> <script> const socket = io();
"messages"></ul> (Of script) const socket = io()
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id="messages"></ul> <script> const socket
"sendMessage()"> Send</button> <ul id="messages"></ul> (Of script) const socket
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id
"/socket.io/socket.io.js"></script> </head> (Of body) (Of h1) Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick
"width=device-width, initial-scale=1.0"> (Of title) Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> (Of body) (Of h1) Socket.IO Demo</h1> <button onclick
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src
"viewport" content="width=device-width, initial-scale=1.0"> (Of title) Socket.IO Demo</title> <script src
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content
"UTF-8"> <meta name="viewport" content
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name
"en"> (Of head) <meta charset="UTF-8"> <meta name
Private Private Private Private Private Private Private Private <(Not DOCTYPE) html> <html lang="en"> (Of head) <meta charset
		' Listen for messages from the server
		socket.on( 'message', (msg) =>
		If True Then
			const li = document.createElement( 'li');
			li.textContent = msg
			document.getElementById( 'messages').appendChild(li);
		End If
		)
		' Function to send a message to the server
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		@function sendMessage()
'		{
'			const msg = document.getElementById('messageInput').value;
'			socket.emit('message', msg);
''INSTANT VB TODO TASK: The following line uses invalid syntax:
''			document.getElementById('messageInput').value = ''; } </script> </body> </html>
VB   C#

Socket io node.js (How It Works For Developers): Figure 3 - Output: Socket.IO demo web page, with a textbox for message and a Send Button. The two messages sent to the server is also displayed: "Hello" "Hi".

Getting Started with IronPDF

We may construct interactive web apps that can generate and serve PDFs quickly by combining IronPDF for dynamic PDF generation with Socket.IO to enable real-time in-time socket communication. You will learn how to set up a Node.js project that incorporates IronPDF and Socket.IO by following this guide.

What is IronPDF?

Use the robust IronPDF Node.js library to create, modify, and convert PDF files. It enables programmers to deal with existing PDFs, convert HTML to PDFs, and carry out a number of programming-based tasks connected to PDFs. IronPDF offers a flexible and intuitive way to create high-quality PDF documents, making it a good choice for applications that require dynamic PDF generation and processing.

Socket io node.js (How It Works For Developers): Figure 4 - IronPDF for Node.js: The Node.js PDF Library

Key features of IronPDF

Some of the key features of IronPDF are as follows:

1. Convert HTML to PDF

We can convert the contents of your HTML files into PDF documents by using IronPDF. With this, web content may be turned into aesthetically beautiful PDF publications using the latest versions of HTML5, CSS3, and JavaScript.

2. Making and Editing PDFs

Text, images, tables, and other material can be added to newly generated programmatic PDF documents. IronPDF allows you to open and edit existing PDF documents. You can add to or modify the content of the PDF, as well as remove specific sections.

3. Sophisticated Layout and Styling

Use CSS to style the user's browser when viewing PDFs. This includes support for complex layouts, fonts, colors, and other design elements. Using JavaScript to render HTML content enables your browser to add dynamic content to PDFs.

IronPDF Installation

Install the required IronPDF package in Node.js by using the node package manager to enable IronPDF functionality. Add the following command:

npm install @ironsoftware/ironpdf
npm install @ironsoftware/ironpdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'npm install @ironsoftware/ironpdf
VB   C#

Client Code

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
  <title>WebSocket Client</title>
</head>
<body>
  <button onclick="sendMessage()">Send</button>
  <script>
            const socket = io('http://localhost:3000');
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
    function sendMessage() {
      const ITitle = document.getElementById('Title');
      const IContent = document.getElementById('content');
      const message = {
        Title:ITitle.value,
        content:IContent.value
      };
      //ws.send(message);
      socket.emit('message', message);
      ITitle.value = '';
      IContent.value = '';
    }
  </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
  <title>WebSocket Client</title>
</head>
<body>
  <button onclick="sendMessage()">Send</button>
  <script>
            const socket = io('http://localhost:3000');
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
    function sendMessage() {
      const ITitle = document.getElementById('Title');
      const IContent = document.getElementById('content');
      const message = {
        Title:ITitle.value,
        content:IContent.value
      };
      //ws.send(message);
      socket.emit('message', message);
      ITitle.value = '';
      IContent.value = '';
    }
  </script>
</body>
</html>
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script> <title> WebSocket Client</title> </head> <body> <button onclick="sendMessage()"> Send</button> <script> const socket = io('http: socket.on('message', (msg) => { const li = document.createElement('li'); li.textContent = msg; document.getElementById('messages').appendChild(li); }); @function sendMessage() { const ITitle = document.getElementById('Title'); const IContent = document.getElementById('content'); const message = { Title:ITitle.value, content:IContent.value }; socket.emit('message', message); ITitle.value = ''; IContent.value = ''; } </script> </body> </html>
VB   C#

Socket io node.js (How It Works For Developers): Figure 5 - Enter the text for Data and Title and click on Send button to the send the message to the server.

Send a message and Generate PDF using IronPDF

Let's take a closer look at the code to see how Socket.IO and IronPDF are used to create PDFs instantaneously in a Node.js application.

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const IronPdf = require("@ironsoftware/ironpdf");
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
const document=IronPdf.PdfDocument;
app.use(express.static('public'));
io.on('connection', (socket) => {
    console.log('a user connected');
    socket.on('generatePDF', async (data) => {
        try {
            const pdfPath = await generatePDF(data);
            socket.emit('pdfGenerated', { pdfUrl: pdfPath });
        } catch (error) {
            socket.emit('error', error.message);
        }
    });
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const generatePDF = async (data) => {
    console.log('pdf generated started');
    const htmlContent = `<h1>${data.title}${data.content}</h1>`;
    console.log(`Received message into HTML content: ${htmlContent}`);
    const pdf = await document.fromHtml(htmlContent);
    const filePath = `./public/pdfs/${Date.now()}.pdf`;
    await pdf.saveAs(filePath);
    console.log('pdf generated completed');
    return filePath.replace('./public', '');
};
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const IronPdf = require("@ironsoftware/ironpdf");
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
const document=IronPdf.PdfDocument;
app.use(express.static('public'));
io.on('connection', (socket) => {
    console.log('a user connected');
    socket.on('generatePDF', async (data) => {
        try {
            const pdfPath = await generatePDF(data);
            socket.emit('pdfGenerated', { pdfUrl: pdfPath });
        } catch (error) {
            socket.emit('error', error.message);
        }
    });
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const generatePDF = async (data) => {
    console.log('pdf generated started');
    const htmlContent = `<h1>${data.title}${data.content}</h1>`;
    console.log(`Received message into HTML content: ${htmlContent}`);
    const pdf = await document.fromHtml(htmlContent);
    const filePath = `./public/pdfs/${Date.now()}.pdf`;
    await pdf.saveAs(filePath);
    console.log('pdf generated completed');
    return filePath.replace('./public', '');
};
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
Private const express = require( 'express');
Private const http = require( 'http');
Private const socketIo = require( 'socket.io');
Private const IronPdf = require("@ironsoftware/ironpdf")
Private const app = express()
Private const server = http.createServer(app)
Private const io = socketIo(server)
Private const document=IronPdf.PdfDocument
app.use(express.static( 'public'));
io.on( 'connection', (socket) =>
If True Then
	console.log( 'a user connected');
	socket.on( 'generatePDF', async(data) =>
	If True Then
		Try
			const pdfPath = Await generatePDF(data)
			socket.emit( 'pdfGenerated', { pdfUrl: pdfPath });
		Catch e1 As [error]
			socket.emit( '@error', @error.message);
		End Try
	End If
	)
	socket.on( 'disconnect', () =>
	If True Then
		console.log( 'user disconnected');
	End If
	)
End If
)
'INSTANT VB TODO TASK: Lambda expressions and anonymous methods are not converted by Instant VB if local variables of the outer method are referenced within the anonymous method:
const generatePDF = async(data) =>
If True Then
	console.log( 'pdf generated started');
	const htmlContent = `(Of h1) $
	If True Then
		data.title
	End If
	$
	If True Then
		data.content
	End If
	</h1>`
	console.log(`Received message into HTML content:= ${htmlContent}`)
	const pdf = Await document.fromHtml(htmlContent)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'	const filePath = `./public/pdfs/$
'	{
'		@Date.now()
'	}
	.pdf`
	Await pdf.saveAs(filePath)
	console.log( 'pdf generated completed');
	Return filePath.replace( './public', '');
End If
const PORT = process.env.PORT OrElse 3000
'INSTANT VB TODO TASK: Lambda expressions and anonymous methods are not converted by Instant VB if local variables of the outer method are referenced within the anonymous method:
server.listen(PORT, () =>
VB   C#

The above code incorporates IronPDF for dynamic PDF production and Socket.IO for real-time communication in a Node.js application. The required modules, such as socket.io for real-time communication, ironpdf for PDF production, an HTTP server for generating the client and a call server and the client and a call server and the client and a server-side instance, and express for building the web server, are imported first in the server-side code. Static files are created in a public directory and served by the Express application. Next, the server handles a custom generatePDF event by listening for Socket.IO connections. The server uses IronPDF to create a PDF from HTML content based on the data supplied by the client when this event is received. The PDF is then saved to the file system, and the client side then receives a PDF-generated event back from the server along with the file path of the created PDF.

Socket io node.js (How It Works For Developers): Figure 6 - Console Log

A straightforward form is set up on both the s server and the client side via an HTML file to collect the title and content. Upon submission, the form stops executing the default submission behavior and sends the form data along with the generatePDF event to the server.

Socket io node.js (How It Works For Developers): Figure 7 - Output PDF created using IronPDF.

Additionally, the client shows a download link after listening to the pdf-generated event to obtain the URL of the created PDF. Furthermore, the client keeps an ear out for any error events and, in the event that one happens, shows an alert along with the error message. This integration shows how to use Socket.IO and IronPDF to build a responsive web application that lets users create and receive PDFs in real time.

Conclusion

A strong solution for interactive, real-time PDF production in Node.js applications is to integrate the Socket.IO client with IronPDF. Developers can construct responsive applications that give consumers rapid feedback by utilizing the Socket.IO client's real-time communication capabilities, which can greatly improve both the server and user experience. Combining it with IronPDF allows for the dynamic development of high-quality PDF documents from HTML content. This makes it perfect for applications like content management systems, reporting tools, and invoicing systems that need to generate papers quickly.

This configuration exemplifies how dynamic content creation and real-time communication work together. It demonstrates how cutting-edge web technologies may be used in a seamless way to provide reliable and effective answers to challenging problems. With IronPDF handling PDF generation and Socket.IO handling real-time data transmission, developers can concentrate on creating feature-rich web applications that provide users with noticeable and instantaneous results. This method creates new opportunities for interactive and data-driven application development in addition to enhancing the functionality and usability of online client apps.

By incorporating IronPDF and IronSoftware's products into your development stack, we can ensure that customers and end users receive feature-rich, high-end software solutions. Additionally, this will support the optimization of projects and processes.

IronPDF offers a free trial starting at $749, makes them reliable partners for modern software development projects.

< PREVIOUS
toastify npm (How It Works For Developers)
NEXT >
WebSockets Node.js js (How It Works For Developers)

Ready to get started? Version: 2024.9 just released

Free npm Install View Licenses >