12/09/2021 (Versão 3.1)
25/05/2021 (Versão 3.0)
13/03/2021 (versão 2.6)
01/02/2021 (versão 2.5)
18/12/2020 (versão 2.4)
28/11/2020
31/10/2020 (versão 2.3)
27/10/2020 (versão 2.2)
26/10/2020 (versão 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
Esses componentes permitem estabelecer comunicação assíncrona do soquete TCP entre computadores na rede LAN ou na Internet.
O DzTCPServer e DzTCPClient usam TClientSocket e TServerSocket da unidade System.Win.ScktComp. Essas classes estão disponíveis no Delphi, mas são um pouco difíceis de implementar porque você precisa ler e escrever dados de buffer e não há muitos recursos disponíveis.
O uso é muito simples. Você precisará descartar o componente do servidor no aplicativo do lado do servidor e o componente do cliente no aplicativo do lado do cliente e começar a codificar as mensagens de comando.
Você pode fazer muitas coisas, como aplicativo de bate-papo, aplicativo de comandos remotos, aplicativo de monitoramento remoto e até mesmo enviar fluxos como arquivos. O céu é o limite.
Estrutura de cache : Quando você está usando o componente de soquete nativo do Delphi, se você enviar várias mensagens simultaneamente, o destinatário poderá receber as mensagens agrupadas ou divididas, então você precisa sempre lidar com esse problema. DzSocket controla mensagens de soquete automaticamente, então você sempre recebe um evento por mensagem.
KeepAlive : Quando você estabelece uma conexão de soquete, se um lado da conexão for perdido, o outro lado não será comunicado até que uma nova mensagem tente ser enviada. Então você pode implementar um ping manual, mas isso dará muito trabalho desnecessário. DzSocket possui o recurso KeepAlive, habilitando o protocolo keep-alive nativo da rede.
Comandos : O soquete nativo permite enviar segmento de string, mas se você quiser enviar comandos e identificar esses comandos no outro lado da conexão, será necessário implementar isso manualmente. Com DzSocket , você tem um comando Char sempre disponível. Pronto, rápido e fácil.
Auto Free Data Objects on Server : A lista de objetos Client disponível no componente Server possui uma propriedade Pointer, permitindo armazenar informações sobre a conexão do cliente, geralmente usando um objeto. Com DzSocket , você não precisa se preocupar com a destruição desse objeto. Você só precisa habilitar uma propriedade para cuidar desses objetos.
Enumerador : O componente nativo do Servidor não possui um enumerador para iterar conexões da Lista de Clientes. Usando DzSocket , você pode simplesmente fazer um for .. in
diretamente no componente Server, iterando as conexões da lista de clientes.
SendAll : Envie comandos facilmente para todos os clientes. Além disso, você pode usar SendAllEx
para enviar comandos a todos os clientes, exceto uma conexão de cliente específica.
Monitor de Conexão : Existe um evento de Conexão Perdida que permite saber quando a conexão foi encerrada sem a solicitação do cliente.
Suporte Unicode : O componente nativo Delphi não suporta o envio de mensagens usando strings Unicode, a menos que você escreva seu próprio código para converter o fluxo de dados em ambos os lados. Isso é realmente chato e leva tempo. Usando DzSocket você pode simplesmente enviar o texto da mensagem usando diretamente o parâmetro do método como tipo de string, então o Delphi considerará os caracteres Unicode como WideString por padrão.
Controle de login : você pode controlar a autenticação/autorização do cliente usando eventos simples e pode enviar informações de dados extras para controlar o acesso do cliente ao servidor.
Reconexão automática : O componente cliente pode se reconectar automaticamente ao servidor quando a conexão for perdida, apenas habilitando uma propriedade.
E muito mais!
Suporta Delphi XE3..Delphi 11
AutoFreeObjs: Boolean
(public) = Se você estiver usando a propriedade Data
dos soquetes do cliente no servidor para atribuir objetos, você pode ativar esta opção, para que o componente cuide da destruição do objeto quando o soquete do cliente terminar. Lembre-se, se esta opção estiver habilitada e a propriedade Data do soquete for atribuída, o componente sempre presumirá Data como objeto.
EnumeratorOnlyAuth: Boolean
(public) = Ao usar o enumerador de componente for in
, ignora clientes ainda não autenticados.
KeepAlive: Boolean
= Permitir ativar o recurso nativo do soquete KeepAlive. Isso enviará um sinal de keep-alive usando a propriedade KeepAliveInterval.
KeepAliveInterval: Integer
= Especifica o intervalo KeepAlive em milissegundos (padrão 15000/15 segundos ).
Port: Word
= Especifica a porta TCP de escuta do servidor. Esta propriedade é necessária para iniciar o soquete do servidor.
Connection[Index: Integer]: T DzSocket
(público) = Retorna o objeto de conexão do cliente T DzSocket por Índice.
Count: Integer
(público) = Retorna a contagem da lista de conexões do cliente.
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
Este evento é acionado quando um cliente se conecta ao servidor. O parâmetro Socket
é o soquete do cliente.
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
Este evento é acionado quando um cliente se desconecta do servidor. O parâmetro Socket
é o soquete do cliente.
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Este evento é acionado quando ocorre um erro na conexão do cliente. O parâmetro Socket
é o soquete do cliente.
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Este evento é acionado quando um cliente envia uma mensagem ao servidor. O parâmetro Socket
é o soquete do cliente.
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
Este evento é acionado quando um cliente acaba de se conectar ao servidor. Se no lado do cliente for tratado o OnLoginRequest
, as informações dos dados enviados serão recebidas aqui no parâmetro RequestData
. Você pode alterar o parâmetro Accept
(o valor padrão inicial é True) para aceitar ou rejeitar a conexão do cliente. Além disso, você pode utilizar o parâmetro ResponseData
para enviar ao cliente algumas informações de dados. A flag aceita e as informações dos dados serão recebidas pelo cliente no evento OnLoginResponse
. Se o parâmetro Accept
permanecer True, a propriedade Socket Auth
será definida como True. Caso contrário, a conexão do cliente será interrompida pelo servidor.
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
Este evento é acionado logo após um cliente ser autorizado no servidor. Mesmo se você não estiver usando eventos de login, lembre-se: somente depois que o cliente for autorizado no servidor, o cliente poderá enviar mensagens. Caso contrário, o servidor irá ignorar quaisquer mensagens do cliente.
procedure Open ;
Ative a porta do soquete de escuta do servidor.
procedure Close ;
Desligue a porta do soquete de escuta do servidor.
procedure Lock ;
procedure Unlock ;
Use esses métodos para iterar a lista de conexões (thread-safe), pois uma conexão pode ser fechada quando você estiver iterando a lista de conexões.
Exemplo:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
Além disso, o componente TDzTCPServer possui um enumerador padrão apontando para a Lista de Conexões, resultando em um objeto T DzSocket . Portanto, você pode iterar a lista de conexões usando uma instrução
for .. in
, assim como no exemplo anterior.
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Envia comandos e mensagens para um soquete de cliente especificado pelo parâmetro Socket
. Você deve usar o parâmetro Cmd
para especificar um caractere de comando que será recebido pelo cliente. O parâmetro A
é opcional e permite especificar um texto de mensagem.
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
Envie uma mensagem para todos os clientes autenticados.
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Envia uma mensagem para todos os clientes autenticados, exceto para o cliente especificado pelo parâmetro Exclude
.
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
Retorna o objeto T DzSocket por ID do identificador de soquete.
function GetAuthConnections : Integer;
Recupera apenas a contagem de conexões autenticadas.
AutoReconnect: Boolean
= Se habilitado, quando o cliente perder a conexão com o servidor, o soquete tentará se reconectar automaticamente.
AutoReconnectInterval: Integer
= Especifica o tempo em milissegundos para aguardar uma nova tentativa de reconexão (padrão 10000/10 segundos ).
AutoReconnectAttempts: Integer
= Quantas vezes tentar reconectar após perda de conexão. Deixe o valor 0
para tentar novamente infinitamente.
KeepAlive: Boolean
= Permitir ativar o recurso nativo do soquete KeepAlive. Isso enviará um sinal de keep-alive usando a propriedade KeepAliveInterval.
KeepAliveInterval: Integer
= Especifica o intervalo KeepAlive em milissegundos (padrão 15000/15 segundos ).
Host: String
= Especifica o IP ou nome do host (DNS) para conexão ao servidor. Esta propriedade é necessária para conectar-se ao soquete do servidor.
Port: Word
= Especifica a porta TCP de conexão do cliente, que o servidor está escutando ou a porta está mapeada. Esta propriedade é necessária para conectar-se ao soquete do servidor.
Connected: Boolean
(público) = Retorna verdadeiro se a conexão for estabelecida.
SocketHandle: TSocket
(public) = Retorna o ID do identificador de soquete da conexão.
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
Este evento é acionado quando o cliente estabelece a conexão com o servidor.
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
Este evento é acionado quando a conexão entre cliente e servidor é perdida. Isso ocorrerá se o cliente detectar que a conexão foi encerrada sem um comando de desconexão do próprio cliente.
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
Este evento é acionado quando o cliente se desconecta do servidor, mesmo que a conexão seja perdida. O WasConnected
permite saber se o evento OnDisconnect veio de uma conexão estabelecida, pois este evento será disparado mesmo se você estiver tentando se conectar e a conexão não for estabelecida com sucesso.
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Este evento é disparado quando ocorre um erro na conexão do cliente. É sempre recomendado definir este evento, caso contrário o componente irá gerar erros assíncronos não controlados.
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Este evento é acionado quando o cliente recebe uma mensagem do servidor.
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
Este evento é acionado logo após o cliente se conectar ao servidor. Isso significa que o servidor está solicitando informações de dados de login, para que possa verificar esses dados e escolher aceitar ou cancelar a conexão do cliente. Você deve preencher o parâmetro Data
se quiser tratar esta informação no servidor.
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
Este evento é acionado quando o servidor aceita ou rejeita a conexão do cliente. Você pode verificar este resultado no parâmetro Accepted
, e o servidor pode enviar ao cliente algumas informações de dados no parâmetro Data
.
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
Ocorre quando a propriedade AutoReconnect
está habilitada e uma conexão é perdida, após os milissegundos AutoReconnectInterval
. Se a tentativa de reconexão falhar, o evento será acionado sucessivamente até que uma conexão seja estabelecida. Você pode cancelar as tentativas de reconexão alterando a propriedade Cancel
para True
no evento de reconexão ou chamando o método StopReconnection
.
procedure Connect ;
Conecta-se ao servidor.
procedure Disconnect ;
Desconecta do servidor.
procedure StopReconnection ;
Interrompe as tentativas de reconexão quando AutoReconnect
está habilitado e uma conexão é perdida.
procedure Send ( const Cmd: Char; const A: String = ' ' );
Envia comandos e mensagens para o servidor. Você deve usar o parâmetro Cmd
para especificar um caractere de comando, que será recebido pelo servidor. O parâmetro A
é opcional e permite especificar um texto de mensagem.
Importante: O servidor não receberá mensagens enquanto o cliente ainda não estiver autenticado, mesmo que já esteja conectado.
Disponível apenas no Delphi XE6 ou superior
Quando você está usando o método Send
do soquete do servidor ou do cliente, há um parâmetro String
que permite o envio de dados. Existem dois métodos globais que você pode usar para enviar vários dados de uma vez:
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
Remetente:
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 ;
As funções de conversão usam JSON internamente para garantir que os caracteres das partes escapem para garantir a compactação/descompactação de matrizes sem alteração do conteúdo. Portanto, você não precisa se preocupar com o conteúdo das peças do tipo variante.
Verifique o aplicativo de demonstração e consulte o comando Enviar Impressão para saber como enviar e receber fluxo de dados, além de usar compactação para aumentar a velocidade de comunicação.