Por que WebSockets são a magia que você precisa experimentar
\n\nImagine: você abriu um site com a cotação de criptomoedas. Os preços saltam a cada segundo. Ou um chat online, onde as mensagens chegam instantaneamente, sem "atualize a página". Como isso funciona? Antigamente, o navegador ficava cutucando o servidor: "Ei, tem algo novo?" — e o servidor respondia: "Não, vá dormir". Isso se chama HTTP polling. É lento, consome tráfego e sobrecarrega o servidor.
\n\nWebSockets são como um canal de comunicação aberto. O próprio servidor pode dizer ao cliente: "Olha, atualização!" — sem solicitações extras. Em C#, trabalhar com WebSockets não é apenas conveniente, mas elegante. O ecossistema .NET oferece ferramentas prontas: desde classes nativas System.Net.WebSockets até o poderoso SignalR.
Neste artigo, não vamos apenas falar sobre teoria. Vamos escrever dois projetos reais: um chat em tempo real e um monitor de bolsa de valores. Você verá como criar um servidor WebSocket C# e conectar um cliente a ele. Vamos lá!
\n\nO que são WebSockets e por que C# é a escolha ideal
\n\nWebSocket é um protocolo de comunicação bidirecional sobre TCP. Após o handshake, a conexão permanece aberta. Os dados voam em ambas as direções sem cabeçalhos HTTP. Isso proporciona:
\n\n- \n
- Velocidade — latência em milissegundos. \n
- Economia de recursos — uma única conexão em vez de centenas de solicitações. \n
- Tempo real verdadeiro — o próprio servidor inicia o envio. \n
C# neste contexto é um verdadeiro canhão pesado. O ASP.NET Core suporta WebSockets nativamente. Além disso, a programação assíncrona (async/await) se encaixa perfeitamente no modelo de trabalho com canais. Você não bloqueia a thread enquanto espera uma mensagem — isso torna o código eficiente e legível.
\n\nPrimeiro projeto: chat em tempo real com WebSockets
\n\nVamos começar com o clássico — um chat. Ele demonstra claramente toda a mecânica: conexão, envio, recebimento e fechamento da conexão.
\n\nPasso 1: Criando o servidor WebSocket em C#
\n\nAbra o Visual Studio ou terminal. Crie um novo projeto ASP.NET Core Web API (ou vazio). Instale o pacote, se necessário:
\n\ndotnet add package Microsoft.AspNetCore.WebSockets\n\nAgora, no Program.cs, configuramos o middleware. Aqui está o código mínimo do servidor:
var builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddWebSockets(options => { });\nvar app = builder.Build();\n\napp.UseWebSockets();\n\n// Lista para armazenar todos os 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("Novo cliente conectado!");\n\n // Buffer para receber dados\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 "Conexão fechada", CancellationToken.None);\n clients.Remove(webSocket);\n Console.WriteLine("Cliente desconectado.");\n }\n else if (result.MessageType == WebSocketMessageType.Text)\n {\n // Recebe a mensagem de um cliente\n var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);\n Console.WriteLine($"Recebido: {message}");\n\n // Envia para todos os outros