C# 使用 RRQMSocket 實現 TCP 通訊

C# 使用 RRQMSocket 實現 TCP 通訊

經過RRQM封裝後,將高連接、高並發,數據處理等一系列基礎功能打包,讓使用者不再關心基礎架構建設,專心於業務。

最後更新 2022/5/26 下午9:11
黑哥聊dotNet
預計閱讀 3 分鐘
分類
.NET
標籤
.NET C# 架構設計 RRQMSocket TCP

介紹

  • TCP 元件是基於 TCP 協定最基礎的元件,其基礎功能與 Socket 一致,只是經由 RRQM 封裝後,將高連線、高併發、資料處理等一系列基礎功能打包,讓使用者不再關心基礎架構建設,專心於業務。
  • 理論上 TCP 元件可用於任何基於 TCP 協定的產品,例如:HTTP、FTP、WebSocket、Telnet、PLC 通訊、上位機通訊等。

產品特點

  • 簡單易用。
  • 多執行緒。
  • 記憶體池
  • 高效能(伺服器每秒可接收 200 萬筆資訊,接收資料流量可達 2.5GB/s)
  • 多種資料接收模式(IOCP、BIO、Select)。
  • 多地址監聽(可一次監聽多個 IP 及連接埠)
  • 適配器預處理,一鍵式解決分包、黏包、物件解析(如 HTTP、JSON)等。
  • 超簡單的同步發送、非同步發送、接收等操作。
  • 基於事件驅動,讓每一步操作盡在掌握。

產品應用場景

  • TCP 基本使用場景:可跨平台、跨語言使用。
  • 自訂協定解析場景:可解析任意資料格式的 TCP 資料報文。

下面示範我們的系統:

建立 TcpService

TcpService 是 TCP 系列伺服器基底類別,但不參與實際的資料互動,實際的資料互動由 SocketClient 完成,所以 TcpService 的功能只是配置、啟用、管理、註銷、

重建 SocketClient 類別實例,所以在 TcpService 中,必須指定其 SocketClient 衍生的泛型類型,然後必須實作 HandleReceivedData 方法,該方法指示如何處理已接收資料或經由適配器轉換的物件。

所以具體建立過程如下。

TcpService service = new TcpService();
service.Connecting += (client, e) =>{};//有用戶端正在連線
service.Connected += (client, e) =>{};//有用戶端連線
service.Disconnected += (client, e) =>{};//有用戶端斷線
service.Received += (client, byteBlock ,requestInfo) =>
{
    //從用戶端收到資訊
    string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
    Console.WriteLine($"已從{client.Name}接收到資訊:{mes}");//Name即IP+Port
};
//宣告配置
var config = new TcpServiceConfig();
config.ListenIPHosts = new IPHost[] { new IPHost("127.0.0.1:7789"), new IPHost(7790) };//同時監聽兩個位址
//載入配置
service.Setup(config);
service.Start();

建立 TcpClient

TcpClient 是 TCP 用戶端的基底類別,為抽象類別,不可建立實例,必須透過繼承實作 HandleReceivedData 方法,該方法指示如何處理接收到的資料。

SimpleTcpClient tcpClient = new SimpleTcpClient();
tcpClient.Connected += (client, e) =>{};//成功連線到伺服器
tcpClient.Disconnected += (client, e) =>{};//從伺服器斷線,當連線不成功時不會觸發。
tcpClient.Received += (client, byteBlock ,requestInfo) =>
{
    //從伺服器收到資訊
    string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
    Console.WriteLine($"接收到資訊:{mes}");
};
//載入配置
tcpClient.Setup("127.0.0.1:7789");
tcpClient.Connect();
tcpClient.Send(Encoding.UTF8.GetBytes("RRQM"));

用戶端與伺服器端發送都封裝了 send 方法,TcpClient 和 TcpService 已經內建多種發送方法,直接呼叫即可發送。如果發送失敗,則會立即拋出例外。

service.Send(“”);

最後大家如果喜歡我的文章,還麻煩給個關注,希望 .NET 生態圈越來越好!

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2026/2/7

AOT使用經驗總結

從專案建立伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 AOT 發布測試。

繼續閱讀