Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
Ajax

AJAX: Build Real-time Apps with WebSockets

- 25.07.26 - ErcanOPAK

🔌 WebSockets = Real-time Communication

HTTP polling is inefficient. WebSockets enable real-time, bidirectional communication between client and server.

📝 WebSocket Basics

// Client Setup
const socket = new WebSocket('wss://api.example.com/ws');

// Connection Events
socket.onopen = function() {
    console.log('WebSocket connected');
    socket.send(JSON.stringify({
        type: 'subscribe',
        channel: 'updates'
    }));
};

socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log('Received:', data);
    updateUI(data);
};

socket.onerror = function(error) {
    console.error('WebSocket error:', error);
};

socket.onclose = function() {
    console.log('WebSocket disconnected');
    reconnect();
};

// Sending Messages
function sendMessage(message) {
    if (socket.readyState === WebSocket.OPEN) {
        socket.send(JSON.stringify(message));
    } else {
        console.warn('Socket not ready');
    }
}

// Reconnection Logic
function reconnect() {
    setTimeout(() => {
        const newSocket = new WebSocket('wss://api.example.com/ws');
        // Re-establish connection
    }, 3000);
}

🎯 Real-time Applications

// Chat Application
class ChatApp {
    constructor() {
        this.socket = new WebSocket('wss://chat.example.com');
        this.messageContainer = document.getElementById('messages');
        this.init();
    }

    init() {
        this.socket.onmessage = (event) => {
            const message = JSON.parse(event.data);
            this.displayMessage(message);
        };
    }

    sendMessage(text) {
        this.socket.send(JSON.stringify({
            type: 'message',
            text: text,
            timestamp: Date.now()
        }));
    }

    displayMessage(message) {
        const div = document.createElement('div');
        div.textContent = `${message.user}: ${message.text}`;
        this.messageContainer.appendChild(div);
    }
}

// Live Dashboard
class Dashboard {
    constructor() {
        this.socket = new WebSocket('wss://metrics.example.com');
        this.charts = {};
        this.init();
    }

    init() {
        this.socket.onmessage = (event) => {
            const data = JSON.parse(event.data);
            this.updateMetrics(data);
        };
    }

    updateMetrics(data) {
        // Update real-time charts
        Object.entries(data).forEach(([key, value]) => {
            if (this.charts[key]) {
                this.charts[key].update(value);
            }
        });
    }
}

// Error Handling with Exponential Backoff
class ResilientWebSocket {
    constructor(url) {
        this.url = url;
        this.retryDelay = 1000;
        this.maxDelay = 30000;
        this.connect();
    }

    connect() {
        this.socket = new WebSocket(this.url);
        this.socket.onclose = () => {
            console.log('Reconnecting...');
            setTimeout(() => this.connect(), this.retryDelay);
            this.retryDelay = Math.min(this.retryDelay * 2, this.maxDelay);
        };
    }
}

💡 WebSocket Best Practices

  • Always implement reconnection logic
  • Use heartbeat/ping messages
  • Validate incoming messages
  • Implement message queuing
  • Handle connection closure gracefully

WebSockets power the real-time web. From chat to live analytics, they enable instant communication.

— Real-time Engineer

Related posts:

Ajax: Why fetch() Doesn't 'Fail' on 404s and How to Fix It

Ajax: Master Error Handling with Fetch API

Ajax Calls Block UI Under Load

Post Views: 9

Post navigation

JavaScript: Master Event Delegation for Dynamic Content
Git: Master Cherry-Pick for Selective Commits

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com