TCP e UDP no Delphi 7
Botando pra funcionar...

Este mundo da programação é mesmo fantástico. Num dia você domina um conjunto de informações e procedimentos técnicos e no outro, puf... Ele não vale de quase nada. Estudar, no caso da programação, não é uma tarefa específica com hora e data para terminar, mas uma filosofia de vida (senão o incauto não sobrevive nesta selva).

Curiosamente a Borland tem uma atitude diversificada, para questões como compatibilidade: enquanto mantém componentes na mesma estrutura com que foram criados, ainda no tempo do Delphi 1, para 16 bits, muda radicalmente outros, que estavam funcionando muito bem. É o caso dos componentes para internet: TCP (sockets) e UDP.

Sockets (aba internet no D5)
UDP (aba fastnet no D5)

O UDP é até aceitável que tenha sido alterado, afinal ele não era efetivamente um componente Borland, mas um componente agregado, de outra companhia. E sabemos bem o acontece com empresas de programação: vem e vão com muita facilidade. Já o TCP...

Bem, seja como for, o que está acontecendo basicamente é que todos aqueles que estão migrando para o Delphi 7 estão tendo problemas para fazer essa turma trabalhar como vinha sendo feito até aqui. Então, o propósito deste artigo é mostrar o caminho das pedras, para facilitar um pouco as escolhas de cada um. Vamos primeiro ao TCP.

A Borland criou um novo set de componentes TCP para o D7, assim chamados: TcpClient e TcpServer (aba Internet). Uma olhada no exemplo de construção de um chat (pasta demos) nos mostra que a programação desses componentes é completamente diferente dos nossos velhos conhecidos: ClientSocket e ServerSocket (até então usados como base para a comunicação via TCP). A docimentação dos novos componentes deixa a desejar e fazê-los funcionar pode consumir muitas horas e dores de cabeça.

componente TcpClient
   
componente TcpServer
   
componente UdpSocket

Mas, por sorte ou por descuido, a Borland deixou os velhos sockets no D7, só que sem instalá-los na instalação default. Basta fazer o seguinte:

  • Dê um close all (menu file) para fechar todo mundo;
  • Vá em Project, Options, aba Packages, opção Add;
  • Ao aparecer o box para load, apontando para a pasta Bin, localize o arquivo dclsockets70.bpl e dê um clique duplo nele;

Pronto. Se tudo correu bem, então retomamos a programação com os conhecidos ClientSocket e ServerSocket, agora incluidos na aba Internet.

Sockets (aba internet no D7, após a instalação)

Com o componente UDP a coisa é mais complicada. O antigo componente simplesmente desapareceu e foi substituido por um novo (UdpSocket), na pasta internet. Porém, seguindo a documentação precária dele, ainda não foi possível fazer com que o mesmo funcionasse de forma simples e direta, como vinha sendo feito até então. A solução foi então lançar mão de um segundo pacote de componentes, presente no D7, chamado Indy. Trata-se de uma vasta coleção de componentes específicos para desenvolver aplicações em rede e lá existem componentes UDP para todos os gostos. Vamos usar 2: um cliente e um servidor, ou seja, um componente para mandar mensagens e outro para receber.

O componente UDP que envia mensagens está na aba IndyClients e chama-se IdUDPClient (é um dos primeiros componentes da aba). Para enviar uma mensagem, basta informar o Host, a Port e fazer uma operação simples:

IdUDPClient1.Send('mensagem');

Para receber as respostas do servidor, é preciso incluir o UDP server, da aba IndyServers (chama-se IdUDPServer). Esse é a forma mais simples de contornar o problema, sem compicar demais a programação. Informa-se a porta que ficará disponível para leitura e programa-se o evento OnUDPRead:

var
Rec: string;
begin
SetLength(Rec,AData.Size);
AData.Read(Rec[1],AData.Size);
end;

A leitura do buffer diretamente na string (Rec) vai exigir exigir a inclusão da cláusula IDSocketHandle, na seção uses (logo no começo do fonte).

Daqui em diante é só seguir o que já ficou combinando anteriormente, ou seja, cada programa trata seus dados como foram definidos pelo autor.

Há ainda uma forma de simplificar mais, usando apenas o componente IdUDPserver para leitura e envio de mensagens no programa cliente. No caso, para enviar uma mensagem basta fazer:

IdUDPServer1.Send('host',porta,'mensagem');
 
online