12/09/2021 (Versión 3.1)
25/05/2021 (Versión 3.0)
13/03/2021 (Versión 2.6)
01/02/2021 (Versión 2.5)
18/12/2020 (Versión 2.4)
28/11/2020
31/10/2020 (Versión 2.3)
27/10/2020 (Versión 2.2)
26/10/2020 (Versión 2.1)
09/10/2020
06/10/2020
24/09/2020
16/07/2020
12/07/2020
03/05/2020
19/04/2020
31/03/2019
Estos componentes le permiten establecer comunicación asíncrona TCP Socket entre computadoras en la red LAN o Internet.
DzTCPServer y DzTCPClient utilizan TClientSocket y TServerSocket de la unidad System.Win.ScktComp. Estas clases están disponibles en Delphi, pero es un poco difícil de implementar porque necesita leer y escribir datos del búfer y no hay muchos recursos disponibles.
El uso es muy sencillo. Necesitará colocar el componente del servidor en la aplicación del lado del servidor y el componente del cliente en la aplicación del lado del cliente y comenzar a codificar los mensajes de comando.
Puedes hacer muchas cosas, como aplicaciones de chat, aplicaciones de comandos remotos, aplicaciones de monitoreo remoto e incluso enviar transmisiones como archivos. El cielo es el límite.
Estructura de caché : cuando utiliza el componente de socket nativo de Delphi, si envía varios mensajes simultáneamente, el destinatario puede recibir los mensajes agrupados o divididos, por lo que siempre debe solucionar este problema. DzSocket controla los mensajes de socket automáticamente, por lo que siempre recibe un evento por mensaje.
KeepAlive : cuando establece una conexión de socket, si un lado de la conexión se pierde, el otro lado no se comunicará hasta que se intente enviar un nuevo mensaje. Por lo tanto, puede implementar un ping manual, pero esto generará mucho trabajo innecesario. DzSocket tiene el recurso KeepAlive, que permite el protocolo keep-alive nativo de la red.
Comandos : el socket nativo le permite enviar segmentos de cadena, pero si desea enviar comandos e identificar estos comandos en el otro lado de la conexión, deberá implementarlo manualmente. Con DzSocket , tienes un comando Char siempre disponible. Listo, rápido y fácil.
Liberación automática de objetos de datos en el servidor : la lista de objetos del cliente disponible en el componente del servidor tiene una propiedad de puntero, que le permite almacenar información sobre la conexión del cliente, generalmente utilizando un objeto. Con DzSocket , no necesita preocuparse por la destrucción de este objeto. Sólo necesita habilitar una propiedad para que se encargue de estos objetos.
Enumerador : el componente del servidor nativo no tiene un enumerador para iterar las conexiones de la lista de clientes. Usando DzSocket , simplemente puede hacer un for .. in
directamente en el componente del servidor, iterando las conexiones de la lista de clientes.
SendAll : envía fácilmente comandos a todos los clientes. Además de eso, puede usar SendAllEx
para enviar comandos a todos los clientes excepto a una conexión de cliente específica.
Monitor de conexión : hay un evento de Conexión perdida que le permite saber cuándo se cerró la conexión sin la solicitud del cliente.
Compatibilidad con Unicode : el componente nativo de Delphi no admite el envío de mensajes utilizando cadenas Unicode, a menos que escriba su propio código para convertir el flujo de datos en ambos lados. Esto es realmente aburrido y lleva tiempo. Con DzSocket puede simplemente enviar un mensaje de texto utilizando directamente el parámetro del método como tipo de cadena, por lo que Delphi considerará los caracteres Unicode como WideString de forma predeterminada.
Control de inicio de sesión : puede controlar la autenticación/autorización del cliente mediante eventos simples y puede enviar información de datos adicional para controlar el acceso del cliente al servidor.
Reconexión automática : el componente del cliente puede reconectarse automáticamente al servidor cuando se pierde la conexión, simplemente habilitando una propiedad.
¡Y mucho más!
Soporta Delphi XE3..Delphi 11
AutoFreeObjs: Boolean
(público) = Si está utilizando la propiedad Data
de los sockets del cliente en el servidor para asignar objetos, puede habilitar esta opción, de modo que el componente se encargue de la destrucción del objeto cuando finalice el socket del cliente. Recuerde, si esta opción está habilitada y la propiedad Datos del socket está asignada, el componente presumirá siempre Datos como objeto.
EnumeratorOnlyAuth: Boolean
(público) = cuando se utiliza el enumerador de componentes for in
, omite a los clientes que aún no están autenticados.
KeepAlive: Boolean
= Permitir habilitar el recurso nativo del socket KeepAlive. Esto enviará una señal de mantenimiento de actividad utilizando la propiedad KeepAliveInterval.
KeepAliveInterval: Integer
= Especifica el intervalo de KeepAlive en milisegundos (predeterminado 15000/15 segundos ).
Port: Word
= Especifica el puerto TCP de escucha del servidor. Esta propiedad es necesaria para iniciar el socket del servidor.
Connection[Index: Integer]: T DzSocket
(público) = Devuelve el objeto de conexión del cliente T DzSocket por índice.
Count: Integer
(público) = Devuelve el recuento de la lista de conexiones del cliente.
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
Este evento se activa cuando un cliente se conecta al servidor. El parámetro Socket
es el socket del cliente.
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
Este evento se activa cuando un cliente se desconecta del servidor. El parámetro Socket
es el socket del cliente.
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Este evento se activa cuando ocurre un error en la conexión de un cliente. El parámetro Socket
es el socket del cliente.
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Este evento se activa cuando un cliente envía un mensaje al servidor. El parámetro Socket
es el socket del cliente.
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
Este evento se activa cuando un cliente acaba de conectarse al servidor. Si en el lado del cliente se maneja OnLoginRequest
, la información de datos enviada se recibirá aquí en el parámetro RequestData
. Puede cambiar el parámetro Accept
(el valor predeterminado inicial es Verdadero) para aceptar o rechazar la conexión del cliente. Además de eso, puede utilizar el parámetro ResponseData
para enviar al cliente cierta información de datos. El cliente recibirá la bandera aceptada y la información de datos en el evento OnLoginResponse
. Si el parámetro Accept
sigue siendo Verdadero, la propiedad Auth
del socket se establecerá en Verdadero. De lo contrario, el servidor interrumpirá la conexión del cliente.
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
Este evento se activa inmediatamente después de que un cliente recibe autorización para ingresar al servidor. Incluso si no está utilizando eventos de inicio de sesión, recuerde: solo después de que el cliente esté autorizado a ingresar al servidor, el cliente podrá enviar mensajes. De lo contrario, el servidor ignorará los mensajes del cliente.
procedure Open ;
Active el puerto del socket de escucha del servidor.
procedure Close ;
Apague el puerto del socket de escucha del servidor.
procedure Lock ;
procedure Unlock ;
Utilice estos métodos para iterar la lista de Conexiones (seguro para subprocesos), porque una conexión puede cerrarse cuando está iterando la lista de conexiones.
Ejemplo:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
Además, el componente TDzTCPServer tiene un enumerador predeterminado que apunta a la Lista de conexiones, lo que da como resultado un objeto T DzSocket . Por lo tanto, puede iterar la lista de conexiones usando una declaración
for .. in
, tal como en el ejemplo anterior.
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Envía comandos y mensajes a un socket de cliente especificado por el parámetro Socket
. Debe utilizar el parámetro Cmd
para especificar un carácter de comando que será recibido por el cliente. El parámetro A
es opcional y le permite especificar un texto de mensaje.
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
Envíe un mensaje a todos los clientes autenticados.
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Envíe un mensaje a todos los clientes autenticados, excepto al cliente especificado por el parámetro Exclude
.
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
Devuelve el objeto T DzSocket por ID de identificador de socket.
function GetAuthConnections : Integer;
Recupera solo el recuento de conexiones autenticadas.
AutoReconnect: Boolean
= Si está habilitado, cuando el cliente pierde la conexión con el servidor, el socket intentará volver a conectarse automáticamente.
AutoReconnectInterval: Integer
= Especifica el tiempo en milisegundos para esperar un nuevo intento de reconexión (predeterminado 10000/10 segundos ).
AutoReconnectAttempts: Integer
= Cuántas veces intentar volver a conectarse después de perder la conexión. Deje el valor 0
para volver a intentarlo infinitamente.
KeepAlive: Boolean
= Permitir habilitar el recurso nativo del socket KeepAlive. Esto enviará una señal de mantenimiento de actividad utilizando la propiedad KeepAliveInterval.
KeepAliveInterval: Integer
= Especifica el intervalo de KeepAlive en milisegundos (predeterminado 15000/15 segundos ).
Host: String
= Especifica la IP o el nombre de host (DNS) para conectarse al servidor. Esta propiedad es necesaria para conectarse al socket del servidor.
Port: Word
= Especifica el puerto TCP de conexión del cliente, que el servidor está escuchando o el puerto está asignado. Esta propiedad es necesaria para conectarse al socket del servidor.
Connected: Boolean
(público) = Devuelve verdadero si se establece la conexión.
SocketHandle: TSocket
(público) = Devuelve el ID del identificador de socket de la conexión.
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
Este evento se activa cuando el cliente establece la conexión con el servidor.
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
Este evento se activa cuando se pierde la conexión entre el cliente y el servidor. Esto ocurrirá si el cliente detecta que la conexión se cerró sin un comando de desconexión por parte del propio cliente.
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
Este evento se activa cuando el cliente se desconecta del servidor, incluso si se pierde la conexión. WasConnected
le permite saber si el evento OnDisconnect provino de una conexión establecida, porque este evento se activará incluso si intenta conectarse y la conexión no se establece exitosamente.
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Este evento se activa cuando ocurre un error en la conexión del cliente. Siempre se recomienda configurar este evento; de lo contrario, el componente generará errores asincrónicos no controlados.
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Este evento se activa cuando el cliente recibe un mensaje del servidor.
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
Este evento se activa justo después de que el cliente se conecta al servidor. Significa que el servidor está solicitando información de datos de inicio de sesión, por lo que puede verificar estos datos y elegir aceptar o cancelar la conexión del cliente. Debe completar el parámetro Data
si desea manejar esta información en el servidor.
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
Este evento se activa cuando el servidor acepta o rechaza la conexión del cliente. Puede verificar este resultado en el parámetro Accepted
y el servidor puede enviar al cliente cierta información de datos en el parámetro Data
.
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
Ocurre cuando la propiedad AutoReconnect
está habilitada y se pierde una conexión, después de los milisegundos AutoReconnectInterval
. Si el intento de reconectarse falla, el evento se activará sucesivamente hasta que se establezca una conexión. Puede cancelar los intentos de reconexión cambiando la propiedad Cancel
a True
en el evento de reconexión o llamando al método StopReconnection
.
procedure Connect ;
Se conecta al servidor.
procedure Disconnect ;
Se desconecta del servidor.
procedure StopReconnection ;
Detiene los intentos de reconexión cuando AutoReconnect
está habilitado y se pierde una conexión.
procedure Send ( const Cmd: Char; const A: String = ' ' );
Envía comandos y mensajes al servidor. Debe utilizar el parámetro Cmd
para especificar un carácter de comando que será recibido por el servidor. El parámetro A
es opcional y le permite especificar un texto de mensaje.
Importante: El servidor no recibirá mensajes mientras el cliente aún no esté autenticado, incluso si ya está conectado.
Sólo disponible en Delphi XE6 o superior
Cuando utiliza el método Send
desde el servidor o el socket del cliente, hay un parámetro String
que le permite enviar datos. Hay dos métodos globales que puede utilizar para enviar varios datos a la vez:
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
Remitente:
var
I: Integer;
S: String;
begin
I := 123 ;
S := ' Test ' ;
DzTCPClientTest.Send( ' M ' , ArrayToData([I, S]));
end ;
Receptor:
procedure DzTCPServerTestClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
var MsgArray: TMsgArray;
begin
MsgArray := DataToArray(A);
ShowMessage(Format( ' Number = %d / String = %s ' , [MsgArray[ 0 ], MsgArray[ 1 ]]));
end ;
Las funciones de conversión utilizan JSON internamente para garantizar que los caracteres de las partes escapen para garantizar el empaquetado/desempaquetado de matrices sin cambios de contenido. Por lo tanto, no necesita preocuparse por el contenido de las piezas de tipo variante.
Consulte la aplicación de demostración y observe el comando Enviar impresión para saber cómo enviar y recibir flujo de datos y también cómo utilizar la compresión para aumentar la velocidad de comunicación.