恩| 中
三十功名塵與土,八千里路雲和月。
「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 組織。