Pourquoi les WebSockets sont une magie que vous devez essayer
\n\nImaginez : vous avez ouvert un site avec le cours des cryptomonnaies. Les prix sautent chaque seconde. Ou un chat en ligne, où les messages arrivent instantanément, sans « actualisez la page ». Comment ça marche ? Avant, le navigateur tirait constamment le serveur : « Hé, y a-t-il du nouveau ? » — et le serveur répondait : « Non, va dormir ». Cela s'appelle HTTP polling. C'est lent, consomme du trafic et surcharge le serveur.
\n\nLes WebSockets sont comme un canal de communication ouvert. Le serveur peut lui-même dire au client : « Regarde, une mise à jour ! » — sans requêtes inutiles. En C#, travailler avec les WebSockets est non seulement pratique, mais élégant. L'écosystème .NET fournit des outils prêts à l'emploi : des classes natives System.Net.WebSockets au puissant SignalR.
Dans cet article, nous ne parlerons pas seulement de théorie. Nous allons écrire deux projets réels : un chat temps réel et un moniteur boursier. Vous verrez comment créer un serveur WebSocket C# et y connecter un client. C'est parti !
\n\nQu'est-ce que les WebSockets et pourquoi C# est le choix idéal
\n\nWebSocket est un protocole de communication bidirectionnelle sur TCP. Après la poignée de main (handshake), la connexion reste ouverte. Les données volent dans les deux sens sans en-têtes HTTP. Cela offre :
\n\n- \n
- La vitesse — une latence en millisecondes. \n
- L'économie de ressources — une seule connexion au lieu de centaines de requêtes. \n
- Un vrai temps réel — le serveur initie lui-même l'envoi. \n
C# dans ce contexte est un véritable artilleur lourd. ASP.NET Core supporte les WebSockets nativement. De plus, la programmation asynchrone (async/await) s'intègre parfaitement au modèle de travail avec les canaux. Vous ne bloquez pas le thread en attendant un message — cela rend le code performant et lisible.
\n\nPremier projet : chat temps réel avec WebSockets
\n\nCommençons par un classique — le chat. Il montre clairement toute la mécanique : connexion, envoi, réception et fermeture de la connexion.
\n\nÉtape 1 : Créons un serveur WebSocket en C#
\n\nOuvrez Visual Studio ou un terminal. Créez un nouveau projet ASP.NET Core Web API (ou vide). Installez le package si nécessaire :
\n\ndotnet add package Microsoft.AspNetCore.WebSockets\n\nMaintenant, dans Program.cs, configurons le middleware. Voici le code minimal du serveur :
var builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddWebSockets(options => { });\nvar app = builder.Build();\n\napp.UseWebSockets();\n\n// Liste pour stocker tous les clients connectés\nvar clients = new List<System.Net.WebSockets.WebSocket>();\n\napp.Map("/chat", async (HttpContext context) =>\n{\n if (context.WebSockets.IsWebSocketRequest)\n {\n var webSocket = await context.WebSockets.AcceptWebSocketAsync();\n clients.Add(webSocket);\n Console.WriteLine("Nouveau client connecté !");\n\n // Tampon pour la réception des données\n var buffer = new byte[1024 * 4];\n while (webSocket.State == WebSocketState.Open)\n {\n var result = await webSocket.ReceiveAsync(\n new ArraySegment<byte>(buffer), CancellationToken.None);\n \n if (result.MessageType == WebSocketMessageType.Close)\n {\n await webSocket.CloseAsync(\n WebSocketCloseStatus.NormalClosure, \n "Connexion fermée", CancellationToken.None);\n clients.Remove(webSocket);\n Console.WriteLine("Client déconnecté.");\n }\n else if (result.MessageType == WebSocketMessageType.Text)\n {\n // Recevoir le message d'un client\n var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);\n Console.WriteLine($"Reçu : {message}");\n\n // Diffuser à tous les autres\n v