超輕量級、支持插件的 .NET 網(wǎng)絡(luò)通信框架
給大家推薦一個輕量級的、支持插件的綜合網(wǎng)絡(luò)通信庫:TouchSocket。
TouchSocket 的基礎(chǔ)通信功能包括 TCP、UDP、SSL、RPC 和 HTTP。其中,HTTP 服務(wù)器支持 WebSocket、靜態(tài)網(wǎng)頁、XML-RPC、WebAPI 和 JSON-RPC 等擴展插件。
此外,TouchSocket 還支持自定義協(xié)議的 TouchRPC,具備 SSL 加密、異步調(diào)用、權(quán)限管理、錯誤狀態(tài)返回、服務(wù)回調(diào)和分布式調(diào)用等功能。
在空載函數(shù)執(zhí)行時,10 萬次調(diào)用僅需 3.8 秒;在不返回狀態(tài)時,僅需 0.9 秒。
TouchSocket(Pro)是基于 .NET 的程序集系列,可用于對應(yīng) .NET 版本的 C#、F# 和 VB.NET 項目。無論你的項目是控制臺、WinForms、WPF 還是 ASP.NET Core,它都全面支持。
TouchSocket(Pro)長期支持 .NET 4.5、.NET 4.8.1、.NET Standard 2.0 三個平臺,并將 .NET 6.0 作為最新穩(wěn)定版支持平臺,同時支持.NET 7.0 作為最新發(fā)布平臺。

