WebSocket in C#: Echtzeitanwendungen von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum WebSocket der Standard für Echtzeitanwendungen ist?



Moderne Webanwendungen erfordern eine sofortige Reaktion auf Benutzeraktionen. Ob Online-Chat, Börsenterminal, Mehrspieler-Spiel oder Überwachungssystem – Verzögerungen bei der Datenübertragung sind inakzeptabel. Das traditionelle HTTP-Protokoll, das nach dem Prinzip "Anfrage-Antwort" funktioniert, ist für solche Szenarien ineffizient: Der Client muss den Server ständig abfragen (Polling), was eine übermäßige Belastung erzeugt.



Hier kommt WebSocket zur Hilfe – ein Protokoll, das eine dauerhafte bidirektionale Verbindung zwischen Client und Server ermöglicht. In diesem Artikel werden wir untersuchen, wie man Echtzeitanwendungen in C# (.NET) mit WebSocket erstellt, von einem einfachen Echo-Server bis hin zu einem vollwertigen Chat. Sie erfahren, wie das Protokoll funktioniert, welche Tools die .NET-Plattform bereitstellt und wie Sie typische Fehler vermeiden.



Grundlagen von WebSocket in .NET: Serverseite



Die .NET-Plattform bietet integrierte Unterstützung für WebSocket über den Namespace System.Net.WebSockets. Betrachten wir die Erstellung eines Servers auf Basis von ASP.NET Core.



1. Konfiguration der Middleware für WebSocket



Zunächst muss die Unterstützung für WebSocket in die Anforderungsverarbeitungspipeline eingefügt werden. In der Datei Program.cs:



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

app.UseWebSockets(); // WebSocket-Unterstützung aktivieren

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

app.Run("http://localhost:5000");

async Task Echo(WebSocket webSocket){ var buffer = new byte[1024 * 4]; var receiveResult = await webSocket.ReceiveAsync( new ArraySegment<byte>(buffer), CancellationToken.None);

while (!receiveResult.CloseStatus.HasValue) { // Empfangene Daten an den Client zurücksenden (Echo) await webSocket.SendAsync( new ArraySegment<byte>(buffer, 0, receiveResult.Count), receiveResult.MessageType, receiveResult.EndOfMessage, CancellationToken.None);

receiveResult = await webSocket.ReceiveAsync( new ArraySegment<byte>(buffer), CancellationToken.None); }

await webSocket.CloseAsync( receiveResult.CloseStatus.Value, receiveResult.CloseStatusDescription, CancellationToken.None);}


Dieser Code erstellt einen Echo-Server: Alles, was der Client sendet, wird zurückgesendet. Beachten Sie die Verwendung von async/await – die Arbeit mit WebSocket ist immer asynchron.



2. Verwaltung mehrerer Verbindungen



In einer realen Anwendung müssen mehrere Verbindungen verwaltet werden. Erstellen wir einen einfachen Verbindungsmanager:



public class WebSocketConnectionManager{    private readonly ConcurrentDictionary<string, WebSocket> _connections = new();

public string AddConnection(WebSocket socket) { var id = Guid.NewGuid().ToString(); _connections.TryAdd(id, socket); return id; }

public async Task BroadcastMessageAsync(string message) { var tasks = _connections.Values.Select(async socket => { if (socket.State == WebSocketState.Open) { var bytes = Encoding.UTF8.GetBytes(message); await socket.SendAsync( new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, CancellationToken.None); } }); await Task.WhenAll(tasks); }}


Diese Klasse ermöglicht es, alle aktiven Verbindungen zu speichern und Nachrichten zu senden

Blogs

Buchempfehlungen