• .net 5 开发跨平台客户端程序


    介绍下.net 跨平台开发服务端程序的过程, .net 5发布已经有段时间了,.net 5根据微软官方的说法将来只有一个.net版本,也就是不在有core之分。从.net5开始整合.net framework和.net core,.net 5的性能也获得极大的提升和优化。再往后就是  .net6 ,.net7等等。

    本篇介绍的是用 .net 5开发控制台程序,程序是一个MQTT数据转发服务。

    .net 5跨平台开发与传统.net framework并没有太大区别,所以从.net framework 转到.net 5,并没有什么难度 。

    第一步,创建项目类型选择 

     

    确定后下一步,框架选择.net5

     创建完成后,得到程序目录

     这个DEMO,编写一个.net 5跨平台Socket监听程序,在整个过程中对比下与传统的framework开发。其实代码层面并没有太大区别。

     主程序,入口方法

            static void Main(string[] args)
            {
                SocketHelper socketHelper = new SocketHelper();
                socketHelper.StartListener();
    
                Thread.Sleep(Timeout.Infinite);
                //Console.Read();
            }

    后面介绍  SocketHelper  里面具体的内容,这里将Console.Read()换成 Thread.Sleep(Timeout.Infinite); 也是在开发过程中踩到的一个坑,用 Console.Read() 在将程序注册到linux后台进程的时候会失败。

    用 Thread.Sleep(Timeout.Infinite); 可以解决问题。

    下面是 介绍  socketHelper,这里的 StartListener 开启了一个子线程监听socket端口,保证主进程不会中断。

            /// <summary>
            /// 开启调用监听
            /// </summary>
            public void StartListener()
            {
                try
                {
                    //开始监听 
                    Thread mythread = new Thread(new ThreadStart(BeginListen));
                    mythread.Start();             
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    //LogHelper.WriteLog(ex.Message, ex);
                }
            }

            /// <summary>
            ///开启监听
            /// </summary>
            private void BeginListen()
            {
                try
                {
                    //获取配置文件信息
                    var config = System.Configuration.ConfigurationManager.AppSettings["TransferPort"];
    
                    if (config == null)
                    {
                        Console.WriteLine("请配置正确的端口号!");
                        return;
                    }
    
                    //转换端口
                    int transferPort = Convert.ToInt32(config);
    
                    Console.WriteLine(transferPort);
    
                    IPEndPoint iep = new IPEndPoint(IPAddress.Any, transferPort);
    
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                    //byte[] byteMessage = new byte[100];
    
                    Console.WriteLine(iep.ToString());
    
                    socket.Bind(iep);
                    socket.Listen(1000);
                    socket.BeginAccept(new AsyncCallback(deviceAccepted), socket);
                }
                catch (Exception ex)
                {
     
                    Console.WriteLine(ex.Message);
     
                }
            }


             byte[] buffer = new byte[1024];
    
            /// <summary>  
            /// 客户端连接成功  
            /// </summary>  
            /// <param name="ar"></param>  
            public void deviceAccepted(IAsyncResult ar)
            {                     
                try
                {
                    Console.WriteLine("客户端连接");
    
                    var socket = ar.AsyncState as Socket;
                    //这就是客户端的Socket实例,我们后续可以将其保存起来  
                    var client = socket.EndAccept(ar);
    
                    //接收客户端的消息(这个和在客户端实现的方式是一样的)异步  
                    client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
                    //递归调用,准备接受下一个客户端请求(异步)  
                    socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
                }
                catch (Exception ex)
                {                
                    Console.WriteLine(ex.Message);                
                }          
            }
            /// <summary>  
            /// 接收某一个客户端的消息  
            /// </summary>  
            /// <param name="ar"></param>  
            public void ReceiveMessage(IAsyncResult ar)
            {
                int length = 0;
    
                var socket = ar.AsyncState as Socket;
                //客户端IP地址和端口信息          
                try
                {               
                    //方法参考: 
                    length = socket.EndReceive(ar);
    
                    string recv_request = BinaryUtil.ByteToHex(buffer);
                //服务器发送消息,递归调用  
                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
                                  
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);                
                }
            }
    
    

    这里看到 我读取配置的方法任然是 System.Configuration.ConfigurationManager.AppSettings["Key"];因为习惯了传统framework读取配置的方式,我这里没有从json中读取配置。

    引入这个包就可以像framework那样从config文件中读取配置了。

    这里主要目的是借用Socket 通信开发对比下 .net framework 与.net 的区别,其实可以看出,几乎没有区别,只是在建项目时的模板选择不同。

    代码开发完成后接下来就是编译部署了。在bin目录下,找到net5.0 文件夹,把里面的内容打包发送到linux服务器就行了。

     要注意的是linux的压缩包格式跟windows不同,可以选择 7-zip,压缩格式选择 .tar

    压缩完成后将压缩包传送到服务器相应目录。

    然后连接到服务器进入相应目录下,解压压缩文件,tar xvf  压缩包,这一块的处理可以看我之前的博客

    例如:

    tar xvf net5.0.tar

    解压后进入解压后的文件夹目录内,

    输入 dotnet 你的主程序dll文件名,就可以运行了,是不是很简单。

    例如我这里项目名是   ConsoleDataTransferCore

    生成的dll文件

     那么我的运行命令就是 dotnet ConsoleDataTransferCore.dll.

    这样整个过程就结束啦。

  • 相关阅读:
    4_url_for的使用
    3_Flask中URL与视图函数的映射
    2_Fiask的配置文件config
    C10K问题渣翻译
    (转载)Linux 套接字编程中的 5 个隐患
    linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一
    linux2.6.24内核源代码分析(1)——扒一扒sk_buff
    andriod手机签到应用服务器设计
    (转)ubuntu安装opengl
    线段树
  • 原文地址:https://www.cnblogs.com/motion/p/15357359.html
Copyright © 2020-2023  润新知