WebSockets em C#: Criando aplicações em tempo real que funcionam como um relógio

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que WebSockets são a magia que você precisa experimentar

\n\n

Imagine: 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\n

WebSockets 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.

\n\n

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\n

O que são WebSockets e por que C# é a escolha ideal

\n\n

WebSocket é 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
\n\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\n

Primeiro projeto: chat em tempo real com WebSockets

\n\n

Vamos 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\n

Passo 1: Criando o servidor WebSocket em C#

\n\n

Abra o Visual Studio ou terminal. Crie um novo projeto ASP.NET Core Web API (ou vazio). Instale o pacote, se necessário:

\n\n
dotnet add package Microsoft.AspNetCore.WebSockets
\n\n

Agora, no Program.cs, configuramos o middleware. Aqui está o código mínimo do servidor:

\n\n
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                

Blogs

Book Recommendations