As comunicações mais rápidas possíveis.
Esta é a versão 7.2 do pacote NetCom. Nesta versão, o pacote NetCom agora é multi-plataforma! Você pode compilar seus aplicativos em todas as plataformas em Firemonkey!
Esse conjunto de componentes é a implementação mais rápida possível das comunicações de soquete, em qualquer idioma; Este é um código extremamente otimizado nos soquetes TCP/IP. Esqueça o uso de um thread por conexão: com esta suíte, você pode ter tantas conexões simultâneas com o servidor quanto quiser. Os threads são usados por solicitação e não por conexão e são mantidos em uma classe de pool de threads muito rápida.
A implementação começa com o TNCTCPServer e o TNCTCPClient, que implementa as comunicações básicas do soquete. Você pode usar o TNCTCPCLIENT e o TNCTCPSERVER se tudo o que você deseja é implementar comms padrão (mas muito rápido).
No topo dos soquetes TCP/IP, um protocolo leve é implementado para poder embalar e desfazer buffers (o TCP/IP simples está transmitindo e não tem noção de um buffer bem definido). O conjunto de componentes que implementam essa funcionalidade é o TNCServersource e o TNCClientSource. Ambos os componentes implementam um ExecCommand (ACMD, Adata), que aciona um evento OnHandleCommand do outro lado (um cliente pode executar o componente a um servidor ou um servidor pode executar o comando de qualquer cliente). O ExecCommand pode estar bloqueando ou não bloqueando (assíncrono), dependendo de como você define seu parâmetro ARSEQUIRESRESULT. Se você usar o comportamento de bloqueio, o componente ainda lida com solicitações recebidas de seus pares. Por exemplo, uma turma de clientes pode estar aguardando um executivo executivo para o servidor, mas enquanto espera, ele pode servir solicitações ExecCommand do servidor!
Senario simples: servidor:
- You put a TncServerSource on your form.
If you want you can change the port it is listening to via the
Port property.
- You implement an OnHandleCommand event handler and,
depending on aCmd parameter (integer), you respond the result of
the command via setting the Result of the OnHandleCommand to
anything you like (TBytes). If an exception is raised while in
HandleCommand, it is trapped, packed, transfered accross to the
calling peer, and raised at the peer's issued ExecCommand.
This way exceptions can be handled as if they were raised locally.
- You set the Active property to true. Your server is ready.
Cliente:
- You put a TncClientSource on your form.
You can set Host and Port to whatever you want.
- You set Active property to true.
Your client is now connected to the server.
- You call ExecCommand (on your TncClientSource), with any
command number and data that you like. This will send your
command and data over to the server, call its OnHandleCommand,
pack the response, and return it as a result to your ExecCommand.
- ExecCommand is blocking (if aRequiresResult parameter is set to true),
but only for the current command issued.
The TncClientSource's OnHandleCommand still executes, so,
while waiting for a command to return, your client socket may be
processing requests from your server (a server can also
ExecCommand to a client).
- If you have forgotten to set Active to true and call ExecCommand,
the TncClientSource will first try to connect, so you can ommit
setting this property. It will also try to connect if it knows
it has been disconnected (and the Reconnect property is set to true).
Este conjunto de componentes promete velocidade incomparável e isso não é apenas em palavras:
Um teste de tempo simples com a demonstração do NetComvsindy fornece os seguintes resultados:
Começando com a unidade base, ncsockets.pas, você verá que a implementação não sofre de código de folga, é bastante imediato. A convenção de chamada em linha foi usada sempre que considerado apropriado. As funções principais foram testadas e otimizadas, monitorando o desempenho por meio do tempo de grandes loops e inspeção de montagem para espremer cada último desempenho.
A maior diferença, embora no ganho de velocidade, seja devido à arquitetura. Ao contrário da maioria dos soquetes típicos:
Este conjunto de soquetes não gera nem um thread por conexão.
Isso significa que você pode ter quantas conexões ao vivo quiser e não verá diferença no desempenho! Um pool de threads apenas espera por quaisquer solicitações; Se um thread fosse criado por solicitação ou por conexão, a velocidade sofreria muito, pois a criação de um thread é bastante pesada. Se o número de solicitações por segundo não puder ser tratado pelo pool de threads, o pool de threads crescerá até um tamanho máximo definido e, se ele ainda não puder lidar, o cliente aguarda até que o servidor obtenha um thread pronto para processar sua solicitação.
Também foi dada atenção especial aos problemas de conexão. Por exemplo, as desconexões são recolhidas imediatamente e, se uma linha é tão ruim que a desconexão não pode ser recolhida, ela aborda isso por um pacote de Keep Live, pelo qual ele conhece o status real. Há uma propriedade de reconectada e uma propriedade mantida. Quando um cliente é desconectado, por qualquer motivo, ele tenta se reconectar de forma transparente e sem afetar o desempenho do aplicativo principal. Dessa forma, você não precisa se preocupar em manter seus clientes conectados.
Compressão e criptografia também são padrão com esses componentes, sem necessidade de bibliotecas extras. É claro que você pode usar sua própria compactação ou criptografia, se preferir, mas é bastante útil ter apenas uma propriedade que você pode definir no componente.
Esse conjunto de componentes também pode lidar com dados de lixo lançados neles, eles foram usados e testados em grandes projetos em todo o país, onde todos os tipos de ataques podem ser vistos.
O esforço que um programador deve fazer para usar esses componentes é mínimo em comparação com outras estruturas. Consulte as demos para obter uma melhor compreensão sobre como usar esses componentes.
Escrito por Bill Anastasios demos. Agradecimentos especiais a Daniel Mauric, Tommi Prami, Roland Bengtsson pelos extensos testes e sugestões. Muito obrigado!
Vasdemos [at] Yahoo [DOT] CO [DOT] UK
** Regras Delphi **