Sockets en delphi

887 views
712 views

Published on

Material para desarrollar sockets en Delphi

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
887
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Sockets en delphi

  1. 1. Sockets en DelphiAhora crearemos un pequeño sistema de comunicación por sockets en Delphi. Haremosun Cliente y un servidor.La técnica de programación en sockets como cliente es distinta a la técnica que seutiliza como servidor. Un servidor abre un puerto para "escuchar", y sólo comienza ainterpretar datos cuando un cliente se conecta. Por otro lado, un cliente abre la conexióny comienza a comunicarse de inmediato. Programando el ClienteComenzaremos con el cliente. Seleccione "File-New-Application" y a continuaciónponga 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: o Label (Caption: "Computadora") o Edit (Name: "edtComputadora" o Speedbutton (Name: "sbConectar" )Su interfaz de usuario tendrá la siguiente apariencia (o algo parecido):Ahora debemos decidir el puerto para comunicarnos. En una situación donde vamos acomunicarnos con un servicio en otra computadora, utilizaríamos el puerto en el cual elservicio ejecuta (ej. 80 para web, 23 para Telnet, etc.). Pero como nosotros vamos a
  2. 2. escribir un servidor además de un cliente, nos toca elegir qué puerto nos gusta más. Asíque digamos que queremos el puerto 9923. Escriba "9923" en la propiedad "Port" delClientSocket. Necesitaremos poner el mismo puerto en nuestro servidor. Usted puede elegir cualquier puerto, pero procure utilizar puertos que no sean utilizados por servicios estándar, para reducir la posibilidad de que servicios extraños accesen nuestros servidores (aunque esta posibilidad nunca puede ser eliminada totalmente).Ahora que ya tenemos nuestra interfaz de usuario, debemos escribir código.Comencemos por escribir algo de código para actualizar la barra de estatus: Éste es elcódigo para los eventos OnConnect, OnDisconnect y OnError del ClientSocket(recuerde que debe hacer doble-click en estos eventos para que nos genere nuestroprocedimiento):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 código no requiere de mucha explicación. Simplemente muestraalgunas cosillas en pantalla para mantener el estado actual de la conexión en pantalla.Ahora veamos cómo el Componente ClientSocket nos ahora muchísimo trabajo.Primero necesitamos hacer que el SpeedButton nos conecte o desconecte del servidor desockets. El código 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;
  3. 3. end;Este código simplemente cambia el estado del socket, conectándolo si está desconectadoy viceversa. Antes de conectar, asigna el nombre de la computadora.Ahora tenemos un programa que puede actualizar la pantalla cuando se conecta ydesconecta, así como conectarse y desconectarse. Ahora todo lo que necesitamos escódigo para enviar y recibir datos.Enviar es obvio - queremos enviar cada línea que escribimos en el RichEdit. Así quesimplemente utilizamos el OnKeyDown para enviar la línea cada vez que el usuariopresiona [Enter]:Recibir datos no es tan obvio, pero también es sencillo gracias a Delphi. Cada vez quenuestro Socket recibe datos, un evento "OnRead" de tipo TSocketNotifyEvent esgenerado. Todo lo que tenemos que hacer es escribir en el evento OnRead delClientSocket. procedure TForm1.reUsuarioKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin // Si el usuario presionó [Enter], enviamos // la línea 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 ejecútelo. Todavía no podrá conectarse a nada, pero si cambia elPort al número 21 y se conecta a un servidor de ftp podrá ver que su cliente recibe textode la otra computadora. Asegúrese de cambiar el puerto de nuevo a 9923 y recompilarpara que se pueda conectar al servidor.Para verificar esto, yo modifiqué el programa ligeramente (se lo dejo de tarea) :-) paraque pueda especificar el puerto al cual me voy a conectar. Después me conecte a unservidor FTP bajo Windows llamado "Calamari", me desconecté y me conecté a unservidor ftp bajo Linux llamado "Snapper".
  4. 4. Nuestro cliente es bastante genérico 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, etcétera. Usted incluso podría añadir otro EditBox con el número de puerto para poderlo modificar en tiempo de ejecución (se lo dejo de tarea, es muy fácil). Programando el ServidorAhora que tenemos el cliente, podemos hacer un servidor que responda a las peticionesdel cliente. Un servidor de sockets también es sencillo gracias a Delphi. Por ahora nonos meteremos en complejidades de hilos de ejecución, así que nuestro servidor sólopodrá mantener la conexión de un cliente a la vez (TODO: Verificar esto).Tal como en el cliente, comience con una nueva aplicación. Nuestro servidor nonecesita 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 muestretodas las peticiones mientras las recibe.Ahora ponga un TServerSocket en la forma. Modifique la propiedad "Port" para queutilice el puerto al cual nuestros clientes van a conectar (9923 en este ejemplo).Su programa servidor tendrá la siguiente apariencia en modo de diseño:
  5. 5. Ahora debemos escribir el código de nuestro servidor. Primero queremos que en cuantonuestro servidor arranque, que se ponga a escuchar, así que utilizaremos el OnCreate yOnDestroy 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 código en elevento OnListen del socket del servidor, para que nuestro servidor añada una línea acada línea que nos llegue. Además de copiarla al Memo, el servidor la enviará al revés(hola - aloh) de regreso al cliente. Hacemos esto último sencillamente para que veamosque algún 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 := ; // 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+"); // Envía el menaje "al revés" de regreso al cliente. Socket.SendText(sDeCabeza);end;
  6. 6. Finalmente, añadimos un poco de código a los eventos del socket para que nos actualicecuando clientes se conecten y desconecten.procedure TfrmServidor.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);begin mmClientes.Lines.Add(Conexión);end;procedure TfrmServidor.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);begin mmClientes.Lines.Add(Desconección);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 conéctese a lacomputadora "localhost". Localhost es la computadora local desde donde usted seencuentre. Juegue con el programa. Aquí muestro mi servidor y cliente:
  7. 7. Ahora que sabe que funciona localmente, ejecute el servidor en una máquina en su red yejecute el cliente en otra, utilizando el nombre de la computadora (o su dirección IP).Apunte muchos clientes al mismo servidor. Corra varios servidores y apunte cincoclientes a cada uno. Diviértase.Otra cosa que puede hacer para probar que usted está en realidad comunicándose con unservidor en otra computadora es usar telnet como cliente en vez de su propio programa.Simplemente conéctese al puerto 9923 en localhost utilizando Telnet (dentro de sugrupo de Accesorios en el menú de programas de Windows) y comience a escribir.Tome en cuenta que Telnet envía cada caracter que usted escribe, así que el "Al reves"sólo servirá si copia y pega texto de otra aplicación (lo cual manda todos los caracteresen la misma cadena de texto).Ahora usted sabe lo básico acerca de programación de sockets en Delphi. Laprogramación de sockets en sí es lo sencillo, pero lo dificil es el manejar tráfico (lo cualrequerirá hilos de ejecución) y la comunicación entre el cliente y el servidor (definircomandos y respuestas, seguridad, etcétera). Pero mientras, nos hemos divertido yaprendido bastante, ¿no cree?

×