對於普通開發者而言編寫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