Last Updated : 23 Jul, 2025
Socket.io is a JavaScript library that enables real-time, bidirectional, event-based communication between the client and server. It works on top of WebSocket but provides additional features like automatic reconnection, broadcasting, and fallback options.
What We Are Going to Create?In this article, we will create a real-time chat application using Socket.IO and NodeJS. The application will feature
Building a real-time chat app with Socket.io and NodeJS is an excellent way to learn full-stack development.
ApproachHere's a structured guide to setting up your project:
We will start off by creating a new folder called socket-chat-app. Open your command prompt and navigate to the folder we just created.
Step 1: Create Project Directorymkdir chat-app && cd chat-app npm init -yStep 2: Initialize NodeJS Project
Now, Initialize the node package by typing in the following command in the terminal:
npm init -yStep 3: Install Dependencies
This will create a package.json file for us so that we can install the necessary libraries. Now type in the command:
npm install express socket.ioStep 4: Create Project Files
Now, in the socket-chat-app folder, create two files - index.html and index.js:
touch index.html index.jsProject Structure
Finally, your folder structure should look like this
Folder StructureImplementation: Below is the implementation of the above approach to creating a real-time chat application using socket.io and NodeJs:
<html>
<head>
<title>Chat app using Socket IO and Node JS</title>
<script src="https://cdn.tailwindcss.com/3.4.16"></script>
</head>
<body>
<h1 class="font-bold text-green-500
text-3xl text-center mt-5">
GeeksforGeeks
</h1>
<div>
<h2 class="font-semibold text-xl
text-center mt-5"
id="logo">
Chat App using Socket io
</h2>
</div>
<form class="flex flex-col justify-center
items-center mt-5"
id="form">
<input class="border border-gray-400
rounded-md mt-5 p-1"
type="text"
placeholder="Name"
id="myname">
<input class="border border-gray-400
rounded-md mt-5 p-1"
type="text"
placeholder="Message"
id="message">
<button class="bg-blue-500 rounded-md p-2
text-white mt-5">
Send
</button>
</form>
<div class="flex flex-col justify-center
items-center mt-5"
id="messageArea">
</div>
</body>
<script src="/socket.io/socket.io.js"></script>
<script>
let socket = io();
let form = document.getElementById('form');
let myname = document.getElementById('myname');
let message = document.getElementById('message');
let messageArea = document.getElementById("messageArea");
form.addEventListener("submit", (e) => {
e.preventDefault();
if (message.value) {
socket.emit('send name', myname.value);
socket.emit('send message', message.value);
message.value = "";
}
});
socket.on("send name", (username) => {
let name = document.createElement("p");
name.style.backgroundColor = "grey";
name.style.width = "100%";
name.style.textAlign = "center";
name.style.color = "white";
name.textContent = username + ":";
messageArea.appendChild(name);
});
socket.on("send message", (chat) => {
let chatContent = document.createElement("p");
chatContent.textContent = chat;
messageArea.appendChild(chatContent);
});
</script>
</html>
JavaScript
//index.js
const express = require('express');
const app = express();
const { Server } = require('socket.io');
const http = require('http');
const server = http.createServer(app);
const io = new Server(server);
const port = 5000;
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
socket.on('send name', (username) => {
io.emit('send name', (username));
});
socket.on('send message', (chat) => {
io.emit('send message', (chat));
});
});
server.listen(port, () => {
console.log(`Server is listening at the port: ${port}`);
});
In this code
Steps to run the application: Write the below code in the terminal to run the server
node index.js
Output: Open your browser and open two tabs with the URL: http://localhost:5000 so that we have two clients that can chat with each other. Following is the output of our chat app:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4