Por qué WebSockets es la magia que debes probar
\n\nImagina: abriste un sitio con el precio de las criptomonedas. Los precios saltan cada segundo. O un chat en línea, donde los mensajes llegan al instante, sin «actualice la página». ¿Cómo funciona? Antes, el navegador molestaba constantemente al servidor: «Oye, ¿hay algo nuevo?» — y el servidor respondía: «No, vete a dormir». Esto se llama HTTP polling. Es lento, consume tráfico y sobrecarga el servidor.
\n\nWebSockets es como un canal de comunicación abierto. El servidor mismo puede decirle al cliente: «¡Mira, una actualización!» — sin solicitudes adicionales. En C#, trabajar con WebSockets no solo es conveniente, sino elegante. El ecosistema .NET proporciona herramientas listas: desde clases nativas System.Net.WebSockets hasta el potente SignalR.
En este artículo no solo hablaremos de teoría. Escribiremos dos proyectos reales: un chat en tiempo real y un monitor de bolsa. Verás cómo crear un servidor WebSocket en C# y conectarle un cliente. ¡Allá vamos!
\n\nQué son los WebSockets y por qué C# es la elección ideal
\n\nWebSocket es un protocolo de comunicación bidireccional sobre TCP. Después del apretón de manos (handshake), la conexión permanece abierta. Los datos vuelan en ambas direcciones sin encabezados HTTP. Esto proporciona:
\n\n- \n
- Velocidad — latencia en milisegundos. \n
- Ahorro de recursos — una sola conexión en lugar de cientos de solicitudes. \n
- Verdadero tiempo real — el servidor mismo inicia el envío. \n
C# en este contexto es un verdadero artillero pesado. ASP.NET Core soporta WebSockets de fábrica. Además, la programación asíncrona (async/await) encaja perfectamente con el modelo de trabajo con canales. No bloqueas el hilo mientras esperas un mensaje — esto hace que el código sea eficiente y legible.
\n\nPrimer proyecto: chat en tiempo real con WebSockets
\n\nEmpezaremos con un clásico: un chat. Muestra claramente toda la mecánica: conexión, envío, recepción y cierre de la conexión.
\n\nPaso 1: Creamos un servidor WebSocket en C#
\n\nAbre Visual Studio o la terminal. Crea un nuevo proyecto ASP.NET Core Web API (o vacío). Instala el paquete si es necesario:
\n\ndotnet add package Microsoft.AspNetCore.WebSockets\n\nAhora en Program.cs configuramos el middleware. Aquí está el código mínimo del servidor:
var builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddWebSockets(options => { });\nvar app = builder.Build();\n\napp.UseWebSockets();\n\n// Lista para almacenar todos los clientes conectados\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("¡Nuevo cliente conectado!");\n\n // Buffer para recibir datos\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 "Conexión cerrada", CancellationToken.None);\n clients.Remove(webSocket);\n Console.WriteLine("Cliente desconectado.");\n }\n else if (result.MessageType == WebSocketMessageType.Text)\n {\n // Recibimos el mensaje de un cliente\n var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);\n Console.WriteLine($"Recibido: {message}");\n\n // Reenviamos a todos los demás