項目環(huán)境
.NET 4.5:保證了在.Net Framework上的最低支持版本?;旧现С秩?9%的功能。
.NET 4.8.1:這是在net45的依賴基礎(chǔ)之上,額外添加了一些微軟官方庫,以支持達(dá)到net6.0一樣的功能(例如:Span、ValueTuple、ValueTask等)。
.NET Standard 2.0:這是保證了在一些通用平臺上的最低依賴?;旧现С秩?9%的功能。
.NET 6.0:這是目前最新的穩(wěn)定版發(fā)布平臺,它在最低依賴的前提下,還保證了全部功能。
.NET 7.0:這是目前最新的發(fā)布平臺,我們會在該平臺上開發(fā)最能嘗鮮的功能(例如:AOT等)。
支持框架的框架Console、WPF、Winform、Blazor Server、Xamarin、MAUI、Avalonia、Mono、Unity 3D(除WebGL)、其他(即所有C#系)
項目功能
1、功能導(dǎo)圖

2、項目文檔

項目特點
1、傳統(tǒng) IOCP 與 TouchSocket 的 IOCP 模式
TouchSocket 的 IOCP 模式與傳統(tǒng) IOCP 不同。以微軟官方示例為例,傳統(tǒng) IOCP 使用 MemoryBuffer 開辟一塊內(nèi)存,均分后給每個會話分配一個區(qū)域接收數(shù)據(jù),收到數(shù)據(jù)后再復(fù)制并處理。而 TouchSocket 則在每次接收前從內(nèi)存池中獲取一個可用內(nèi)存塊直接用于接收,收到數(shù)據(jù)后直接處理該內(nèi)存塊,從而避免了復(fù)制操作。雖然這只是細(xì)節(jié)上的設(shè)計差異,但在傳輸 10 萬次 64KB 數(shù)據(jù)時,性能提升了 10 倍。
2、數(shù)據(jù)處理適配器
TouchSocket 在設(shè)計時借鑒了其他產(chǎn)品的優(yōu)秀理念,數(shù)據(jù)處理適配器就是其中之一。與其他產(chǎn)品不同的是,TouchSocket 的適配器功能更加強大、易用且靈活。它不僅可以提前解析數(shù)據(jù)包,還可以解析數(shù)據(jù)對象,并且可以隨時替換,立即生效。例如,可以使用固定包頭對數(shù)據(jù)進(jìn)行預(yù)處理,從而解決數(shù)據(jù)分包和粘包問題;也可以直接解析 HTTP 數(shù)據(jù)協(xié)議和 WebSocket 數(shù)據(jù)協(xié)議等。
3、兼容性與適配
TouchSocket 提供多種框架模型,能夠完全兼容基于 TCP 和 UDP 協(xié)議的所有協(xié)議。例如,TcpService 和 TcpClient 的基礎(chǔ)功能與 Socket 相同,但增強了框架的堅固性和并發(fā)性,通過事件形式拋出連接和接收數(shù)據(jù),使用戶能夠更加友好地使用。
項目使用
1、Nuget安裝
搜索框輸入TouchSocket,然后在搜索結(jié)果中選擇,點擊安裝,具體如下圖所示

2、TcpService
TcpService是Tcp系服務(wù)器基類,它不參與實際的數(shù)據(jù)交互,只是配置、激活、管理、注銷、重建SocketClient類實例。
而SocketClient是當(dāng)TcpClient(客戶端) 成功連接服務(wù)器以后,由服務(wù)器新建的一個實例類,后續(xù)的所有通信,也都是通過該實例完成的。
var service = new TcpService(); service.Connecting = (client, e) => { return EasyTask.CompletedTask; };//有客戶端正在連接 service.Connected = (client, e) => { return EasyTask.CompletedTask; };//有客戶端成功連接 service.Disconnecting = (client, e) => { return EasyTask.CompletedTask; };//有客戶端正在斷開連接,只有當(dāng)主動斷開時才有效。 service.Disconnected = (client, e) => { return EasyTask.CompletedTask; };//有客戶端斷開連接 service.Received = (client, e) => { //從客戶端收到信息 var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意:數(shù)據(jù)長度是byteBlock.Len client.Logger.Info($"已從{client.Id}接收到信息:{mes}"); ? client.Send(mes);//將收到的信息直接返回給發(fā)送方 ? //client.Send("id",mes);//將收到的信息返回給特定ID的客戶端 ? //將收到的信息返回給在線的所有客戶端。 //注意:這里只是一個建議思路,實際上群發(fā)應(yīng)該使用生產(chǎn)者消費者模式設(shè)計 //var ids = service.GetIds(); //foreach (var clientId in ids) //{ // if (clientId != client.Id)//不給自己發(fā) // { // service.Send(clientId, mes); // } //} ? return EasyTask.CompletedTask; }; ? service.Setup(new TouchSocketConfig()//載入配置 .SetListenIPHosts("tcp://127.0.0.1:7789", 7790)//同時監(jiān)聽兩個地址 .ConfigureContainer(a =>//容器的配置順序應(yīng)該在最前面 { a.AddConsoleLogger();//添加一個控制臺日志注入(注意:在maui中控制臺日志不可用) }) .ConfigurePlugins(a => { //a.Add();//此處可以添加插件 })); ? service.Start();//啟動
3、TcpClient
TcpClient是Tcp系客戶端基類,他直接參與tcp的連接、發(fā)送、接收、處理、斷開等,他的業(yè)務(wù)與服務(wù)器的SocketClient是一一對應(yīng)的。
var tcpClient = new TcpClient(); tcpClient.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即將連接到服務(wù)器,此時已經(jīng)創(chuàng)建socket,但是還未建立tcp tcpClient.Connected = (client, e) => {return EasyTask.CompletedTask; };//成功連接到服務(wù)器 tcpClient.Disconnecting = (client, e) => {return EasyTask.CompletedTask; };//即將從服務(wù)器斷開連接。此處僅主動斷開才有效。 tcpClient.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//從服務(wù)器斷開連接,當(dāng)連接不成功時不會觸發(fā)。 tcpClient.Received = (client, e) => { //從服務(wù)器收到信息。但是一般byteBlock和requestInfo會根據(jù)適配器呈現(xiàn)不同的值。 var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len); tcpClient.Logger.Info($"客戶端接收到信息:{mes}"); return EasyTask.CompletedTask; }; ? //載入配置 tcpClient.Setup(new TouchSocketConfig() .SetRemoteIPHost("127.0.0.1:7789") .ConfigureContainer(a => { a.AddConsoleLogger();//添加一個日志注入 })); ? tcpClient.Connect();//調(diào)用連接,當(dāng)連接不成功時,會拋出異常。 ? //Result result = tcpClient.TryConnect();//或者可以調(diào)用TryConnect //if (result.IsSuccess()) //{ ? //} ? tcpClient.Logger.Info("客戶端成功連接"); ? tcpClient.Send("RRQM");
4、TcpClient 斷線重連
在Config的插件配置中,使用重連插件即可。
.ConfigurePlugins(a=> { a.UseReconnection(5, true, 1000);//如需永遠(yuǎn)嘗試連接,tryCount設(shè)置為-1即可。 });
項目案例
1、工程師軟件工具箱
使用TouchRpc開發(fā)的一個內(nèi)部工程師軟件工具箱 。



2、遠(yuǎn)程監(jiān)控、控制項目


項目地址
GitHub:https://github.com/RRQM/TouchSocket
Gitee:https://gitee.com/RRQM_Home/TouchSocket
文檔地址:
如果你覺得這篇文章對你有幫助,不妨點個贊支持一下!你的支持是我繼續(xù)分享知識的動力。如果有任何疑問或需要進(jìn)一步的幫助,歡迎隨時留言。
也可以加入微信公眾號[DotNet技術(shù)匠] 社區(qū),與其他熱愛技術(shù)的同行一起交流心得,共同成長!優(yōu)秀是一種習(xí)慣,歡迎大家留言學(xué)習(xí)!


浙公網(wǎng)安備 33010602011771號