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 通信、上位機通信等。

產品特點

  • 簡單易用。
  • 多線程。
  • 內存池
  • 高性能(伺服器每秒可接收 200w 條信息,接收數據流量可達 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 生態圈越來越好!

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/2/7

aot使用經驗總結

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

继续阅读