Beruflich Dokumente
Kultur Dokumente
echo 7/ t cp
echo 7/ udp
di scar d 9/ t cp si nk nul l
di scar d 9/ udp si nk nul l
syst at 11/ t cp user s
#Usuar i os act i vos
syst at 11/ t cp user s
#Usuar i os act i vos
dayt i me 13/ t cp
dayt i me 13/ udp
qot d 17/ t cp quot e
#Cuot a del d a
qot d 17/ udp quot e
#Cuot a del d a
char gen 19/ t cp t t yt st sour ce
#Gener ador del car ct er
char gen 19/ udp t t yt st sour ce
#Gener ador del car ct er
f t p- dat a 20/ t cp
#FTP, dat os
f t p 21/ t cp
#FTP. cont r ol
t el net 23/ t cp
1. Conectar al servidor.
2. Mandar la cadena XXX.
3. Desconectar del servidor.
Bloquear o no bloquear?
Los sockets se originaron de la definicin de Berkely Unix.
Cuando se realiza una operacin de lectura sobre un socket, el
flujo del programa se detiene hasta que se reciban los datos
necesarios. Unix maneja esto mediante una llamada al
procedimiento fork que inicia una copia del programa original
y lo ejecuta. De esta manera se evita que el programa original
se quede bloqueado. Por otro lado, Windows no dispone de
esta funcionalidad, y en la versin 3.x no existan las hebras
(Threads). Por ello, cuando se quiso trabajar con sockets
sncronos (o bloqueantes) en Windows 3.x, exista el problema
de que la GUI se quedaba bloqueada y no responda a las
interacciones del usuario. Adems, como Windows 3.x era un
sistema operativo que utilizaba una multi-tarea cooperativa
(cada proceso ceda el uso del procesador), cuando una
aplicacin quisiera operar con sockets, pareca que todo el
sistema se quedaba colgado. De ah surgi la idea de sockets
asncronos (o no-bloqueantes).
Con la aparicin de plataformas Win32, se poda utilizar las
llamadas bloquentes ya que existan las hebras. El problema
fundamental es que muchas personas se han acostumbrado a
utilizar sockets asncronos y los sncronos han cogido mala
fama. Sin embargo, para trabajar en Linux sigue siendo
necesario utilizar sockets bloqueantes, y es recomendable
perder el miedo a estos y ver lo sencillo que puede ser su uso
(de cara a la salida de Delphi para Linux).
Las diferencias principales entre otros paquetes de
componentes sockets existentes en el mercado e Indy son:
2
Programacin TCP/IP
procedure TfmMain.ConectarOnClick(Sender: Tcomponent);
begin
with Socket do begin
Connect;
while not Connected do begin
if bError then
Abort;
Application.ProcessMessages;
end;
while Length(DatosSalida) > 0 do
Application.ProcessMessages;
Disconnect;
end;
procedure TfmMain.SocketOnConnectError;
begin
bError := True;
end;
procedure TfmMain.SocketOnRead;
var
i: Integer;
begin
i := Socket.Send(DatosSalida);
DatosSalida := Copy(DatosSalida, i + 1, MaxInt);
end;
procedure TfmMain.ConectarEnviarOnClick(Sender: Tcomponent);
begin
with Socket do begin
Connect;
try
Send;
Leer; // LLAMADA BLOQUEANTE
finally
Disconnect;
end;
end;
Como se puede contemplar en el cdigo, primero se realiza la
conexin, y se procesa los mensajes de la aplicacin mientras
se espera la conexin. De nuevo, se procesan los mensajes
mientras hay datos para enviar. Hay un evento
OnConnectError que pone el valor del booleano bError a
verdadero, y otro evento OnRead que es el que se encarga de
mandar los datos. Intuitivo? La verdad es que no lo es.
Veamos el mismo ejemplo basado en sockets bloqueantes:
Winshoes
www.pbe.com/Winshoes.
Indy
www.nevrona.com/indy
Open-Source
www.opensource.org
Project J edi
www.delphi-jedi.org
Sockets
www.pbe.com/Kudzu
RFC
www.rfc-editor.org
3
Figura 1. Paleta.bmp. Paleta de los componentes Indy.
El mes pasado vimos una breve introduccin a Indy y a los
sockets. Este mes vamos a cubrir lo que son los clientes.
Primero veremos como conectar con un servidor y luego
examinaremos formas de evitar el bloqueo de la interfaz de
usuario.
Instalando el paquete.
Actualmente Indy esta en fase beta. A pesar de ello, es un
paquete bastante estable e incluye muchas mejoras frente a
la versin 7 (en concreto 7.039B). Recomiendo que se
empieza a utilizar estos componentes a pesar de que estn
en esa fase, ya que no se va a seguir el desarrollo de
Winshoes 7.X. A la hora de escribir este artculo, la
versin disponible es la 8.005B. Se incluye
aproximadamente 65 componentes distribuidos entre
clientes, servidores y miscelneos. Por razones de QA
(aseguramiento de la calidad), Borland ha impuesto una
restriccin sobre nuevas funcionalidades que se pueden
sacar en esta versin. En sucesivas versiones del producto
(8.1, 8.2, etc) se aadirn mejoras. Los componentes se
pueden utilizar en las versiones 4 y 5 de Delphi (y desde
luego tambin en Delphi 6 para Windows y Linux, cuando
salgan estos).
Se puede descargar el paquete desde
http://www.nevrona.com/Indy/download.html. Hay dos
versiones disponibles. La primera de ellas incluye un
programa de instalacin que automticamente instalar el
paquete en la IDE. Sin embargo, puede tardar bastante en
bajarse sta ya que ocupa alrededor de 7.5MB. Como la
instalacin es bien sencilla, nos ocuparemos de la otra, que
viene en formato ZIP y se puede descomprimir a cualquier
ruta de su disco duro. Una vez que tenga todos los ficheros,
habr que instalarlos en Delphi. Hay dos paquetes:
dclIndyXX e IndyXX donde XX indica la versi n de
Delphi en cuestin. La primera es el paquete de tiempo de
diseo (Design time package) e incluye cosas como
editores de propiedades, etc. La segunda es el paquete de
tiempo de ejecucin (Runtime package). El procedimiento
para instalarlos es:
4. Compile e instlelo.
procedure TfmCliente1.edTextKeyPress(Sender:
TObject; var Key: Char);
begin
if Key = #13 then
begin
IdTCPClient1.WriteLn(edText.Text);
edText.Text := '';
meReply.Lines.Add(IdTCPClient1.ReadLn);
end;
end;
procedure TfmCliente1.FormActivate(Sender:
TObject);
begin
IdTCPClient1.Host := 127.0.0.1;
IdTCPClient1.Port := 9000;
IdTCPClient1.Connect;
end;
Reader := TReaderThread.Create(True);
with Reader do
begin
FreeOnTerminate := True;
Client := Self.IdTCPClient1;
Resume;
end;