阅读量:0
前言
软件或者生活中有时需要将信息同步至电子公告板上,利用C#可以快速实现这一目的,这里以软件公告场景设计,主要是将软件的版本号等相关信息同步至服务器,同步成功后,任务需要查找的人员只要有Web浏览器就可以快速查看更新信息;如果在社区公告场景也可以如法炮制。
一、界面效果展示
1、启动界面
2、后台配置文件
3、读取数据
4、上传
客户端操作:
5、结果
服务器显示:
二、实际代码
注意: 这里只是列举主要逻辑代码。
1、Web访问类
利用C#提供的HttpWebRequest来进行Web访问(由于是CS这种结构,所以这个服务端也可以用其他语言进行编写,同理客户端也可以是多种语言进行编写),根据实际情况封装Post和Get请求。
private string Post(string str, string url) { string result = ""; HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url+"?"+str); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/json; charset=UTF-8"; httpWebRequest.Timeout = 5000; //byte[] bytes = Encoding.UTF8.GetBytes(str); //httpWebRequest.ContentLength = (long)bytes.Length; using (StreamReader streamReader = new StreamReader(((HttpWebResponse)httpWebRequest.GetResponse()).GetResponseStream(), Encoding.UTF8)) { result = streamReader.ReadToEnd(); } return result; } private string Get(string url) { // ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(MesCommHelp.CheckValidationResult); string result = ""; HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.Method = "GET"; httpWebRequest.ContentType = "application/json; charset=UTF-8"; httpWebRequest.Timeout = 2000; using (StreamReader streamReader = new StreamReader(((HttpWebResponse)httpWebRequest.GetResponse()).GetResponseStream(), Encoding.UTF8)) { result = streamReader.ReadToEnd(); } return result; }
2、Ini配置读写类
public string INIGetStringValue(string section, string key, string defaultValue) { string value = defaultValue; const int SIZE = 1024; if (string.IsNullOrEmpty(section)) { throw new ArgumentException("必须指定节点名称", "section"); } if (string.IsNullOrEmpty(key)) { throw new ArgumentException("必须指定键名称(key)", "key"); } StringBuilder sb = new StringBuilder(SIZE); uint bytesReturned = GetPrivateProfileString(section, key, defaultValue, sb, SIZE, _iniFile); if (bytesReturned != 0) { value = sb.ToString(); } sb = null; return value; } public bool INIWriteValue(string section, string key, string value) { if (string.IsNullOrEmpty(section)) { throw new ArgumentException("必须指定节点名称", "section"); } if (string.IsNullOrEmpty(key)) { throw new ArgumentException("必须指定键名称", "key"); } if (value == null) { throw new ArgumentException("值不能为null", "value"); } return WritePrivateProfileString(section, key, value, _iniFile); }
3、业务中心类
1、配置信息读取
private void ReadInfo() { BaseUrl = iniHelp.INIGetStringValue("MESInfo", "URL", ""); LastSn = iniHelp.INIGetStringValue("LastRecord", "SN", ""); LastDataTime = iniHelp.INIGetStringValue("LastRecord", "Time", ""); RecordFileName = iniHelp.INIGetStringValue("FileInfo", "Path", ""); EndSymbol = iniHelp.INIGetStringValue("FileInfo", "EndSymbol", "EndSymbol"); }
2、公告文件读取
public bool ReadFileInfo(out InfoItem infoItem) { infoItem = new InfoItem(); try { string[] allLines = File.ReadAllLines(RecordFileName); int i = allLines.Length - 1; bool IsHave = false; int endIndex = -1; for (; i > 0; i--) { if (string.IsNullOrEmpty(allLines[i])) { if (IsHave) { break; } } else { if (!IsHave) { IsHave = true; endIndex = i; } } } i = i + 1; string firstRow = allLines[i]; string descInfo = string.Empty; for (int j = i + 1; j <= endIndex; j++) { string item = allLines[j]; if (!item.EndsWith(EndSymbol)) { item += EndSymbol; } string[] arrs= item.Split('、'); if (arrs.Length>1) { if (int.TryParse( arrs[0],out int id)) { Console.WriteLine("切割后处理:" + arrs[0]); item = item.Replace(arrs[0] + "、", arrs[0] + "."); } } descInfo += item; } string[] strs = firstRow.Split(' '); infoItem = new InfoItem(strs[1], strs[0], descInfo); return true; } catch (System.Exception ex) { ErrStr = ex.Message; return false; } }
3、保存更新记录
private void UpdataRecordToIni(string sn) { iniHelp.INIWriteValue("LastRecord", "SN", sn); iniHelp.INIWriteValue("LastRecord", "Time", DateTime.Now.ToString()); }
4、提交更新信息
internal bool UpdataRecord(InfoItem infoItem) { string info = $"SN={infoItem.SN}&Datetime={infoItem.DateTime}&Info={ infoItem.DescrInfo}"; try { string res = mes.ExePost(info, BaseUrl); if (res.Contains("成功")) { UpdataRecordToIni(infoItem.SN); return true; } ErrStr = "服务器响应消息为失败"; return false; } catch (System.Exception ex) { ErrStr = ex.Message; return false; } }
5、信息检测
private bool CheckInfo(string sn, string dateInfo, string str) { if (string.IsNullOrEmpty(sn)) { SetInfo("版本号不能为空", false); return false; } if (!Regex.IsMatch(sn, "^(?<y>\\d{1,2})\\.(?<m>\\d{1,2})\\.(?<d>\\d{1,2})$")) { SetInfo("版本号格式不正确", false); return false; } if (string.IsNullOrEmpty(dateInfo)) { SetInfo("日期不能为空", false); return false; } if (!Regex.IsMatch(dateInfo, "^(?<year>\\d{2,4})-(?<month>\\d{1,2})-(?<day>\\d{1,2})$")) { SetInfo("日期格式不正确", false); return false; } if (string.IsNullOrEmpty(str)) { SetInfo("描述信息不能为空", false); return false; } return true; }