Sunteți pe pagina 1din 6

Capitulo 10.

2 Programando Sockets en Delphi


http://www.hackerdude.com/courses/delphi/Cap010.2.html[15/04/2014 04:03:21 p.m.]
<-- Captulo
Copyright 1999
por David Martnez.
Todos los derechos reservados
Captulo -->
Capitulo 10.2 Programando Sockets en Delphi
Ahora crearemos un pequeo sistema de comunicacin por sockets en Delphi. Haremos un Cliente y un servidor.
La tcnica de programacin en sockets como cliente es distinta a la tcnica que se utiliza como servidor. Un servidor abre un
puerto para "escuchar", y slo comienza a interpretar datos cuando un cliente se conecta. Por otro lado, un cliente abre la
conexin y comienza a comunicarse de inmediato.
Programando el Cliente
Comenzaremos con el cliente. Seleccione "File-New-Application" y a continuacin ponga los siguientes componentes:
RichEdit (Name: "reUsuario", Align: alClient)
Memo (Name: "mmResultados", Align: alBottom, ReadOnly: True)
Splitter (Align: alBottom)
ClientSocket
Statusbar
Panel (alineado hacia arriba - alTop)
Dentro del Panel, ponga lo siguiente:
Label (Caption: "Computadora")
Edit (Name: "edtComputadora"
Speedbutton (Name: "sbConectar" )
Su interfaz de usuario tendr la siguiente apariencia (o algo parecido):
Ahora debemos decidir el puerto para comunicarnos. En una situacin donde vamos a comunicarnos con un servicio en otra
computadora, utilizaramos el puerto en el cual el servicio ejecuta (ej. 80 para web, 23 para Telnet, etc.). Pero como nosotros
vamos a escribir un servidor adems de un cliente, nos toca elegir qu puerto nos gusta ms. As que digamos que queremos el
puerto 9923. Escriba "9923" en la propiedad "Port" del ClientSocket. Necesitaremos poner el mismo puerto en nuestro servidor.
Usted puede elegir cualquier puerto, pero procure utilizar puertos que no sean
utilizados por servicios estndar, para reducir la posibilidad de que servicios
extraos accesen nuestros servidores (aunque esta posibilidad nunca puede ser
Database Workbench
upscene.com
Complete Firebird development tool. Try it and download a trial now.
Capitulo 10.2 Programando Sockets en Delphi
http://www.hackerdude.com/courses/delphi/Cap010.2.html[15/04/2014 04:03:21 p.m.]
eliminada totalmente).
Ahora que ya tenemos nuestra interfaz de usuario, debemos escribir cdigo. Comencemos por escribir algo de cdigo para
actualizar la barra de estatus: ste es el cdigo para los eventos OnConnect, OnDisconnect y OnError del ClientSocket
(recuerde que debe hacer doble-click en estos eventos para que nos genere nuestro procedimiento):
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Statusbar1.Panels[0].Text :='Conectado a ' +ClientSocket1.Host;
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Statusbar1.Panels[0].Text :='Desconectado';
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
mmResultados.Lines.Add('Error al conectar a ' +ClientSocket1.Host);
ErrorCode :=0;
end;
Como ver, este cdigo no requiere de mucha explicacin. Simplemente muestra algunas cosillas en pantalla para mantener el
estado actual de la conexin en pantalla. Ahora veamos cmo el Componente ClientSocket nos ahora muchsimo trabajo.
Primero necesitamos hacer que el SpeedButton nos conecte o desconecte del servidor de sockets. El cdigo del evento OnClick
en mi SpeedButton es como sigue:
procedure TForm1.sbConectarClick(Sender: TObject);
begin
if ClientSocket1.Active then ClientSocket1.Active :=False
else begin
ClientSocket1.Host :=edtComputadora.Text;
ClientSocket1.Active :=True;
end;
end;
Este cdigo simplemente cambia el estado del socket, conectndolo si est desconectado y viceversa. Antes de conectar, asigna
el nombre de la computadora.
Ahora tenemos un programa que puede actualizar la pantalla cuando se conecta y desconecta, as como conectarse y
desconectarse. Ahora todo lo que necesitamos es cdigo para enviar y recibir datos.
Enviar es obvio - queremos enviar cada lnea que escribimos en el RichEdit. As que simplemente utilizamos el OnKeyDown para
enviar la lnea cada vez que el usuario presiona [Enter]:
Recibir datos no es tan obvio, pero tambin es sencillo gracias a Delphi. Cada vez que nuestro Socket recibe datos, un evento
"OnRead" de tipo TSocketNotifyEvent es generado. Todo lo que tenemos que hacer es escribir en el evento OnRead del
ClientSocket.
Capitulo 10.2 Programando Sockets en Delphi
http://www.hackerdude.com/courses/delphi/Cap010.2.html[15/04/2014 04:03:21 p.m.]
procedure TForm1.reUsuarioKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// Si el usuario presion [Enter], enviamos
// la lnea anterior.
if Key =VK_Return then
ClientSocket1.Socket.SendText(
reUsuario.Lines[reUsuario.Lines.Count - 1]);
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Cada vez que el socket recibe datos,
// un evento OnRead es generado.
// Simplemente escribimos los datos que
// hemos recibido en el Memo.
mmResultados.Lines.Add(Socket.ReceiveText);
end;
Compile su programa y ejectelo. Todava no podr conectarse a nada, pero si cambia el Port al nmero 21 y se conecta a un
servidor de ftp podr ver que su cliente recibe texto de la otra computadora. Asegrese de cambiar el puerto de nuevo a 9923 y
recompilar para que se pueda conectar al servidor.
Para verificar esto, yo modifiqu el programa ligeramente (se lo dejo de tarea) :-) para que pueda especificar el puerto al cual me
voy a conectar. Despus me conecte a un servidor FTP bajo Windows llamado "Calamari", me desconect y me conect a un
servidor ftp bajo Linux llamado "Snapper".
Nuestro cliente es bastante genrico y usted puede cambiar el numero de puerto
para tratar de conectarse a distintos servidores de sockets. Recuerde que se
puede conectar a servidores de sockets en general, ya sean estos Windows, Linux,
Solaris, Mac, etctera. Usted incluso podra aadir otro EditBox con el nmero de
puerto para poderlo modificar en tiempo de ejecucin (se lo dejo de tarea, es muy
fcil).
Capitulo 10.2 Programando Sockets en Delphi
http://www.hackerdude.com/courses/delphi/Cap010.2.html[15/04/2014 04:03:21 p.m.]
Programando el Servidor
Ahora que tenemos el cliente, podemos hacer un servidor que responda a las peticiones del cliente. Un servidor de sockets
tambin es sencillo gracias a Delphi. Por ahora no nos meteremos en complejidades de hilos de ejecucin, as que nuestro
servidor slo podr mantener la conexin de un cliente a la vez (TODO: Verificar esto).
Tal como en el cliente, comience con una nueva aplicacin. Nuestro servidor no necesita nada en cuanto a interfaz de usuario,
pero pongamos un Memo (Nombre: mmClientes) y un StatusBar con un StatusPane de todas maneras, para que nos muestre
todas las peticiones mientras las recibe.
Ahora ponga un TServerSocket en la forma. Modifique la propiedad "Port" para que utilice el puerto al cual nuestros clientes van a
conectar (9923 en este ejemplo).
Su programa servidor tendr la siguiente apariencia en modo de diseo:
Ahora debemos escribir el cdigo de nuestro servidor. Primero queremos que en cuanto nuestro servidor arranque, que se ponga
a escuchar, as que utilizaremos el OnCreate y OnDestroy de la forma para Activar y Desactivar nuestro Socket,
respectivamente:
procedure TfrmServidor.FormCreate(Sender: TObject);
begin
ServerSocket1.Active :=True;
end;
procedure TfrmServidor.FormDestroy(Sender: TObject);
begin
ServerSocket1.Active :=False;
end;
Ya que tenemos a nuestro socket "escuchando", ahora debemos crear cdigo en el evento OnListen del socket del servidor, para
que nuestro servidor aada una lnea a cada lnea que nos llegue. Adems de copiarla al Memo, el servidor la enviar al revs
(hola - aloh) de regreso al cliente. Hacemos esto ltimo sencillamente para que veamos que algn procesamiento se hace en el
lado del cliente.
procedure TfrmServidor.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
sMensaje, sDeCabeza : String;
i : Integer;
begin
sMensaje :=Socket.ReceiveText;
sDeCabeza :='';
Capitulo 10.2 Programando Sockets en Delphi
http://www.hackerdude.com/courses/delphi/Cap010.2.html[15/04/2014 04:03:21 p.m.]
// Este for invierte los caracteres del mensaje
for i :=Length(sMensaje) downto 0 do
sDeCabeza :=sDeCabeza +sMensaje[i];
mmClientes.Lines.Add('"'+sMensaje+'"' +' de cabeza es "'+sDeCabeza+'"');
// Enva el menaje "al revs" de regreso al cliente.
Socket.SendText(sDeCabeza);
end;
Finalmente, aadimos un poco de cdigo a los eventos del socket para que nos actualice cuando clientes se conecten y
desconecten.
procedure TfrmServidor.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
mmClientes.Lines.Add('Conexin');
end;
procedure TfrmServidor.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
mmClientes.Lines.Add('Desconeccin');
end;
procedure TfrmServidor.ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.Panels.Items[0].Text :='Escuchando...';
end;
Ahora probemos el sistema. Ejecute el servidor y luego el cliente, y conctese a la computadora "localhost". Localhost es la
computadora local desde donde usted se encuentre. J uegue con el programa. Aqu muestro mi servidor y cliente:
Capitulo 10.2 Programando Sockets en Delphi
http://www.hackerdude.com/courses/delphi/Cap010.2.html[15/04/2014 04:03:21 p.m.]
Ahora que sabe que funciona localmente, ejecute el servidor en una mquina en su red y ejecute el cliente en otra, utilizando el
nombre de la computadora (o su direccin IP). Apunte muchos clientes al mismo servidor. Corra varios servidores y apunte cinco
clientes a cada uno. Divirtase.
Otra cosa que puede hacer para probar que usted est en realidad comunicndose con un servidor en otra computadora es usar
telnet como cliente en vez de su propio programa. Simplemente conctese al puerto 9923 en localhost utilizando Telnet (dentro
de su grupo de Accesorios en el men de programas de Windows) y comience a escribir. Tome en cuenta que Telnet enva cada
caracter que usted escribe, as que el "Al reves" slo servir si copia y pega texto de otra aplicacin (lo cual manda todos los
caracteres en la misma cadena de texto).
Ahora usted sabe lo bsico acerca de programacin de sockets en Delphi. La programacin de sockets en s es lo sencillo, pero
lo dificil es el manejar trfico (lo cual requerir hilos de ejecucin) y la comunicacin entre el cliente y el servidor (definir
comandos y respuestas, seguridad, etctera). Pero mientras, nos hemos divertido y aprendido bastante, no cree?
Copiar el Cdigo fuente (17K, formato Zip) para esta seccin
Captulo -->
Delphi Secure Components
devart.com
Native Delphi components for SSH and SSL support

S-ar putea să vă placă și