在学习编程的时应该都记得HelloWorld示例,基本每种语言的开始入门都会做这样一个示例来简单展示最简单的工作方式。接下来也用HelloWorld示例来展示BeetleX在TCP服务上的应,这个示例包括普通TCP和基于TLS的两种通讯模式。
引用组件
组件新版本都发布到nugt.org上,如果想了解组件发布情况可以访问https://www.nuget.org/packages/BeetleX/查看组件发布版本情况。可以通过以下命令安装相应版本的组件:
//Package managerInstall-Package BeetleX -Version 1.5.4.6//.NET CLIdotnet add package BeetleX --version 1.5.4.6
创建服务
使用组键创建服TCP服务并没有对项目类型有特别的要求,可以用控制台,winform或wpf都可以,具体看自己的场景需求。接下来使用控制台来创建一个HelloWorld服务,创建项目后先要引用组件的最新版本。
class Program : ServerHandlerBase{ static IServer mServer; static void Main(string[] args) { mServer = SocketFactory.CreateTcpServer(new Program(), null); mServer.Options.LogLevel = LogType.Info; //mServer.Options.DefaultListen.Port=9090 //mServer.Options.DefaultListen.SSL = true; //mServer.Options.DefaultListen.CertificateFile = "ssl.pfx"; //mServer.Options.DefaultListen.CertificatePassword = "123456"; mServer.Open(); System.Threading.Thread.Sleep(-1); } public override void SessionReceive(IServer server, SessionReceiveEventArgs e) { string name = e.Stream.ToPipeStream().ReadToEnd(); e.Stream.ToPipeStream().Write($"hello {name}"); e.Stream.Flush(); base.SessionReceive(server, e); }}
通过以上简单代码,一个HelloWorld的TCP通讯服务就完成了,不过这个服务比较简单并没有什么应用协议封装,只是简单的数据流读写(注意:由于TCP是基于数据流模式,不制定应用协议是无法真正应用的)。
先看回代码,程序通过SocketFactory.CreateTcpServer方法创建一个服务对象,并带上IServerHandler接口实例Program类接管服务处理会话行为;在这里Program类继承了ServerHandlerBase类,并重写了SessionReceive方法进行接收数据处理,这里的逻辑非常简单接收到内容后返回对应的hello信息。程序启动后会看到以下信息
看到[Status:success]说明服务已经正常启动,可以通过9090端口来访问这个服务;由于开启SSL部分注释了,所以启动内容显示为SSL未启用。
创建客户端
组件不仅提供了服务端开发功能,还封装了相应客户功能来访问TCP服务。
class Program{ static async Task Main(string[] args) { string line = null; AsyncTcpClient Client = SocketFactory.CreateClient("localhost", 9090); //Client.DataReceive = (o, e) ={ //}; //AsyncTcpClient Client = SocketFactory.CreateSslClient("localhost", 9090, "test"); //Client.CertificateValidationCallback = (obj, certi, chain, sslerrors) => { return true; }; while (true) { Console.Write("Enter you name:"); line = Console.ReadLine(); Client.Stream.ToPipeStream().WriteLine(line); Client.Stream.Flush(); var stream = await Client.Receive(); line = stream.ReadToEnd(); Console.WriteLine(line); } }}
组件通过SocketFactory.CreateClient方法来创建一个客户端,创建之后就可以进行相关网络操作,以上代码是创建连接后进行名称输入,然后把输入的数据提交到服务端并等待返回输出;在这个过程客户端无须显存调用Connect这些方法,组件会自动进行连接创建或断线重连。
客户端对象接收数据有两种方式,一定是定义接收事件DataReceive或使用await Receive(),两个方式都是通过PipeStream进行数据读写操作;不过组件会优先await Receive,如果定义了这种方式则不会触发接收事件DataReceive。
开启TLS
上面示例的代码并没有开启TLS支持,只需要把TLS注释部分代码开启则通讯服务就是基于TLS加密传输;开启TLS后网络读写代码方式无须更改。以下是开启TLS配置的运行情况
服务端日志会显示连接的TLS验证过程。
注意:客户在使用TLS的时候需要考虑证书验证问题,如果需要对证书进行单独校验可以设置CertificateValidationCallback委托;为了方便更多时候是强行返回True不进行验证。
下载示例
链接: https://pan.baidu.com/s/1kuZGow8IyWqV0qXUWR6MeA 提取码: yv7v 复制这段内容后打开百度网盘手机App,操作更方便哦
【BeetleX通讯框架代码详解】
BeetleX
开源跨平台通讯框架(支持TLS)
轻松实现高性能:tcp、http、websocket、redis、rpc和网关等服务应用
https://beetlex.io