Programação de Rede em C#: de Sockets a Web APIs

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

Mergulhando nas profundezas da rede: por que C# é a escolha ideal

\n

Quando falamos sobre programação de rede, muitos desenvolvedores imaginam toneladas de código de baixo nível em C ou configurações infinitas em Python. Mas o C# com sua sintaxe elegante e poderosa biblioteca padrão transforma a comunicação entre aplicações em um verdadeiro prazer. Esqueça os manuais chatos — hoje vamos analisar como criar um chat TCP completo, um cliente-servidor assíncrono e até mesmo uma REST API, usando apenas os recursos internos do .NET.

\n

No pythonlib.ru estamos acostumados com Python, mas o C# na área de interações de rede dá vantagem a muitas linguagens. Seu modelo assíncrono (async/await) e suporte interno a sockets permitem escrever código que escala facilmente de uma simples aplicação de console a um servidor de alta carga. Pronto? Então vamos iniciar o Visual Studio e começar!

\n\n

Fundamentos: o que é um socket e como prepará-lo

\n

Um socket é uma interface de software para troca de dados entre processos, que podem estar tanto na mesma máquina quanto em diferentes partes do mundo. Em C#, o trabalho com sockets começa com o namespace System.Net.Sockets. O par mais popular são os sockets TCP, que garantem entrega confiável de dados.

\n

Imagine que o socket é uma porta. Um lado (servidor) abre a porta e espera alguém bater. O outro lado (cliente) bate, e após o aperto de mãos eles começam a trocar mensagens. Em C#, fica assim:

\n
// Parte do servidor\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Text;\n\nTcpListener server = new TcpListener(IPAddress.Any, 8888);\nserver.Start();\nConsole.WriteLine("Servidor iniciado, aguardando conexões...");\n\nTcpClient client = await server.AcceptTcpClientAsync();\nNetworkStream stream = client.GetStream();\n\nbyte[] buffer = new byte[1024];\nint bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);\nstring message = Encoding.UTF8.GetString(buffer, 0, bytesRead);\nConsole.WriteLine($"Recebido: {message}");\n\n// Resposta ao cliente\nbyte[] response = Encoding.UTF8.GetBytes("Olá do servidor!");\nawait stream.WriteAsync(response, 0, response.Length);
\n

Este código é a base. Ele é síncrono, mas já dá uma ideia de como funciona a programação de rede em C#. Observe que usamos async e await — esta é a chave para o desempenho.

\n\n

Comunicação cliente-servidor: primeiro contato

\n

O lado do cliente não é menos simples. Aqui está um exemplo de cliente TCP que se conecta ao nosso servidor:

\n
// Cliente\nTcpClient client = new TcpClient();\nawait client.ConnectAsync("127.0.0.1", 8888);\nNetworkStream stream = client.GetStream();\n\nbyte[] data = Encoding.UTF8.GetBytes("Olá a todos!");\nawait stream.WriteAsync(data, 0, data.Length);\n\nbyte[] buffer = new byte[1024];\nint bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);\nConsole.WriteLine($"Resposta: {Encoding.UTF8.GetString(buffer, 0, bytesRead)}");
\n
    \n
  • IPAddress.Any — escuta em todas as interfaces de rede.
  • \n
  • Porta 8888 — qualquer porta livre acima de 1024.
  • \n
  • NetworkStream — fluxo para leitura/escrita.
  • \n
\n

Uma nuance importante: não se esqueça de fechar as conexões. Em projetos reais, use using ou try-finally.

\n\n

Programação assíncrona: como não travar o servidor

\n

Código síncrono é bom para aprendizado, mas em produção ele bloqueará a thread durante o tempo de espera. Imagine que 100 clientes se conectam ao seu servidor — cada um esperará sua vez. A solução é a programação de rede assíncrona em C#.

\n

Métodos com o sufixo Async (por exemplo, AcceptTcpClientAsync) não bloqueiam a thread. Eles retornam o controle imediatamente e, quando os dados chegam, retomam a execução. Isso permite processar

Blogs

Book Recommendations