Comunicación por Sockets TCP/IP
Cuando trabajamos en programación, con Delphi para ser más exactos, es común encontrarnos con la necesidad de enviar información de un lugar a otro a través de una red (Internet, intranet y local); para lograr esta comunicación, es posible utilizar los protocolos (TCP o UDP), pero en este artículo nos vamos a enfocar en el protocolo de comunicación TCP (Transmission Control Protocol), el cual permite la comunicación entre los ordenadores pertenecientes a una red y para lograrlo es necesario que se cumplan algunos recursos, que originan el concepto de Socket. Es allí, cuando comenzamos la búsqueda de los componentes apropiados que nos ayuden a cumplir tal propósito, para ello, mostraré características de los componentes Indy y NetCom7.
¿Qué es TCP/IP?
TCP/IP es un conjunto de reglas estandarizadas que permiten a los equipos comunicarse en una red como Internet. TCP/IP hace referencia a los dos protocolos más trascendentes de este grupo: el conocido como Protocolo de Control de Transmisión (TCP) y el llamado Protocolo de Internet (sigla IP).
¿Qué es Socket?
Un socket es un proceso o hilo existente en la máquina cliente y en la máquina servidora, que sirve en última instancia para que el programa servidor y el cliente lean y escriban la información. Esta información será la transmitida por las diferentes capas de red.
Para establecer una conexión entre dos procesos es necesario que cumpla con un par de requisitos esenciales: el primero, un par de direcciones IP, que identifican la computadora de origen y la remota y segundo, un par de números de puerto, que identifican a un programa dentro de cada computadora.
Los sockets permiten implementar una arquitectura cliente-servidor. La comunicación debe ser iniciada por uno de los procesos que se denomina programa «cliente». El segundo proceso espera a que otro inicie la comunicación, por este motivo se denomina programa «servidor».
Componentes DELPHI
Podemos encontrar muchos componentes para Delphi que nos ayuden a establecer una comunicación por Sockets TCP/IP, como ICS/Midware, Delphi socket components, Indy, Netcom, entre otros, pero en este artículo pretendo dar a conocer características de dos de ellos, los cuales funcionan muy bien para dicho fin.
Componentes INDY
Indy es una biblioteca de comunicaciones cliente/servidor de código abierto que admite sockets TCP/ UDP/RAW, así como más de 100 protocolos de nivel superior, incluidos SMTP, POP3, IMAP, NNTP, HTTP, FTP y muchos más. Indy está escrito en Delphi pero está disponible para C ++ Builder, Delphi, FreePascal, .NET y Kylix. El conjunto de componentes se divide en tres grupos: cliente (Indy Client), servidor (Indy Servers) y auxiliar (Indy Misc).
Para establecer la conexión Cliente/Servidor son necesarios 2 componentes: TidTCPServer, se utiliza en el lado del servidor, éste crea un hilo de escucha que está separado del hilo principal del programa. El hilo, escucha las solicitudes entrantes del cliente y para cada cliente que responde genera un nuevo hilo de conexión.
//Evento IdTCPServer1Execute<br />
Acontext.Connection.IOHandler.LargeStream := True;<br />
AContext.Connection.IOHandler.ReadStream(vArchivo, -1, false);//vArchivo: TStringStream
El componente TIdTCPServer es multithread por definición y no se necesitan procedimientos adicionales que manejen los hilos.
El segundo componente es el TidTCPClient: encapsula un cliente TCP (Transmission Control Protocol) incluyendo soporte para sockets.
//enviar el mensaje al servidor - vArchivo: TStringStream<br />
IdTCPClient1.IOHandler.Write(vArchivo, 0, True); <br />
//recibe respuesta desde el servidor - Respuesta: tStringStream<br />
IdTCPClient1.IOHandler.ReadStream(Respuesta, -1,false);
Los componentes de Indy ponen gran énfasis en la seguridad y confiabilidad de los datos. La tecnología de Indy utiliza el bloqueo de operaciones de lectura y escritura, cualquier operación de Connect utilizada espera a que se complete la conexión.
Componentes NetCom7
NetCom7 es un conjunto de componentes que permiten implementar comunicaciones por Socket TCP/IP, prometiendo una velocidad inigualable gracias a que no usa ni genera un hilo por conexión, es decir que se pueden tener tantas conexiones en vivo como desee.
Para establecer dicha conexión, a igual que Indy son necesarios dos componentes:
TncServerSource: este es el componente utilizado en el programa servidor.
//Evento ncServerSourceHandleCommand<br />
temp.WriteData(aData, High(aData));//temp: TstringStream
TncClientSource : componente del lado del cliente
//enviar mensaje al servidor - vArchivo : TstringStream;<br />Respuesta := ncClientSource.ExecCommand(0, vArchivo.Bytes);<br />//en Respuesta queda asignado el valor que recibe desde el servidor<br />Memo1.Lines.Add(' Respuesta: ' + StringOf(Respuesta)); //Respuesta: TBytes;
NetCom7, promete especial cuidado a los problemas de desconexión. Contiene una propiedad Reconnect y una propiedad KeepAlive que garantiza que cuando un cliente se desconecta por cualquier motivo, intenta automáticamente volver a conectarse de forma transparente y sin afectar el rendimiento de la aplicación principal. De esta manera el servidor no tiene que preocuparse de mantener conectados sus clientes.
Otra ventaja es que la compresión y el cifrado también son estándar con estos componentes y no se requieren bibliotecas adicionales, la verdad, resulta bastante útil poder establecer dichas propiedades en los mismos componentes y no tener que realizar un trabajo adicional.
Al realizar un comparativo entre estos dos componentes Delphi Indy vs NetCom7, aunque no tengo la última palabra en afirmar cuál es mejor que otro, tras realizar varias pruebas, los resultados arrojados por Indy al enviar mediante ciclos un archivo con gran tamaño, fue siempre inferior al tiempo arrojado por NetCom7.
Espero este artículo haya sido un aporte más a tu conocimiento y recuerda, si necesitas una consultoría avanzada sobre Delphi puedes contactar con nosotros en nuestro formulario de contacto de Abatic
Deja una respuesta