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'); |
|
|
|