介绍下.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.

这样整个过程就结束啦。

.net 5 开发跨平台客户端程序的更多相关文章

  1. java websocket开发的客户端程序

    最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...

  2. 使用c++开发跨平台的程序

    使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各样的语言被广泛使用,相对比来说c++不是那么出彩.c++虽然年龄大, ...

  3. Electron开发跨平台桌面程序入门教程

    最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...

  4. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  5. Linux下用gSOAP开发Web Service服务端和客户端程序

    网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...

  6. WCF开发实战系列五:创建WCF客户端程序

    WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...

  7. 使用Visual Studio开发跨平台的iOS应用程序

    [原文发表地址]Developing cross-platform iOS application using Visual Studio [原文发表时间]2015/6/4 C ++是一种流行的高级编 ...

  8. Linux下用gSOAP开发Web Service服务端和客户端程序(一)

    1.功能说明: 要开发的Web Service功能非常简单,就是一个add函数,将两个参数相加,返回其和. 2.C版本的程序: (1)头文件:SmsWBS.h,注释部分不可少,url部分的IP必须填写 ...

  9. Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复114或者20140312可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 如果没有安装Ribbon Wor ...

随机推荐

  1. 大一C语言学习笔记(2)---快捷键篇

    大家好,博主呢,是一位刚刚步入大一的软件工程专业的大学生,之所以写博客,是想要与同样刚刚接触程序员一行的朋友们一起讨论,进步,在这里记录我的一些学习笔记及心得,希望通过这些点点滴滴的努力,可以让我们离 ...

  2. Effective C++ 总结笔记(六)

    七.模板与泛型编程 41.了解隐式接口和编译器多态 1.类和模板都支持接口和多态. 2.类的接口是显式定义的--函数签名.多态是通过虚函数在运行期体现的. 3.模板的接口是隐式的(由模板函数的实现代码 ...

  3. [noi31]MST

    定义dp[i]表示当前连通块状态为i的方案数(状态记录该状态每一个连通块的大小),那么从小到大枚举每条边,考虑这条边在不在最小生成树上: 1. 如果不在最小生成树上,那么这条边有$\sum_{i=1} ...

  4. [atAGC001F]Wide Swap

    结论:排列$p'_{i}$可以通过排列$p_{i}$得到当且仅当$\forall 1\le i<j<i+k,(p_{i}-p_{j})(p'_{i}-p'_{j})>0$ 证明:构造 ...

  5. Codeforces 516D - Drazil and Morning Exercise(树的直径+并查集)

    Codeforces 题目传送门 & 洛谷题目传送门 这是一道 jxd 的作业题,感觉难度不是特别大(虽然我并没有自己独立 AC,不过也可能是省选结束了我的脑子也没了罢(((,就随便写写罢 u ...

  6. CF1542E2 Abnormal Permutation Pairs (hard version)

    CF1542E2 Abnormal Permutation Pairs (hard version) good tea. 对于两个排列 \(p,q\),如果 \(p\) 的字典序小于 \(q\),则要 ...

  7. C++ and OO Num. Comp. Sci. Eng. - Part 4.

    命名空间与文件(Namespaces and Files) 在 C++ 中,命名空间为包含相关声明与定义的逻辑单元. 将一个大程序分割为不同部分并且将其储存在不同的文件中可以实现模块化编程. 未命名的 ...

  8. 【R】write.table输出数据带有行名?

    目录 问题 解决一 解决二 问题 这个问题应该很常见吧.R中输出数据框时,想要把行名和列名都输出.如果直接输出的话,输出的结果列名会往前移动一位,这显然不是我们想要的. 直接上例子: > a = ...

  9. Linux—linux 查看一个文件有多少M

    ls -l --block-size=M   #就把目录下的所有文件按M单位呈现

  10. vc控制台程序关闭事件时的正确处理方式

    百度可以找到很多关于这个问题解决的方法 关键控制台API函数:SetConsoleCtrlHandler 在支持C++ 11以上的编译器中,你可以这么做. SetConsoleCtrlHandler( ...