恩| 中
三十功名尘与土,八千里路云和月。
“TouchSocket”是一个功能强大且易于使用的.NET 网络通信框架,适用于 C#、VB.Net 和 F# 等语言。提供多种通信模块,包括TCP、UDP、SSL、WebSocket、Modbus等,支持解决TCP数据包分包和UDP大数据包碎片组合问题。框架支持多种协议模板,可快速解析固定头、固定长度、间隔字符等数据包。
TouchSocket的IOCP和传统的不太一样,就以微软官方的例子为例,他用MemoryBuffer开辟一块内存,平均划分,然后给每个session分配一个zone来接收,然后复制接收到的数据,然后对复制的数据进行处理。 TouchSocket是在每次接收前从内存池中取出一块可用的内存块,然后直接用于接收,而接收到数据后,直接将内存块抛出去处理,从而避免了复制操作,虽然它只是一个很小的设计,但是当传输10w次64kb数据时,性能差异是10倍。
相信大家都用过其他Socket产品,所以TouchSocket的设计也是借鉴了其他产品优秀的设计理念,数据处理适配器就是其中之一,但与其他产品的设计不同的是,TouchSocket的适配器功能更加强大,便于使用。并且灵活。不仅可以提前解析数据包,还可以解析数据对象,可以随时替换,然后立即生效。例如,可以使用固定的包头对数据进行预处理,从而解决数据分包和粘包的问题。还可以直接解析HTTP数据协议、WebSocket数据协议等。
TouchSocket提供多种框架模型,完全兼容基于TCP和UDP协议的所有协议。例如TcpService和TcpClient,其基本功能与Sockets相同,但增强了框架的健壮性和并发性,并将连接和接收到的数据以事件的形式抛出,让用户使用起来更加人性化。
以下只是一个简单的示例,说明如何创建示例,更多详细信息请参阅文档。
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");
在Config的插件配置中,可以使用重连插件。
.ConfigurePlugins(a=>
{
a.UseReconnection(5, true, 1000);
});
该适配器主要解决Tcp粘包问题,数据格式采用简单高效的“包头+数据体”模式,其中包头支持:
以上数据头均使用TouchSocketBitConverter默认的侧模式(小端模式),用户可以根据需要切换默认的侧模式。
TouchSocketBitConverter.DefaultEndianType = EndianType.Little;
用户自定义固定头适配器主要帮助用户解决固定头的数据帧信息。例如以下数据格式只需要实现几个接口即可完成解析,具体请参考API。
|1|1|1|*********|
用户自定义的非固定头适配器主要帮助用户解决数据帧信息不固定头的问题。例如,最典型的HTTP数据包有一个数据头与数据体之间用“rn”分隔,而数据头由于请求者的请求信息不同而并不固定,数据体的长度为也是通过数据头的ContentLength的值显式指定的,所以可以考虑使用CustomUnfixedHeaderDataHandlingAdapter来解析,这也可以通过简单的开发来实现。
感谢您对TouchSocket的支持,如有其他问题,请提交Issue,或加群QQ:234762506讨论。
感谢以下工具的支持
TouchSocket 项目已添加到 dotNET China 组织中。