Skip to content
PotatoScript edited this page Mar 6, 2025 · 1 revision

πŸ”— WebSocket with C# (.NET) - A Complete Guide πŸš€

πŸ” Introduction

WebSockets enable real-time, bidirectional communication between a server and multiple clients. In C#, WebSockets are supported in ASP.NET Core, allowing efficient messaging in web applications.

🎯 What You’ll Learn

βœ… How to create a WebSocket server using ASP.NET Core
βœ… How to create a WebSocket client in C#
βœ… How to send and receive messages
βœ… How to handle multiple clients
βœ… How to use WebSockets with HTML & JavaScript


πŸ—οΈ 1. Setting Up a WebSocket Server in C#

We will create an ASP.NET Core Web API that supports WebSocket connections.

πŸ“Œ Step 1: Create an ASP.NET Core Project

1️⃣ Open Visual Studio
2️⃣ Create a new ASP.NET Core Web API project
3️⃣ Select .NET 6+
4️⃣ Remove the default WeatherForecast files

πŸ“Œ Step 2: Add WebSocket Support

Modify Program.cs to enable WebSockets:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// Enable WebSockets
app.UseWebSockets();

app.Map("/ws", async (HttpContext context) =>
{
    if (context.WebSockets.IsWebSocketRequest)
    {
        using WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
        await HandleWebSocketConnection(webSocket);
    }
    else
    {
        context.Response.StatusCode = 400; // Bad Request
    }
});

app.Run();

πŸ“‘ 2. Handling WebSocket Messages

Create a new method HandleWebSocketConnection to manage WebSocket communication.

using System.Net.WebSockets;
using System.Text;

async Task HandleWebSocketConnection(WebSocket webSocket)
{
    var buffer = new byte[1024 * 4];

    while (webSocket.State == WebSocketState.Open)
    {
        var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        if (result.MessageType == WebSocketMessageType.Close)
        {
            await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed", CancellationToken.None);
            break;
        }

        string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
        Console.WriteLine($"Received: {message}");

        string response = $"Server: {message.ToUpper()}";
        byte[] responseBytes = Encoding.UTF8.GetBytes(response);
        await webSocket.SendAsync(new ArraySegment<byte>(responseBytes), WebSocketMessageType.Text, true, CancellationToken.None);
    }
}

How It Works

  • Receives messages from the client.
  • Logs the message to the console.
  • Sends back a response (converted to uppercase).

πŸƒ Run the WebSocket Server

  1. Open Terminal in Visual Studio.
  2. Run the project with:
    dotnet run
  3. The server starts at ws://localhost:5000/ws.

πŸ’» 3. Creating a WebSocket Client in C#

Now, let's create a C# WebSocket client to connect to the server.

πŸ“Œ Step 1: Create a New Console App

1️⃣ Open Visual Studio
2️⃣ Create a new Console Application
3️⃣ Add System.Net.WebSockets for WebSocket support

πŸ“œ Step 2: Implement the WebSocket Client

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var client = new ClientWebSocket();
        await client.ConnectAsync(new Uri("ws://localhost:5000/ws"), CancellationToken.None);
        Console.WriteLine("Connected to WebSocket Server");

        _ = Task.Run(async () =>
        {
            var buffer = new byte[1024];
            while (client.State == WebSocketState.Open)
            {
                var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
                Console.WriteLine($"Received: {message}");
            }
        });

        while (true)
        {
            string message = Console.ReadLine();
            if (message.ToLower() == "exit") break;

            byte[] bytes = Encoding.UTF8.GetBytes(message);
            await client.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None);
        }

        await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
        Console.WriteLine("WebSocket closed");
    }
}

How It Works

  • Connects to ws://localhost:5000/ws
  • Reads messages from the console and sends them to the server
  • Receives messages and displays them

πŸƒ Run the WebSocket Client

  1. Start the WebSocket Server.
  2. Run the client in another terminal with:
    dotnet run
  3. Type a message and press Enter.
  4. The server will respond with an uppercase message.

🌐 4. WebSocket with JavaScript (HTML)

We can also connect a web client to our C# WebSocket server.

πŸ“œ Step 1: Create index.html

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Client</title>
</head>
<body>
    <h2>WebSocket Chat</h2>
    <div id="messages" style="border:1px solid black; padding:10px; height:200px; overflow:auto;"></div>
    <input type="text" id="msg" placeholder="Enter message">
    <button onclick="sendMessage()">Send</button>

    <script>
        const socket = new WebSocket("ws://localhost:5000/ws");

        socket.onopen = () => console.log("Connected to server");
        socket.onmessage = (event) => {
            let messages = document.getElementById("messages");
            messages.innerHTML += `<div>${event.data}</div>`;
        };

        function sendMessage() {
            let msg = document.getElementById("msg").value;
            socket.send(msg);
            document.getElementById("msg").value = "";
        }
    </script>
</body>
</html>

πŸƒ Run the HTML WebSocket Client

  1. Open the file in a browser.
  2. Type a message and click Send.
  3. The server will respond, and the message will appear on the page.

πŸ”’ 5. WebSocket Security Best Practices

πŸ”Ή Use HTTPS/WSS (wss://) to secure connections.
πŸ”Ή Authenticate users (JWT tokens, API keys).
πŸ”Ή Limit message size to prevent DoS attacks.
πŸ”Ή Validate messages to prevent injection attacks.
πŸ”Ή Close inactive connections to free resources.


πŸŽ‰ 6. Conclusion

βœ… Built a WebSocket server in C# (ASP.NET Core).
βœ… Created a C# WebSocket client.
βœ… Implemented message handling & broadcasting.
βœ… Connected a JavaScript client.
βœ… Applied security best practices.

Clone this wiki locally