Polling Is So Last Year—Level Up with Real‑Time WebSockets in Node.js! 🚀
Saumya Aggarwal

Saumya Aggarwal @saumyaaggarwal

About: A techie

Location:
Delhi, India
Joined:
May 4, 2025

Polling Is So Last Year—Level Up with Real‑Time WebSockets in Node.js! 🚀

Publish Date: Jul 3
1 0

Introduction

Remember when web apps felt like dial‑up—click, wait, repeat? Today, we want chat‑app instant updates, live dashboards, and multiplayer games that don’t lag. In this article, we’ll:

  1. See why real‑time apps need sockets instead of plain old HTTP
  2. Peek at how HTTP “fakes” real‑time with polling or SSE
  3. Build a native WebSocket server in Node.js (using the tiny ws library)
  4. Compare when to grab Socket.IO instead of raw WebSockets
  5. Tour a super‑simple publish/subscribe (pub‑sub) pattern—think radio channels for your data

Let’s jump in! 🏊‍♂️


1. Why Real‑Time Needs Sockets

  • HTTP is stateless: every update is a brand‑new request → slow and wasteful.
  • WebSockets upgrade once, then keep a full‑duplex TCP link open. That means both client & server can push data instantly, with almost zero extra cost.

2. When HTTP “Fakes” Real‑Time

Strategy Latency Overhead Browser Support Good For
Short Polling Seconds (interval) New TLS + headers each request Everywhere Low‑traffic dashboards
Long Polling ~Sub‑second One open request per client Everywhere Legacy feeds
SSE Push (server→client) One HTTP stream Modern evergreen browsers Live comments, stock tickers
WebSocket Instant bidirectional Single TCP connection All modern browsers Chat, games, IoT, collab‑editing

3. Hands‑On: WebSockets in Node.js with ws

Install

npm install express ws
Enter fullscreen mode Exit fullscreen mode

Code (ESM)

// server.js
import express from 'express';
import { WebSocketServer } from 'ws';

const app    = express();
const server = app.listen(3000, () => console.log('HTTP on :3000'));
const wss    = new WebSocketServer({ server });  // share port

wss.on('connection', socket => {
  console.log('⚡️ client connected');
  socket.send(JSON.stringify({ welcome: 'hello 👋' }));

  socket.on('message', data => {
    // broadcast to everyone
    wss.clients.forEach(client => {
      if (client.readyState === 1) client.send(data);
    });
  });
});
Enter fullscreen mode Exit fullscreen mode

Why ws?

  • Tiny (<20 kB)
  • Speaks pure RFC 6455 frames
  • No extra overhead from big frameworks

4. When to Reach for Socket.IO

Feature Raw WebSocket (ws) Socket.IO
Fallbacks ❌ none ✅ Long‑polling if needed
Rooms & Namespaces ❌ DIY ✅ Built‑in
Auto‑reconnect & heartbeats ❌ DIY ✅ Built‑in
Protocol Overhead Minimal ~2–3 kB per frame
Client Bundle Size Minimal Extra JS ~20–30 kB

Use Socket.IO if you need auto‑fallbacks, rooms, or reconnection helpers out of the box.

Use raw WebSockets (ws) for max throughput, super‑lean microservices, or custom protocols.


5. Pub‑Sub in Plain English

Imagine a radio station:

  • DJs publish on a frequency.
  • Listeners subscribe by tuning in.

Let’s build that with sockets:

// super‑tiny pub‑sub on top of ws
const channels = {};

function publish(topic, msg) {
  (channels[topic] || []).forEach(ws => ws.send(msg));
}

function subscribe(ws, topic) {
  channels[topic] = [...(channels[topic] || []), ws];
}

// Client sends { sub: "news" } to join "news" channel
Enter fullscreen mode Exit fullscreen mode

Use cases: chat rooms, game lobbies, IoT sensor data, live gaming leaderboards—you name it.


Conclusion

  • Native WebSockets = true bidirectional push + tiny overhead.
  • HTTP tricks (polling, SSE) still work for simple, one‑way streams.
  • ws keeps your Node.js server lean; Socket.IO gives you fallbacks & helpers.
  • Pub‑sub is just “radio channels” for your data—easy to build, super powerful.

Ready to stop faking real‑time and embrace true sockets? Happy streaming! 🚀

Enjoyed this? Drop a comment or share your own real‑time war stories! 🎉

Comments 0 total

    Add comment