對於普通開發者而言編寫TCP應用通訊是一件相對復雜的工作,畢竟需要一系列的bytes操作;如果再針對SSL的安全性處理相信會把很多普通開發者拒之門外.為了簡化這一問題BeetleX引入了Stream操作模式並提供PipiStream操作對象讓開發者在TCP流操作上變得非常簡便;由於PipiStream是基本saea擴展的流操作模型,因此在提供簡便操作的同時還能提供出色的性能。以下介紹如何使用BeetleX構建TCP和基於SSL的TCP應用示例。
引用組件
使用組件可以通過Nuget引用組件,最新版本是1.2.6.8

構建TCP服務
組件構建通訊應用非常簡單,在引用組件后簡單實現IServerHandler接口即可,以下是簡單構建的服務代碼:
class Program : BeetleX.ServerHandlerBase { private static BeetleX.IServer mServer; static void Main(string[] args) { mServer = SocketFactory.CreateTcpServer<Program>(); mServer.Open(); Console.WriteLine(mServer.Status); Console.Read(); } protected override void OnLogToConsole(IServer server, ServerLogEventArgs e) { Console.WriteLine($"{DateTime.Now}\t{e.Type}\t{e.Session?.RemoteEndPoint} {e.Message}"); } public override void SessionReceive(IServer server, SessionReceiveEventArgs e) { base.SessionReceive(server, e); var stream = e.Stream.ToPipeStream(); if (stream.TryReadLine(out string line)) { Console.WriteLine(line); stream.WriteLine($"{DateTime.Now}"); e.Stream.Flush(); } } }
ServerHandlerBase是組件內部實現IServerHandler接口,只需要簡單重寫SessionReceive事件來處理接收的數據可。以上代碼是嘗試從流中讀取一行字符信息,如果讀成功后顯示內容並把當前時間輸出給客戶端。
構建TCP客戶端
由於客戶端和服務端使用同一套Stream實現體系,所以在客戶端上也是使用同樣的流模式操作即可.
var client = SocketFactory.CreateClient<Clients.TcpClient>("localhost", 9090); client.Connect(); var stream = client.Stream.ToPipeStream(); while (true) { string value = Console.ReadLine(); stream.WriteLine($"{DateTime.Now} {value}"); client.Stream.Flush(); client.Receive(); if (stream.TryReadLine(out string line)) { Console.WriteLine(line); } }
運行效果

SSL服務端
很多時候應用需要一個可靠安全的通訊機制,組件默認提供SSL的支持;只需要簡單地配置一下SSL信息即可實現安全的SSL通訊。
class Program : BeetleX.ServerHandlerBase { private static BeetleX.IServer mServer; static void Main(string[] args) { mServer = SocketFactory.CreateTcpServer<Program>(); mServer.Options.DefaultListen.SSL = true; mServer.Options.DefaultListen.CertificateFile = "c:\\ikende.com.pfx"; mServer.Options.DefaultListen.CertificatePassword = "******"; mServer.Open(); Console.WriteLine(mServer.Status); Console.Read(); } protected override void OnLogToConsole(IServer server, ServerLogEventArgs e) { Console.WriteLine($"{DateTime.Now}\t{e.Type}\t{e.Session?.RemoteEndPoint} {e.Message}"); } public override void SessionReceive(IServer server, SessionReceiveEventArgs e) { base.SessionReceive(server, e); var stream = e.Stream.ToPipeStream(); if (stream.TryReadLine(out string line)) { Console.WriteLine(line); stream.WriteLine($"{DateTime.Now}"); e.Stream.Flush(); } } }
SSL客戶端
class Program { static void Main(string[] args) { var client = SocketFactory.CreateSslClient<Clients.TcpClient>("localhost", 9090, "ikende.com"); client.Connect(); var stream = client.Stream.ToPipeStream(); while (true) { string value = Console.ReadLine(); stream.WriteLine($"{DateTime.Now} {value}"); client.Stream.Flush(); client.Receive(); if (stream.TryReadLine(out string line)) { Console.WriteLine(line); } } } }
在創建客戶端的SSL里需要指定證書對應的機構名稱,用於進行SSL驗證。
運行效果

組件在開啟SSL服務的日志輸出打印出詳細的證書信息,用於方便查看SSL的啟動狀態
支持平台
組件支持2.1或更高版本的dorecore 和Standard2.0
