使用BeetleX构建基础的SSL网络通讯

BeetleX的使用非常简单,通过Stream的数据流模式可以让你轻松处理网络数据;在处理SSL加密通讯的时候组件的使用也是非常方便,只需要简单的配置证书即可完成基于SSL的网络安全通讯,接下来介绍一下通过组件快速构建一个安全可靠的网络服务。

引用组件

组件的最新版本是1.4.9.6可以通过访问 https://www.nuget.org/packages/BeetleX/ 获取最新版本,或直接通过Nuget进行安全组件。

证书文件

构建SSL服务需要一个pfx的证书文件,可以通过相关命令创建,如果不想麻烦可以通过vs在项目中签名中添加一个即可创建一个pfx文件作为SSL服务的证书文件。

定义协议数据

任何网络通讯都具有一个应用协议,主要作用是根据网络的字节流信息还原成具体可以操作的数据信息对象。组件通过IPacket接口来定义一个协议解释器

    public interface IPacket : IDisposable{EventHandler<PacketDecodeCompletedEventArgs> Completed { get; set; }IPacket Clone();void Decode(ISession session, Stream stream);void Encode(object data, ISession session, Stream stream);byte[] Encode(object data, IServer server);ArraySegment<byte> Encode(object data, IServer server, byte[] buffer);}

这个接口主要用于描述协议编码和解码的工作,并提供一个委托来触发消息解释完成的回调。实现这个接口需要一些工作不过组件提供了一个基础的协议封包类FixedHeaderPacket,主要用于解决头大小描述的消息体;接下来定义一个简单的String消息协议处理器

    public class StringPacket : BeetleX.Packets.FixedHeaderPacket{public override IPacket Clone(){return new StringPacket();}protected override object OnRead(ISession session, PipeStream stream){return stream.ReadString(CurrentSize);}protected override void OnWrite(ISession session, object data, PipeStream stream){stream.Write((string)data);}}

通过重写OnReadOnWrite两个方法来处理封包和解包的工作。这个协议解释器的具体协议格如下: |payload size|payload|

构建服务

有了协议分析类接下来的工作就可以实现一个基于String传递的网络服务

    class Program : ServerHandlerBase{private static IServer server;public static void Main(string[] args){server = SocketFactory.CreateTcpServer<Program,StringPacket>();server.Options.DefaultListen.SSL = true;server.Options.DefaultListen.CertificateFile = "test.pfx";server.Options.DefaultListen.CertificatePassword = "123456";server.Options.LogLevel = LogType.Info;server.Open();Console.Read();}protected override void OnReceiveMessage(IServer server, ISession session, object message){Console.WriteLine(message);server.Send($"hello {message}", session);}}

可以通过SocketFactory.CreateTcpServer方法来构建一个TCP服务,方法需要带上接受网络处理事件的IServerHandler和一个协议解释对象IPacket.以上服务是重写OnReceiveMessage方法接收请求的消息处理并返回;IServerHandler除也可以定义接收消息外还提供其他方法实现用于监控连接的不同事件处理,详细下如:

    public interface IServerHandler{void Connected(IServer server, ConnectedEventArgs e);void Connecting(IServer server, ConnectingEventArgs e);void Disconnect(IServer server, SessionEventArgs e);void Error(IServer server, ServerErrorEventArgs e);void Log(IServer server, ServerLogEventArgs e);void SessionDetection(IServer server, SessionDetectionEventArgs e);void SessionPacketDecodeCompleted(IServer server, PacketDecodeCompletedEventArgs e);void SessionReceive(IServer server, SessionReceiveEventArgs e);}

SSL配置

在打开服务端可以通过server.Options来配置相应的SSL,主要配置如下:

     server.Options.DefaultListen.SSL = true;server.Options.DefaultListen.CertificateFile = "test.pfx";server.Options.DefaultListen.CertificatePassword = "123456";

通过以上配置就可以启用一个SSL服务,启动服务后可以看到服务的详细信息

客户端访问

组件同样提供相应的客户端类来访问相关服务,不过在访问服务的时候同样需要定义一个协议解释器

    public class StringPacket : BeetleX.Packets.FixeHeaderClientPacket{public override IClientPacket Clone(){return new StringPacket();}protected override object OnRead(IClient client, PipeStream stream){return stream.ReadString(CurrentSize);}protected override void OnWrite(object data, IClient client, PipeStream stream){stream.Write((string)data);}}

定义协议解释器后,就可以创建一个访问对象了;组件提供几个客户端访问类分别是:TcpClien同步,AsyncTcpClient异步和AwaiterClient支持await。接下来通过AwaiterClient来访问服务:

            AwaiterClient client = new AwaiterClient("127.0.0.1", 9090, new StringPacket(), "test");client.CertificateValidationCallback = (s, e, c, p) => true;while (true){Console.Write("Enter Name:");var line = Console.ReadLine();client.Send(line);var result = await client.Receive();Console.WriteLine($"{DateTime.Now} {result}");}

在使用SSL时很多时候可以因为服务名导致无法通过验证,所以可以通过定义CertificateValidationCallback返回True来忽略相关验证.这样一个基于SSL访问的网络程序就完成,最后可以通过服务端的日志查看相关工作情况:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调用其他app 的lib_ButterKnife执行效率为什么比其他注入框架高?它的原理是什么...

面试官: ButterKnife为什么执行效率为什么比其他注入框架高&#xff1f;它的原理是什么心理分析&#xff1a; ButterKnife框架一直都是使用&#xff0c;很少又开发者对butterknife深入研究的&#xff0c;既然你是面试Android高级岗位&#xff0c;自然需要有相应被问到原理的准备…

