Escuta de porta no lado do servidor

Monte o programa do lado do servidor, faça o bind de um endereço IP e porta por meio da classe TcpListener, ative a escuta da porta e aguarde conexões TCP vindas dos clientes. São disponibilizadas duas formas de implementação: aplicação de console e aplicação com janela WinForms.

Explicação das APIs principais

  1. IPAddress: Representa o endereço IP da máquina local. IPAddress.Parse("127.0.0.1") converte uma string com o IP em um objeto.
    • 127.0.0.1: Endereço de loopback local, acessível apenas na própria máquina. Para permitir conexões de outros computadores na rede local, use o IP da rede interna, como 192.168.x.x;
    • IPAddress.Any: Faz a escuta em todos os IPs das placas de rede do computador.
  2. TcpListener: Classe responsável por escutar conexões TCP no servidor. Parâmetros do construtor: Endereço IP + número da porta
  3. listener.Start(): Iniciar a escuta. Depois de chamar esse método, o servidor passa a aguardar conexões de clientes.

Versão console

using System;
using System.Net;
using System.Net.Sockets;

namespace TalkService
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cria objeto de IP
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            // Cria o ouvinte TCP na porta 9500
            TcpListener listener = new TcpListener(ip, 9500);
            // Liga a escuta
            listener.Start();
            Console.WriteLine("Escuta iniciada... Pressione E para sair");

            ConsoleKeyInfo info;
            do
            {
                info = Console.ReadKey();
            } while (info.Key != ConsoleKey.E);

            listener.Stop(); // Encerra a escuta na saída
        }
    }
}Code language: JavaScript (javascript)

Esse código só inicializa a escuta, ainda não chamamos AcceptTcpClient para aguardar clientes se conectarem, ele apenas impede que o aplicativo feche.

Versão WinForms

Controles da interface: (você pode adicionar controles no formulário WinForm para configurar IP, porta, textos para envio e outras funcionalidades)

  • textBoxIP: Caixa de entrada para IP (valor padrão 127.0.0.1)
  • textBoxPort: Caixa de entrada para porta (valor padrão 9500)
  • buttonStart: Botão de iniciar
  • textBoxInfo: Caixa de texto para exibir informações
using System;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;

namespace SocketChatServer
{
    public partial class Form1 : Form
    {
        IPAddress ip;
        TcpListener listener;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            // Converte os valores de IP e porta
            ip = IPAddress.Parse(this.textBoxIP.Text);
            int port = Convert.ToInt32(this.textBoxPort.Text);
            listener = new TcpListener(ip, port);

            // Inicia a escuta
            listener.Start();

            // Registra log na interface
            string log = $"Servidor iniciado {DateTime.Now.ToShortTimeString()}\r\n";
            this.textBoxInfo.Text = log + this.textBoxInfo.Text;
        }
    }
}Code language: PHP (php)

Problemas a resolver

  1. Bloqueio da interface gráfica
    O método listener.AcceptTcpClient() é um método bloqueante. Se for chamado diretamente na thread principal ao clicar no botão, a janela vai travar. Você precisará criar uma nova thread ou usar async/await para aguardar conexões de forma assíncrona.
  2. Porta em uso
    Quando a porta 9500 já estiver sendo usada por outro software, a criação do new TcpListener() vai lançar uma exceção. Durante o desenvolvimento, adicione um bloco try‑catch para tratar esse erro.
  3. Conexão entre máquinas diferentes
    Ao fazer bind com 127.0.0.1 só é possível testar na própria máquina. Para que outros computadores da rede local conectem‑se, informe o IP local da sua máquina e libere a porta 9500 no firewall.

Escuta de porta no lado do servidor

Previous:
Next:

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *