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
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, como192.168.x.x;IPAddress.Any: Faz a escuta em todos os IPs das placas de rede do computador.
TcpListener: Classe responsável por escutar conexões TCP no servidor. Parâmetros do construtor:Endereço IP + número da portalistener.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ão127.0.0.1)textBoxPort: Caixa de entrada para porta (valor padrão9500)buttonStart: Botão de iniciartextBoxInfo: 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
- Bloqueio da interface gráfica
O métodolistener.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 usarasync/awaitpara aguardar conexões de forma assíncrona. - Porta em uso
Quando a porta 9500 já estiver sendo usada por outro software, a criação donew TcpListener()vai lançar uma exceção. Durante o desenvolvimento, adicione um bloco try‑catch para tratar esse erro. - Conexão entre máquinas diferentes
Ao fazer bind com127.0.0.1só é 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: Visão geral
Next: Cliente