状态机是什么?有什么用?

推荐一个状态机库,支持C++与C#,通过两种语言分别实现。链接:https://github.com/fawdlstty/SMLite

为了大家都能看懂,下面的代码以C#做示例,C++可以在项目里找到具体示例代码及用法。

回到最初的标题问题,我们来假设一下,假如碰到了一个需求,需求是实现一个半双工的网络处理程序,所谓半双工也就是上传时不能下载,下载时不能上传,另外也不能两块数据同时上传或下载。

看起来很简单是吧,一个线程专门做上传或下载操作。但如何让外部知道网络线程的状态呢?一个合适的方案是,定义一个枚举状态,有四种枚举值,Rest、Ready、Reading、Writing,分别代表搁置状态、待命状态、正在读取、正在写入。然后就是,外部的事件,比如打开、关闭、写入等命令,如何传达到线程呢?这儿可以定义触发器枚举值,Run、Close、Read、FinishRead、Write、FinishWrite六种,其中外部触发四种,内部触发两种(完成读取与完成写入,线程自己最先知道)。下面我们来分析分析状态与触发器的关系:

继续阅读状态机是什么?有什么用?

linux服务器软件自动化部署

自动化部署主要用在linux服务器集群上。比如有后台服务器需要升级软件,基本做法就是ftp传上去,然后ssh上面重启服务。假如后台服务器一旦多了,这种方式就很麻烦了。这时候可以考虑使用自动化部署的方式来实现后台程序自动更新。由于实现方式太多,是否用docker、WebHook还是GitHook还是轮询都能实现,此处我使用一种自认为最简单的方式实现。大致流程为git仓库->WebHook->程序接受相应->更新并重启

继续阅读linux服务器软件自动化部署

C#中的async/await关键字

这对关键字可能是C#迄今为止争议最大的关键字了。这两个关键字可谓是让人又爱又恨了。爱的是这对关键字极大简化了C#异步调用代码的开发,恨的是对初学者非常不友好,对于没用过这对关键字的人来说,使得丈二和尚摸不着头脑。

下面我将以最直观的原理来讲解这两个关键字的作用。在讲解这个之前,先给大家说说协程的原理。协程指的是一个线程里面分配多个调度任务,然后由用户选择是否切换任务。示例如下:
继续阅读C#中的async/await关键字

C#:HTTP客户端与服务器的实现

HTTP协议算是使用最广泛的Web协议了,主要面向基于B/S的实现。对于很多语言比如PHP或者javascript等Web语言,HTTP协议使用上甚至比TCP协议更简单。但这协议对普通的系统语言程序员就不太友好了。C#这种语言嘛,支持上还行,但并没达到特别优秀的效果,比如发起一个POST请求至少需要十行代码以上。这个库是我基于对C#语言封装的协议的了解,在此基础上新增的一个更加方便开发的库。源码在 https://github.com/fawdlstty/hanHttpLib 查看或下载。因为可能更新频繁,所以源码我就不在文章里面贴了。
目前这个库不算特别优秀,目前只支持基础的调用,结构也非常简单,但它能力可不差,用来给小伙伴学习也是极好的。我将不定期更新它,力争将其做到完美。
先说说HTTP的客户端。HTTP客户端主要是浏览器用来请求Web服务器上的资源用的,最广泛的就是浏览器了。每个浏览器都有一套HTTP客户端实现方式,请求完成资源后在界面上显示。但随着时代的发展,HTTP协议有着基本化的趋势。因为使用HTTPS进行通讯可以使用非常小的代价就能非常安全的加密通讯数据。另外HTTP客户端也不止是做浏览器了,除此之外最大的用处是做爬虫。比如很多零散的数据分布在零散的Web服务器上,这时就可以使用爬虫技术将零散的数据归纳起来。更加厉害的就是,再结合人工智能技术,爬取数据之后使用人工智能进行分析,差不多就能成就改变世界的武器了。
继续阅读C#:HTTP客户端与服务器的实现

C#:扩展方法集合类


Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

扩展方法集合类在C#中是一种特别的语法糖,可以在开发中极大简化代码的编写。主要功能是在系统类中创建自定义方法。比如字符串转数字,每次都得Convert.ToInt32 (str),从语法上来说就太不简洁了。下面我一步一步讲解扩展方法集合类的编写。首先创建一个静态类,类名必须为ExtensionMethods。示例代码如下

1
2
3
public static class ExtensionMethods {
    //...
}

所有扩展方法都需要放在此类中进行实现。首先创建一个静态函数,第一个参数使用this描述符,表示基于哪个类提供扩展方法

1
2
3
public static Int32 toInt32 (this object o) {
    return Convert.ToInt32 (o);
}

