← Back to Articles

Real-Time Web Applications with WebSockets

Code

Real-time web applications are everywhere now—from chat apps to collaborative documents to live dashboards. WebSockets provide the foundation for these experiences. I've built several real-time applications, and while they're complex, the results are worth it.

What are WebSockets?

WebSockets provide full-duplex communication over a single TCP connection. Unlike HTTP's request-response model, WebSockets allow the server to push data to the client instantly.

Traditional HTTP polling:

  • Client sends request every few seconds
  • Server responds with current data
  • Inefficient and delayed

WebSockets:

  • Persistent connection stays open
  • Server pushes updates immediately
  • Bidirectional communication

Setting up a WebSocket server

Using Node.js with ws library:

const WebSocket = require('ws');

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

wss.on('connection', (ws) => {
  console.log('Client connected');

  ws.on('message', (message) => {
    console.log('Received:', message);

    // Echo the message back
    ws.send(`Echo: ${message}`);
  });

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

WebSocket client in JavaScript

// Client-side connection
const ws = new WebSocket('ws://localhost:8080');

ws.onopen = () => {
  console.log('Connected to WebSocket server');
  ws.send('Hello Server!');
};

ws.onmessage = (event) => {
  console.log('Received:', event.data);
};

ws.onclose = () => {
  console.log('Connection closed');
};

ws.onerror = (error) => {
  console.error('WebSocket error:', error);
};

Real-time chat application

Building a chat app demonstrates core WebSocket concepts:

// Server: Broadcast messages to all connected clients
const clients = new Set();

wss.on('connection', (ws) => {
  clients.add(ws);

  ws.on('message', (message) => {
    const data = JSON.parse(message);

    if (data.type === 'chat') {
      // Broadcast to all clients
      const broadcastMessage = JSON.stringify({
        type: 'chat',
        user: data.user,
        message: data.message,
        timestamp: new Date().toISOString()
      });

      clients.forEach(client => {
        if (client.readyState === WebSocket.OPEN) {
          client.send(broadcastMessage);
        }
      });
    }
  });

  ws.on('close', () => {
    clients.delete(ws);
  });
});

Handling connection drops

WebSockets can disconnect due to network issues. Implement reconnection logic:

class WebSocketManager {
  constructor(url) {
    this.url = url;
    this.ws = null;
    this.reconnectAttempts = 0;
    this.maxReconnectAttempts = 5;
    this.reconnectDelay = 1000;
  }

  connect() {
    this.ws = new WebSocket(this.url);

    this.ws.onopen = () => {
      console.log('Connected');
      this.reconnectAttempts = 0;
    };

    this.ws.onclose = () => {
      console.log('Disconnected, attempting reconnect...');
      this.attemptReconnect();
    };

    this.ws.onerror = (error) => {
      console.error('WebSocket error:', error);
    };
  }

  attemptReconnect() {
    if (this.reconnectAttempts < this.maxReconnectAttempts) {
      this.reconnectAttempts++;
      setTimeout(() => {
        console.log(`Reconnect attempt ${this.reconnectAttempts}`);
        this.connect();
      }, this.reconnectDelay * this.reconnectAttempts);
    }
  }
}

Authentication and security

Secure your WebSocket connections:

// Token-based authentication
const ws = new WebSocket('ws://localhost:8080', {
  headers: {
    'Authorization': `Bearer ${token}`
  }
});

// Server-side validation
wss.on('connection', (ws, request) => {
  const token = extractTokenFromRequest(request);

  if (!validateToken(token)) {
    ws.close(1008, 'Authentication failed');
    return;
  }

  // Authenticated connection
});

Scaling WebSocket applications

For production applications, consider:

  • Load balancing - Use sticky sessions or external message broker
  • Redis pub/sub - For cross-server communication
  • WebSocket clustering - Distribute connections across multiple servers

Real-time dashboard example

// Server: Send periodic updates
setInterval(() => {
  const metrics = {
    users: getActiveUserCount(),
    revenue: getRevenueMetrics(),
    errors: getErrorCount(),
    timestamp: Date.now()
  };

  const message = JSON.stringify({
    type: 'metrics',
    data: metrics
  });

  clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(message);
    }
  });
}, 5000);

// Client: Update dashboard
ws.onmessage = (event) => {
  const data = JSON.parse(event.data);

  if (data.type === 'metrics') {
    updateUserCount(data.data.users);
    updateRevenueChart(data.data.revenue);
    updateErrorDisplay(data.data.errors);
  }
};

WebSockets vs alternatives

  • HTTP polling - Simple but inefficient
  • Server-Sent Events (SSE) - One-way, server to client only
  • WebRTC - Peer-to-peer, complex for client-server
  • WebSockets - Full-duplex, efficient for real-time apps

Performance considerations

  • Connection limits - Browsers limit concurrent connections
  • Message size - Keep messages small for performance
  • Heartbeat/ping - Detect dead connections
  • Compression - Use WebSocket compression

Debugging WebSocket applications

Use browser developer tools:

  • Network tab shows WebSocket connections
  • Console logs for debugging
  • WebSocket frame inspection

Production deployment

For production:

  • Use WSS (WebSocket Secure) in production
  • Implement proper error handling
  • Monitor connection health
  • Set up logging and alerting
  • Consider CDN for global distribution

Common use cases

WebSockets power:

  • Chat applications
  • Live sports scores
  • Stock tickers
  • Collaborative editing
  • Multiplayer games
  • IoT dashboards
  • Real-time notifications

Building real-time applications with WebSockets is challenging but rewarding. Start with simple examples and gradually add complexity. The instant feedback users get from real-time features creates engaging experiences.

About the author

Rafael De Paz

Full Stack Developer

Passionate full-stack developer specializing in building high-quality web applications and responsive sites. Expert in robust data handling, leveraging modern frameworks, cloud technologies, and AI tools to deliver scalable, high-performance solutions that drive user engagement and business growth. I harness AI technologies to accelerate development, testing, and debugging workflows.

Tags:

Share: