Real-Time Applications in JavaScript with WebSockets

By Maulik Paghdal

19 Dec, 2024

Real-Time Applications in JavaScript with WebSockets

Introduction

WebSockets enable seamless, real-time communication between a client and a server. Unlike traditional HTTP requests, WebSockets keep the connection open, making them perfect for dynamic and real-time applications like chat apps, live updates, and multiplayer games.

In this blog, you’ll learn how to set up WebSockets for real-time communication with detailed steps, code examples, and explanations.

Requirements

Before we begin, ensure you have the following:

  • Node.js installed (version 12 or later recommended).
  • A basic understanding of JavaScript and Node.js.
  • A text editor like VS Code.

Steps for Installation

1. Initialize Your Project

Create a project directory and initialize it with npm.

mkdir websocket-chat-app cd websocket-chat-app npm init -y 

2. Install Dependencies

Install the ws package for WebSocket support.

npm install ws 

Implementation

1. Setting Up the WebSocket Server

File path: server/index.js

const WebSocket = require('ws');  // Create a WebSocket server const server = new WebSocket.Server({ port: 8080 });  server.on('connection', (socket) => {  console.log('A client connected.');   // Handle incoming messages  socket.on('message', (message) => {  console.log(`Received: ${message}`);   // Broadcast the message to all clients  server.clients.forEach((client) => {  if (client !== socket && client.readyState === WebSocket.OPEN) {  client.send(message);  }  });  });   // Handle disconnection  socket.on('close', () => {  console.log('A client disconnected.');  }); });  console.log('WebSocket server is running on ws://localhost:8080'); 

2. Setting Up the Client

File path: client/js/app.js

const socket = new WebSocket('ws://localhost:8080');  // Listen for incoming messages socket.onmessage = (event) => {  const message = event.data;  console.log(`Message from server: ${message}`); };  // Send a message to the server document.getElementById('sendBtn').addEventListener('click', () => {  const input = document.getElementById('messageInput').value;  socket.send(input); }); 

3. HTML for the Client

File path: client/index.html

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>WebSocket Chat</title> </head> <body>  <h1>WebSocket Chat App</h1>  <input type="text" id="messageInput" placeholder="Type a message">  <button id="sendBtn">Send</button>  <script src="./js/app.js"></script> </body> </html> 

Explanation

1. WebSocket Server (server/index.js)

The WebSocket server acts as the backbone of your real-time application. Here’s how it works:

  1. Initializing the Server:
    • A WebSocket server is created using the ws library.
    • The server listens for client connections on port 8080.
    • Once the server is running, it will continuously listen for client requests.
  2. Handling Client Connections:
    • When a client connects, an event handler logs the connection and assigns a WebSocket object (referred to as socket) to the client.
    • This socket object is used to facilitate communication between the server and the connected client.
server.on('connection', (socket) => {  console.log('A client connected.'); }); 
  1. Receiving and Broadcasting Messages:
    • The server listens for incoming messages from the connected client via the message event on the socket object.
    • When a message is received, it is broadcasted to all connected clients except the sender to prevent duplicate messages.
socket.on('message', (message) => {  server.clients.forEach((client) => {  if (client !== socket && client.readyState === WebSocket.OPEN) {  client.send(message);  }  }); }); 
  1. Handling Disconnections:
    • When a client disconnects, the close event is triggered, and the server logs the disconnection.
socket.on('close', () => {  console.log('A client disconnected.'); }); 

2. WebSocket Client (client/js/app.js)

The client is responsible for establishing a WebSocket connection with the server and sending/receiving messages.

  1. Establishing a WebSocket Connection:
    • A connection to the WebSocket server is created using the WebSocket API.
    • The URL ws://localhost:8080 points to the WebSocket server running locally.
const socket = new WebSocket('ws://localhost:8080'); 
  1. Listening for Incoming Messages:
    • The onmessage event on the socket object listens for messages sent by the server.
    • Each message is logged to the browser console for testing or further UI updates.
socket.onmessage = (event) => {  console.log(`Message from server: ${event.data}`); }; 
  1. Sending Messages to the Server:
    • The client provides a simple input form to capture user messages.
    • When the "Send" button is clicked, the message in the input field is sent to the server.
document.getElementById('sendBtn').addEventListener('click', () => {  const input = document.getElementById('messageInput').value;  socket.send(input); }); 

3. HTML Structure (client/index.html)

The HTML structure serves as the UI for the WebSocket client.

  1. Input Field and Button:
    • The input field (<input>) allows users to type messages.
    • The button (<button>) triggers the JavaScript logic to send the message to the server.
<input type="text" id="messageInput" placeholder="Type a message"> <button id="sendBtn">Send</button> 
  1. JavaScript Integration:
    • The <script> tag includes the JavaScript file (app.js) responsible for WebSocket logic.
<script src="./js/app.js"></script> 
  1. Example in Action:
    • When a user types "Hello, World!" in the input field and clicks "Send," the message is transmitted to the server.
    • The server broadcasts the message to other connected clients.
    • Each client, upon receiving the message, logs it to the console or displays it in the UI.

Conclusion

WebSockets offer a powerful way to build real-time applications by maintaining an open connection between the server and the client. By following this guide, you’ve learned how to:

  • Set up a WebSocket server and client.
  • Handle bi-directional communication.
  • Broadcast messages dynamically.

Start building your real-time projects today and explore the endless possibilities WebSockets provide!

Topics Covered

About Author

I'm Maulik Paghdal, the founder of Script Binary and a passionate full-stack web developer. I have a strong foundation in both frontend and backend development, specializing in building dynamic, responsive web applications using Laravel, Vue.js, and React.js. With expertise in Tailwind CSS and Bootstrap, I focus on creating clean, efficient, and scalable solutions that enhance user experiences and optimize performance.