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

栏目: IT技术 · 发布时间: 4年前

内容简介:组件的最新版本是构建

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 服务,启动服务后可以看到服务的详细信息

使用BeetleX构建基础的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 访问的网络程序就完成,最后可以通过服务端的日志查看相关工作情况:

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

海量运维、运营规划之道

海量运维、运营规划之道

唐文 / 电子工业出版社 / 2014-1-1 / 59.00

《海量运维、运营规划之道》作者具有腾讯、百度等中国一线互联网公司多年从业经历,书中依托工作实践,以互联网海量产品质量、效率、成本为核心,从规划、速度、监控、告警、安全、管理、流程、预案、考核、设备、带宽等方面,结合大量案例与读者分享了作者对互联网海量运维、运营规划的体会。 《海量运维、运营规划之道》全面介绍大型互联网公司运维工作所涉及的各个方面,是每个互联网运维工程师、架构师、管理人员不可或......一起来看看 《海量运维、运营规划之道》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换