Pt | 中
三十功名尘与土,八千里路云和月。
'TouchSocket' é uma estrutura de comunicação de rede .NET poderosa e fácil de usar para linguagens como C#, VB.Net e F#. Ele fornece uma variedade de módulos de comunicação, incluindo TCP, UDP, SSL, WebSocket, Modbus, etc. Ele suporta a solução do problema de subcontratação de pacotes TCP e combinação de grandes fragmentos de pacotes UDP. A estrutura oferece suporte a uma variedade de modelos de protocolo para analisar rapidamente pacotes de dados, como cabeçalhos fixos, comprimentos fixos e caracteres de intervalo.
O IOCP do TouchSocket não é igual ao tradicional, basta pegar o exemplo oficial da Microsoft como exemplo, ele usa MemoryBuffer para abrir um pedaço de memória, dividi-lo igualmente e depois atribuir uma zona para cada sessão receber, e então copie os dados recebidos e, em seguida, processe os dados copiados. O TouchSocket deve pegar um bloco de memória utilizável do pool de memória antes de cada recepção e, em seguida, usá-lo diretamente para receber, e após receber os dados, o bloco de memória é descartado diretamente para processamento, de modo a evitar a operação de cópia , embora é apenas um design pequeno, mas ao transmitir dados de 10w vezes 64kb , a diferença de desempenho é de 10 vezes .
Acredito que todo mundo já usou outros produtos Socket, então o TouchSocket também foi projetado para aprender com o excelente conceito de design de outros produtos, o adaptador de processamento de dados é um deles, mas ao contrário do design de outros produtos, o adaptador do TouchSocket é mais poderoso e fácil de usar. e flexível. Ele não apenas pode analisar pacotes antecipadamente, mas também analisar objetos de dados, que podem ser substituídos a qualquer momento e entrar em vigor imediatamente. Por exemplo, você pode usar um cabeçalho de pacote fixo para pré-processar os dados, de modo a resolver o problema de subcontratação de dados e pacotes fixos. Ele também pode analisar diretamente o protocolo de dados HTTP, o protocolo de dados WebSocket, etc.
TouchSocket fornece uma variedade de modelos de estrutura e é totalmente compatível com todos os protocolos baseados em protocolos TCP e UDP. Por exemplo, TcpService e TcpClient têm as mesmas funções básicas que Sockets, mas melhoram a robustez e a simultaneidade do framework, e lançam a conexão e os dados recebidos na forma de eventos, para que os usuários possam utilizá-los de forma mais amigável.
O seguinte é apenas um exemplo simples de como criar um exemplo. Consulte a documentação para obter mais detalhes.
TcpService service = new TcpService();
service.Connecting = (client, e) => {return EasyTask.CompletedTask; };//有客户端正在连接
service.Connected = (client, e) => {return EasyTask.CompletedTask; };//有客户端连接
service.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//有客户端断开连接
service.Received = (client, e) =>
{
//Received information from the client
string mes = e.ByteBlock.Span.ToString(Encoding.UTF8);
Console.WriteLine($"Removed from {client. ID} Message received: {}");
return EasyTask.CompletedTask;
};
await service.StartAsync(7789);//Start
TcpClient tcpClient = new TcpClient();
tcpClient.Connected = (client, e) => {return EasyTask.CompletedTask; };//Successfully connected to the server
tcpClient.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//Disconnect from the server, which is not triggered when the connection is unsuccessful.
tcpClient.Received = (client, e) =>
{
//Information is received from the server
string mes = e.ByteBlock.Span.ToString(Encoding.UTF8);
Console.WriteLine($"Message received: {mes}");
return EasyTask.CompletedTask;
};
await tcpClient.ConnectAsync("127.0.0.1:7789");
await tcpClient.SendAsync("Hello");
Na configuração do plug-in do Config, você pode usar o plug-in de reconexão.
.ConfigurePlugins(a=>
{
a.UseReconnection(5, true, 1000);
});
O adaptador resolve principalmente o problema de colagem e empacotamento do TCP, e o formato de dados adota um modo "Baotou + Data Body" simples e eficiente, no qual Baotou suporta:
Todos os cabeçalhos de dados acima usam o modo lateral padrão (modo final) do TouchSocketBitConverter, e os usuários podem alternar o modo lateral padrão de acordo com suas necessidades.
TouchSocketBitConverter.DefaultEndianType = EndianType.Little;
O adaptador de cabeçalho fixo definido pelo usuário ajuda principalmente os usuários a resolver as informações do quadro de dados com cabeçalhos fixos. Por exemplo, os seguintes formatos de dados só precisam implementar algumas interfaces para completar a análise, consulte a API para obter detalhes.
|1|1|1|**********|
O adaptador de cabeçalho não fixo definido pelo usuário ajuda principalmente os usuários a resolver o problema das informações do quadro de dados com cabeçalhos não fixos. Por exemplo, os pacotes HTTP mais típicos têm um cabeçalho de dados separado do corpo de dados por "rn", e o cabeçalho de dados não é fixo devido às diferentes informações de solicitação do solicitante, e o comprimento do corpo de dados é também especificado explicitamente pelo valor do ContentLength do cabeçalho de dados, portanto, você pode considerar o uso de CustomUnfixedHeaderDataHandlingAdapter para analisar, o que também pode ser alcançado por meio de desenvolvimento simples.
Obrigado por seu apoio ao TouchSocket, se você tiver alguma outra dúvida, envie um problema ou junte-se ao grupo QQ: 234762506 para discutir.
Graças ao suporte das seguintes ferramentas
O projeto TouchSocket foi adicionado à organização dotNET China.