對於普通開發者而言編寫TCP應用通信是一件相對複雜的工做,畢竟須要一系列的bytes操做;若是再針對SSL的安全性處理相信會把不少普通開發者拒之門外.爲了簡化這一問題BeetleX
引入了Stream
操做模式並提供PipiStream
操做對象讓開發者在TCP流操做上變得很是簡便;因爲PipiStream
是基本saea擴展的流操做模型,所以在提供簡便操做的同時還能提供出色的性能。如下介紹如何使用BeetleX
構建TCP和基於SSL的TCP應用示例。安全
使用組件能夠經過Nuget引用組件,最新版本是1.2.6.8
tcp
組件構建通信應用很是簡單,在引用組件後簡單實現IServerHandler
接口便可,如下是簡單構建的服務代碼:ide
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
事件來處理接收的數據可。以上代碼是嘗試從流中讀取一行字符信息,若是讀成功後顯示內容並把當前時間輸出給客戶端。性能
因爲客戶端和服務端使用同一套Stream
實現體系,因此在客戶端上也是使用一樣的流模式操做便可.spa
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
通信。3d
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(); } } }
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的啓動狀態code
組件支持2.1或更高版本的dorecore 和Standard2.0server