对于普通开发者而言编写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