算法---会议最大安排问题

算法—会议最大合理安排问题 参考&#xff1a;趣学算法 代码&#xff1a; #include <stdio.h> #include <stdlib.h> typedef struct meet {int beg;//开始int end;//结束int num;//会议编号 }meet; int cmp44(meet m1,meet m2) {//越早结束的越优先&#xff0c;…

小cookie,大智慧

Cookie是什么&#xff1f;cookies是你访问网站时创建的数据片段文件&#xff0c;通过保存浏览信息&#xff0c;它们使你的在线体验更加轻松。使用cookies&#xff0c;可以使你保持在线登录状态&#xff0c;记录你的站点偏好&#xff0c;并为你提供本地化支持。First-party cook…

java 最少使用(lru)置换算法_LRU算法详解及最简单的Java实现

更多内容&#xff0c;欢迎关注微信公众号&#xff1a;全菜工程师小辉~LRU(Least recently used&#xff0c;最近最少使用)算法根据数据的历史访问记录来进行淘汰数据&#xff0c;其核心思想是“如果数据最近被访问过&#xff0c;那么将来被访问的几率也更高”。LRU算法的表现新…

word List 48

word List 48 如果存在什么问题&#xff0c;欢迎批评指正!谢谢&#xff01;

一文读懂常用开源许可证

社区时常为流行产品中有争议的开源许可证而感到震惊&#xff0c;这引起各方关注&#xff0c;纷纷争论何为真正的开源许可证。去年&#xff0c;Apache 基金会&#xff08;Apache Foundation&#xff09;禁止使用 Facebook React 那些具有争议的专利组件&#xff0c;这引发了轩然…

[蓝桥杯2015初赛]手链样式-思维+next_permutation枚举(好题)

题目描述 小明有3颗红珊瑚&#xff0c;4颗白珊瑚&#xff0c;5颗黄玛瑙。 他想用它们串成一圈作为手链&#xff0c;送给女朋友。 现在小明想知道&#xff1a;如果考虑手链可以随意转动或翻转&#xff0c;一共有多少不同的组合样式&#xff1f; 输出 请你输出该整数。不要输出任…

word List 49

word List 49 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢!

(四)开源C# WPF控件库《AduSkin – UI》

微信公众号&#xff1a;【Dotnet9的博客】&#xff0c;网站&#xff1a;【Dotnet9】&#xff0c;问题或建议&#xff1a;【请网站留言】&#xff0c; 如果对您有所帮助&#xff1a;【欢迎赞赏】。https://dotnet9.com追求极致&#xff0c;永臻完美A Beautiful WPF Control UI一…

python输入数据爬取_python根据用户需求输入想爬取的内容及页数爬取图片方法详解...

本次小编向大家介绍的是根据用户的需求输入想爬取的内容及页数。 主要步骤&#xff1a; 1.提示用户输入爬取的内容及页码。 2.根据用户输入&#xff0c;获取网址列表。 3.模拟浏览器向服务器发送请求&#xff0c;获取响应。 4.利用xpath方法找到图片的标签。 5.保存数据。 代码…

word List 50

word List 50 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

单点突破,击穿阈值,DevOps转型你需要这样做

在上篇文章里&#xff0c;我提到了如何通过对价值流进行分析、拆解关键要素指标&#xff0c;并通过缩减处理时间PT、降低前置时间LT、提高完成&准确的百分比&#xff08;C&A%&#xff09;&#xff0c;实现企业研发效能10倍速提升。大家点击回看这篇文章《以埃隆马斯克“…

双向dcdc变换器simulink仿真_二极管箝位五电平变换器Simulin仿真

● 本期为二极管箝位五电平变换器的基本Simulink仿真&#xff0c;只包含其SPWM调制。感谢公众号一位好友“一叶知秋”提供Simulink模型并分享。01二极管箝位五电平变换器调制方法传统的变换器存在高的电压变化率和共模电压&#xff0c;且波形谐波含量较大&#xff0c;使得输出滤…

在.NET Core中使用MachineKey

在.NET Core中使用MachineKey在上篇文章中&#xff0c;我介绍了 Cookie是基于 MachineKey生成的&#xff0c; MachineKey决定了 Cookie生成的算法和密钥&#xff0c;并如果使用多台服务器做负载均衡时&#xff0c;必须指定一致的 MachineKey。但在 .NETCore中&#xff0c;官方似…

cg word List 1

cg word List 1 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢!

[蓝桥杯2016初赛]剪邮票-dfs+next_permutation(好题)

题目描述 如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来&#xff0c;要求必须是连着的。&#xff08;仅仅连接一个角不算相连&#xff09; 比如&#xff0c;下面两张图中&#xff0c;粉红色所示部分就是合格的剪取。 请你计算&#xff0c;一共有多少种不同…

cg word List2

cg word List 2 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

如何扩展分布式日志组件(Exceptionless)的日志通知?

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

hadoop hive集群_基于伪分布式Hadoop搭建Hive平台详细教程

一、搭建环境的前提条件环境&#xff1a;Linux系统Hadoop-2.6.0MySQL 5.6apache-hive-2.3.7这里的环境不一定需要和我一样&#xff0c;基本版本差不多都ok的&#xff0c;所需安装包和压缩包自行下载即可。但是注意hive和hadoop都是2.x系列版本的。这里提供一个我下载的hive版本…

cg word List 3

cg word List 3 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;