C#编写软件发布公告1——客户端

news2024/9/20 14:52:26

前言
软件或者生活中有时需要将信息同步至电子公告板上,利用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;
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用前所未有的方式体验我们的现代 API 文档

增强您的 API 文档 对于开发人员 为内部和外部消费者创建从 API 定义文件自动生成的精美 API 文档。 只需 4 个简单步骤即可编写 API 文档 API 采用的成功取决于 API 文档的质量。 Baklib 从您的 API 定义文件创建漂亮的&#xff08;完全可定制的&#xff09;API 文档。帮助…

4个自定义倒计时

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>4个自定义倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;user-select: none;body {background: #0b1b2c;}}hea…

DedeCms 织梦系统 漏洞 上传webshell复现 四种方法 超详细

DedeCMS是织梦团队开发PHP 网站管理系统&#xff0c;它以简单、易用、高效为特色&#xff0c;组建出各种各样各具特色的网站&#xff0c;如地方门户、行业门户、政府及企事业站点等。 目录 方法一 &#xff1a;通过⽂件管理器上传WebShell 方法二&#xff1a;修改模板⽂件拿…

邻接矩阵实现图的存储

目录 一. 前言 二. 用邻接矩阵来实现图的存储 一. 前言 1. 图的定义 所谓图就是包含顶点和边的集合&#xff0c;是一种多对多的关系。用符号表示为&#xff1a;G(V,E)。其中&#xff0c;V代表顶点&#xff08;数据元素&#xff09;的有穷非空集合&#xff0c;E代表边的有穷集…

AI4-PPOCRLabel安装

推荐环境&#xff1a; - PaddlePaddle > 2.1.2 - Python 3.7 - CUDA10.1 / CUDA10.2 - CUDNN 7.6 1、安装Anaconda 说明&#xff1a;使用paddlepaddle需要先安装python环境&#xff0c;这里我们选择python集成环境Anaconda工具包 Anaconda是1个常用的python包管理程序 安装完…

虚拟机连接xshell的三种方式

第一 桥接 改为输入 systemctl restart network 关闭自启动防火墙 systemctl stop firewalld systemctl disable firewalld 查看本机网络信息 ifconfig 连接xshell 第二 nat 第三 仅主机

探索 Electron:打造深度书籍挖掘机的搜索体验

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

react-native从入门到实战系列教程-React Native Elements

react-native的ui框架内网真的是屈指可数&#xff0c;能用的成熟的几乎找不到。不像web端的繁荣景象&#xff0c;可以用荒凉来形容不为过。 京东的nutui说也支持react-native,官网及其简陋。尝试了未成功运行&#xff0c;可能是项目类型不同&#xff0c;对比其他类型的ui库都分…

centos安装es、kibana、ik

这里es使用的是7.10.2版本的es&#xff0c;物料包下载地址如下 #注意安装的插件需和es版本保持一致 #es https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linux-x86_64.tar.gz #kibana https://artifacts.elastic.co/downloads/kibana/kibana-7.10…

phpMyAdmin之CMS靶场

方法一&#xff1a;通过日志文件拿webshell 常用的语句如下&#xff1a; show global variables like %general%; set global general_logon; set global general_log_file D:/phpStudy_pro/WWW/muma.php; show global variables like %general%; select <?php eval($_…

广西南宁高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

南宁高校大学智能制造实验室&#xff0c;作为该地区乃至全国智能制造领域的重要研究和教学基地&#xff0c;一直致力于探索和创新智能制造技术。近日&#xff0c;该实验室的数字孪生可视化系统平台建设项目成功通过了验收&#xff0c;标志着其在数字孪生技术领域取得了重大突破…

c语言排序(2)

前言 在上一篇文章&#xff0c;我们学习了插入排序&#xff0c;选择排序以及交换排序中的冒泡排序&#xff0c;接下来我们继续学习交换排序、归并排序以及非比较排序。 1. 快速排序 快速排序是交换排序的一种&#xff0c;它的基本思想&#xff1a;任取待排序序列中的某元素作…

z3基础学习

z3基础学习 ​ z3是一个微软出品的开源约束求解器&#xff0c;能够解决很多种情况下的给定部分约束条件寻求一组满足条件的解的问题。 安装&#xff1a;pip install z3-solver 1. 简单使用 from z3 import * x Int(x) #创建名为x的int类型变量 y Int(y) solve(x y10,2*x…

【Verilog-CBB】开发与验证(1)——开个头

在Verilog代码设计的过程中&#xff0c;经常会涉及到一些常用组件的应用&#xff0c;比如仲裁器、打拍器、RS双向打拍器等。这些组件如果重复开发就会降低效率。这些常用的组件业内称为CBB&#xff08;Common Building Block&#xff09;。本专栏旨在开发一些好用易用的CBB&…

前端拥抱AI:LangChain.js 入门遇山开路之PromptTemplate

PromptTemplate是什么 PromptTemplate是一个可重复使用的模板&#xff0c;用于生成引导模型生成特定输出的文本。与Prompt的区别: PromptTemplate相对于普通Prompt的优势&#xff0c;即其灵活性和可定制性。 简单了解PromptTemplate后&#xff0c;咱们就来聊聊LangChain里的P…

Linux配置FTP服务

一、FTP服务基本信息 FTP服务器&#xff1a;一种应用广泛且古老的互联网文件传输协议&#xff0c;主要用于文件的双向传输。 默认端口号&#xff1a;21 全称&#xff1a;vsftpd 二、搭建FTP服务 1.关闭防火墙和selinux&#xff08;若linux系统没有这两种功能&#xff0c;跳…

最大化性能:VPS 主机优化技巧

如何让您的VPS更高效。VPS(虚拟专用服务器)是扩展网站具备成本效益的托管选项之一&#xff0c;虽然整体性能不错&#xff0c;但大多数用户并不知道&#xff0c;一些基本的优化&#xff0c;例如更改默认设置和降低负载&#xff0c;可能会大大提高其网站的速度。本文将为您介绍一…

阿里云ossbrowser安装及使用

ossbrowser是阿里云官方提供的OSS图形化管理工具&#xff0c;提供类似Windows资源管理器的功能。 阿里云对象存储OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;可提供99.9999999999%&#xff08;12个9&#xf…

运放开环增益,闭环增益,增益带宽积与频率的关系。压摆率对输出信号影响,TINA仿真验证

开环增益 运放开环增益AOL&#xff0c;运放负反馈形成固定放大倍数的闭环增益&#xff0c;形成的条件是建立在AOL无穷大”的基础之上&#xff0c;实际运放的AOL并不是无穷大&#xff0c;是和频率有关系的。 当AOL不是无穷大时候&#xff0c;虚短是不成立的。并且当AOL比较小的时…

算法日记day 27(回溯之N皇后|解数独)

一、N皇后 题目&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n…