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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值