.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.
这样整个过程就结束啦。
.net 5 开发跨平台客户端程序的更多相关文章
- java websocket开发的客户端程序
最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...
- 使用c++开发跨平台的程序
使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各样的语言被广泛使用,相对比来说c++不是那么出彩.c++虽然年龄大, ...
- Electron开发跨平台桌面程序入门教程
最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...
- 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- Linux下用gSOAP开发Web Service服务端和客户端程序
网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...
- WCF开发实战系列五:创建WCF客户端程序
WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...
- 使用Visual Studio开发跨平台的iOS应用程序
[原文发表地址]Developing cross-platform iOS application using Visual Studio [原文发表时间]2015/6/4 C ++是一种流行的高级编 ...
- Linux下用gSOAP开发Web Service服务端和客户端程序(一)
1.功能说明: 要开发的Web Service功能非常简单,就是一个add函数,将两个参数相加,返回其和. 2.C版本的程序: (1)头文件:SmsWBS.h,注释部分不可少,url部分的IP必须填写 ...
- Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复114或者20140312可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 如果没有安装Ribbon Wor ...
随机推荐
- 常见的yaml写法-CronJob
CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行.这个实际上和我们Linux中的crontab就非常类似了.一个CronJob ...
- 环境(6)Linux文件系统二
一:计算机间的数据传输 windows---linux : lrzsz :需要手动安装 yum install lrzsz -y ; rz 将文件从window上传到linux : ...
- 一行导出所有任意微软SQL server数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解
文章标题: 一行导出所有任意微软SQL serer数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解 关键字 : mssql-scripter,SQL Server 文章分 ...
- jsonpath解析淘票票,所有购票的城市
解决一些反爬,校验. 复制所有请求头 import urllib.request # 请求url url = 'https://dianying.taobao.com/cityAction.json? ...
- java 后台通过IO流把文件传到前端并下载
我的业务需求是两个不同的web程序放在不同的服务器上,web程序A要访问到web程序B上传上来的文件,所以用到了这一个IO读取文件的接口 JAVA代码(排版有点问题 已经尽力补救了(:3_ヽ)_) ...
- 爬虫进阶篇(一)scrapy
1.本教程默认认为您已经像我一样是个半吊子爬虫程序员 2.学习爬虫首先要懂得request,json,bs4,re,xpath,pymysql,random,time,文件相关,理解网络编程基本原理, ...
- Matlab指针数组
Matlab指针数组 前面博客Matlab指针中介绍了如何在Matlab中使用handle类型对象作为指针使用,本文则介绍一些使用这些类型指针的小技巧. 自定义类型的指针数组 在大部分编程语言中,我们 ...
- 【机器学习与R语言】10- 关联规则
目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...
- 49-Reverse Linked List II
Reverse Linked List II My Submissions QuestionEditorial Solution Total Accepted: 70579 Total Submiss ...
- du命令之计算文件大小
在linux中,常用du命令来计算文件或目录的大小 名称: du - 计算每个文件的磁盘用量,目录则取总用量. 用法: du [选项]... [文件]... 常用选项 -a, --all 输出所有文件 ...