26 septiembre 2008

Enviar mensajes entre aplicaciones con IdTCPClient

Para rematar mas o menos por encima el tema de envío de mensajes entre aplicaciones (aunque se podría hacer también por FTP, IRC, TELNET, etc.) vamos a ver como enviar mensajes utilizando el componente de la clase TIdTCPClient de la paleta de componentes Indy.

A diferencia del procotolo UDP, el protocolo TCP establece una conexión estable y permanente entre el emisor y el receptor asegurando que el mensaje ha llegado a su destino. Si no se puede conectar entonces no puede enviarse el mensaje.

El único inconveniente que tiene este protocolo es que no es tan rápido como el protocolo UDP, aunque si es más seguro para comunicaciones importantes como pueden las conversaciones de un cliente de mensajería instantánea, la transferencia de datos masivos entre aplicaciones (P2P) o el envío de señales críticas entre sistemas distribuidos.

Vamos a ver como crear los dos proyectos para enviar y recibir mensajes.

CREANDO LA APLICACIÓN QUE ENVÍA EL MENSAJE

Creamos un nuevo proyecto y en el formulario principal podemos estos componentes:


En el formulario añadimos dos componentes TEdit para que el usuario escriba la IP y el puerto con el que va a realizar la conexión. También tendrá el componente de la clase TMemo llamado Mensaje donde escribiremos el texto a enviar. Por último añadimos el componente IdTCPClient que llamaremos Cliente y un botón Enviar que va ejecutar este código:

procedure TFEnviar.BEnviarClick(Sender: TObject);
begin
Cliente.Host := IP.Text;
Cliente.Port := StrToIntDef( Puerto.Text, 0 );
Cliente.Connect;
Cliente.Socket.WriteLn( Mensaje.Text );
Cliente.Disconnect;
end;

Lo que hacemos es fijar en el componente Cliente la IP y puerto elegidos por el usuario y después conectamos con el servidor antes de enviar el mensaje. Una vez conectados enviamos el texto utilizando su propiedad Socket y desconectamos.

La comunicación la inicia el programa cliente, que es el encargado de abrir la conexión y es recibida por el programa servidor que tiene ya un puerto abierto en escucha (hemos puesto el 80) esperando a que alguien contacte con él. Una vez establecida la conexión puede comenzar la transferencia de datos.

Si los mensajes se van a enviar muy a menudo, no es necesario que el cliente conecte y desconecte continuamente, sino que podemos dejar la conexión abierta:

procedure TFEnviar.BEnviarClick(Sender: TObject);
begin
Cliente.Host := IP.Text;
Cliente.Port := StrToIntDef( Puerto.Text, 0 );

if not Cliente.Connected then
Cliente.Connect;

Cliente.Socket.WriteLn( Mensaje.Text );
end;

Vamos a ver ahora como implementar el servidor.

CREANDO LA APLICACIÓN QUE RECIBE EL MENSAJE

Hacemos un nuevo proyecto con este formulario:


En este formulario vamos a insertar dos componentes:

- Un componente TMemo llamado Mensaje que va contener el texto recibido.

- Un componente IdTCPServer que llamaremos Servidor.

Al servidor le vamos a poner en su propiedad Port el valor 80. Después lo activamos poniendo su propiedad Active a True.

En el evento OnExecute del componente Servidor se ejecutará este código:

procedure TFRecibir.ServidorExecute(AContext: TIdContext);
var
sMensaje: String;
begin
sMensaje := AContext.Connection.Socket.ReadLn;
Mensaje.Lines.Add( 'De: ' + AContext.Binding.PeerIP );
Mensaje.Lines.Add( 'Mensaje: ' + sMensaje );
end;
Una aclaración: Para que este evento funcione correctamente hay que añadir en nuestro formulario un enlace a la unidad IdContext ya que sino lo hacemos nos dará un error al compilar. De hecho, esta unidad debería haberse insertado automáticamente en el código al añadir el componente IdTCPServer en el formulario. Un tirón de orejas para los programadores de los componentes Indy.

En este procedimiento guardo en la variable sMensaje el texto que envía el cliente a través del socket y luego imprimo en pantalla la IP del emisor y su mensaje.

Ejecutamos ambos programas y pulsamos el botón Enviar:


Al igual que vimos en el envío de mensajes con el protocolo UDP, si el mensaje se va a enviar entre dos aplicaciones que se encuentran en el mismo PC sólo hay que poner como dirección IP la 127.0.0.1.

Con los tres métodos que hemos visto podemos enviar pequeños mensajes en tiempo real entre aplicaciones y separar los programas muy pesados en distintos ejecutables que en envíen la información entre si. Y como no, hacer vuestro propio MSN.

Pruebas realizadas en RAD Studio 2007.

Publicidad