介紹下.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.
這樣整個過程就結束啦。