zoukankan      html  css  js  c++  java
  • TCP和SSL TCP应用

    TCP和SSL TCP应用

    对于普通开发者而言编写TCP应用通讯是一件相对复杂的工作,毕竟需要一系列的bytes操作;如果再针对SSL的安全性处理相信会把很多普通开发者拒之门外.为了简化这一问题BeetleX引入了Stream操作模式并提供PipiStream操作对象让开发者在TCP流操作上变得非常简便;由于PipiStream​是基本saea扩展的流操作模型,因此在提供简便操作的同时还能提供出色的性能。以下介绍如何使用BeetleX构建TCP和基于SSL的TCP应用示例。

    引用组件

    使用组件可以通过Nuget引用组件,最新版本是1.2.6.8

    构建TCP服务

    组件构建通讯应用非常简单,在引用组件后简单实现IServerHandler接口即可,以下是简单构建的服务代码:

    复制代码
        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}	{e.Type}	{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事件来处理接收的数据可。以上代码是尝试从流中读取一行字符信息,如果读成功后显示内容并把当前时间输出给客户端。

    构建TCP客户端

    由于客户端和服务端使用同一套Stream实现体系,所以在客户端上也是使用同样的流模式操作即可.

    复制代码
                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信息即可实现安全的SSL通讯。

    复制代码
        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}	{e.Type}	{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();
                }
            }
        }
    复制代码

    SSL客户端

    复制代码
        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的启动状态

    支持平台

    组件支持2.1或更高版本的dorecore 和Standard2.0

    https://ikende.com/Files/BeetleX.Samples.Echo.zip


    专注dotnet core 服务应用技术研发

    什么时候使用BeetleX.FastHttpApi

    • 当你需要一个高性能的webapi服务的时候,因为它具有asp.net core mvc的简便使用特性的同时提升了200%或更高的性能。
    • 当你希望接口同时支持http和websocket,组件支持一个逻辑控制器同时提供http和websocket两种服务,即一份代码即可服务http和websocket请求
    • 当你需要一个嵌入的HTTP服务应用,组件支持netstandard2.0,可以灵活地在winform或wpf中集成一个可靠的HTTP服务。
  • 相关阅读:
    Some Depth Theory
    Hom和$otimes$如何把我绕晕
    A natrual way to introduce homotopy groups
    指数多项式的Galois群计算
    Trianglated Category and Derived Categories
    最近的代数课上的一些灵魂提问
    致青年朋友的一封信 莫洛亚
    一个函数证明题
    游客的故事
    14. 运算符重载(二)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/10964449.html
Copyright © 2011-2022 走看看