.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.

這樣整個過程就結束啦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM