介紹
- 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 生態圈越來越好!