此函数代表在object这个类基础上新增一个扩展方法,无参数,返回值为Int32类型。示例调用代码如下:

1
int t = "123".toInt32();

下面我提供一个我自用的扩展方法集合类供参阅
继续阅读C#:扩展方法集合类

C#:使用OpenXML读写Excel文档

对于Office文件的读写操作始终是一个比较麻烦的事情,最近做了一个Office操作的小程序,写一个文章用于备忘。
Office文件读写方法挺多,最好的方法自然是OpenXML无疑,但这库用起来还是比较麻烦。我在此做一个Excel读写小例子,其他Office类型同理。
对于OpenXML这库,首先需要知道OpenXML是什么。新建一个Excel文件,另存为a.xlsx,然后将其重命名为a.rar,解压,然后看到一大堆xml文件。不用怀疑,这就是xml标准。对于Office文件的读的访问来说,如果对OpenXML不熟,并且使用其他语言不方便调用C#的库,那么,手工解压然后找找数据的位置,然后手工解析,是最快捷的方式。当然,在可以使用OpenXML的场合,我个人还是推荐使用OpenXML。
OpenXML2.5下载地址(主体工具摘自微软官网,扩展摘自网络):https://pan.baidu.com/s/1slDa0Jr,提取码98dd
这个工具只有英语版的,但由于操作过于简单,所以对于英语小白也完全无压力。
继续阅读C#:使用OpenXML读写Excel文档

ASP.Net 后台访问Cookie的封装


Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

这是一个类,用于提供后台C#访问Cookie,函数不多,只有几个,包括设置、获取、修改。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
 
namespace SqlHelper {
	public class Cookie2 {
		/// <summary>
		/// 设置Cookie的值,关闭Session后释放
		/// </summary>
		/// <param name="name">名称</param>
		/// <param name="value">Cookie值</param>
		/// <param name="response">HttpResponse</param>
		public static void Set (HttpResponse response, string name, string value) {
			HttpCookie cookie = new HttpCookie (name);
			cookie.Values.Add (name, value);
			response.AppendCookie (cookie);
		}
 
 
 
		/// <summary>
		/// 设置Cookie的值,包含过期时间
		/// </summary>
		/// <param name="name">名称</param>
		/// <param name="value">Cookie值</param>
		/// <param name="expiredays">过期时间</param>
		/// <param name="response">HttpResponse</param>
		public static void Set (HttpResponse response, string name, string value, DateTime expiredays) {
			HttpCookie cookie = new HttpCookie (name);
			cookie.Expires = expiredays;
			cookie.Values.Add (name, value);
			response.AppendCookie (cookie);
		}
 
 
 
		/// <summary>
		/// 获取Cookie值
		/// </summary>
		/// <param name="name">名称</param>
		/// <param name="request">HttpRequest</param>
		/// <returns>Cookie的值</returns>
		public static string Get (HttpRequest request, string name) {
			if (request.Cookies[name] != null) {
				return request.Cookies[name].Values.toString();
			} else {
				return null;
			}
		}
 
 
 
		/// <summary>
		/// 删除Cookie
		/// </summary>
		/// <param name="name">名称</param>
		/// <param name="response">HttpResponse</param>
		/// <param name="request">HttpRequest</param>
		public static void Delete (HttpResponse response, HttpRequest request, string name) {
			HttpCookie cookie = request.Cookies[name];
			if (cookie != null) {
				cookie.Expires = DateTime.Now.AddDays (-1);
				response.AppendCookie (cookie);
			}
		}
 
 
 
		/// <summary>
		/// 修改Cookie的值
		/// </summary>
		/// <param name="name">名称</param>
		/// <param name="value">Cookie值</param>
		/// <param name="response">HttpResponse</param>
		/// <param name="request">HttpRequest</param>
		public static void Modify (HttpResponse response, HttpRequest request, string name, string value) {
			HttpCookie cookie = request.Cookies[name];
			if (cookie != null) {
				cookie.Values[name] = value;
			}
			response.AppendCookie (cookie);
		}
	}
}

C#访问数据库SqlHelper的封装及如何访问Excel

SqlHelper这名称代表一个库,用于访问数据库的简单封装。比如一个完整的数据库查询过程:首先创建链接,然后判断链接是否有效,然后创建查询参数列表,然后调用查询语句,然后处理数据,最后关闭链接。说起来就感觉这东西有点复杂,一般有经验的程序猿都从方便自身角度对SqlHelper进行一定程度的封装,简化对数据库的调用。每个玩过数据库的程序猿都有一个,我的长这样:
继续阅读C#访问数据库SqlHelper的封装及如何访问Excel