基于TCP网络通信的自动升级程序源码分析--生成升级文件相关的配置文件

先从服务器端生成的配置文件说起吧 配置文件名称upgradeconfig.xml 文件内容大致如下

<?xml version="1.0" encoding="utf-8"?>
<UpgradeConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FileList>
    <string>Lighthouse.jpg</string>
    <string>Penguins.jpg</string>
    <string>Tulips.jpg</string>
    <string>UpgradeConfig.xml</string>
  </FileList>
  <AppVersion>2</AppVersion>
</UpgradeConfig>

这个配置文件是服务器端程序自动生成的

服务器端界面如下:

我们看一下点击这个按钮触发的相关方法

  //升级文件存放的目录
        //这个目录的位置是指定的 当然您也可以换个名称
        string upgradeFolder = AppDomain.CurrentDomain.BaseDirectory + "UpgradeFile\\";

        private UpgradeConfig upgradeConfig = null;

        private void button1_Click(object sender, EventArgs e)
        {
            //如果程序目录不存在UpgradeFile文件夹,则创建升级文件文件夹
            ActionHelper.CreateDir(upgradeFolder);

            List<string> list = new List<string>();
            DirectoryInfo dir = new DirectoryInfo(upgradeFolder);

            foreach (FileInfo info in dir.GetFiles())
            {
                //把文件名称添加到list列表中
                //info.FullName.Substring(upgradeFolder.Length)  表示去掉路径 只保留文件名称
                list.Add(info.FullName.Substring(upgradeFolder.Length));

            }
            //给upgradeConfig类赋值
            //<1> 给文件列表赋值
            upgradeConfig.FileList = list;
            //<2>把upgradeConfig类的内容保存成xml文件
            upgradeConfig.Save(UPConfigFilePath);

            //在窗体上显示一下
            listBox1.DataSource = list;
            textBox1.Text = upgradeConfig.AppVersion.ToString ();

        }
         

我们再来看一下upgradeConfig类

这个类既可以序列化后通过网络传输,也可以保存成本地xml文件

   [ProtoContract]
     public  class UpgradeConfig
    {
       //文件名称列表
        [ProtoMember(1)]
        public List<string> FileList { get; set; }

       //应用程序版本号

        [ProtoMember(2)]
        public int AppVersion { get; set; }

        /// <summary>
        /// 此处写法主要应对文件列表为空的情况,加上一下代码就不出错了
        /// </summary>
        [DefaultValue(false), ProtoMember(3)]
        private bool IsEmptyList
        {
            get { return FileList != null && FileList.Count == 0; }
            set { if (value) { FileList = new List<string>(); } }
        }

       //文件保存路径

        public UpgradeConfig()
        {

        }

       //加载配置文件
        public static UpgradeConfig LoadConfig(string filePath)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UpgradeConfig));

            StreamReader sr = new StreamReader(filePath);

            UpgradeConfig upgradeConfig = serializer.Deserialize(sr) as UpgradeConfig;

            sr.Close();

            return upgradeConfig;
        }
       //保存配置文件
        public void Save(string filePath)
        {
            XmlSerializer serialzier = new XmlSerializer(typeof(UpgradeConfig));

            StreamWriter writer = new StreamWriter(filePath);

            string tempPath = Path.GetDirectoryName(filePath);

            if (!Directory.Exists(tempPath))
            {
                Directory.CreateDirectory(tempPath);
            }

            serialzier.Serialize(writer, this);

            writer.Close();
        }

    }
  public static class ActionHelper
    {
        /// <summary>
        /// 确保路径中的目录存在
        /// </summary>
        /// <param name="spath"></param>
        public static void CreateDir(string spath)
        {
            string path = Path.GetDirectoryName(spath);

            if (!Directory.Exists(path))
            {
                DirectoryInfo directoryInfo = new DirectoryInfo(path);
                directoryInfo.Create();
            }
        }
    }

www.networkcomms.cn

www.cnblogs.com/networkcomms 编辑

时间: 2024-10-08 03:27:58

基于TCP网络通信的自动升级程序源码分析--生成升级文件相关的配置文件的相关文章

基于TCP网络通信的自动升级程序源码分析-启动升级文件下载程序

升级程序启动后,首先会连接服务器 private void Connect() { try { int port = int.Parse(System.Configuration.ConfigurationManager.AppSettings["Port"]); connnectionInfo = new ConnectionInfo(IPAddress, port); connection = TCPConnection.GetConnection(connnectionInfo)

基于TCP网络通信的自动升级程序源码分析-客户端接收文件

升级程序客户端接收文件 /// <summary> /// 文件数据缓存 索引是 ConnectionInfo对象 数据包的顺序号 值是数据 /// </summary> Dictionary<ConnectionInfo, Dictionary<long, byte[]>> incomingDataCache = new Dictionary<ConnectionInfo, Dictionary<long, byte[]>>();

基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息

每次升级,客户端都会获取服务器端存放在upgradefile文件夹下的需要升级的文件和升级信息配置文件(即upgradeconfig.xml文件) 我们来看一下代码 //升级信息配置文件相对应的类 ( 升级信息配置文件是由这个类转化成的) private UpgradeConfig upgradeConfig = null; //客户端存储升级配置文件的地址 是放在客户端根目录下的 (就是把服务器 upgradefile/upgradeconfig.xml下载到客户端存放的位置) string

基于TCP网络通信的自动升级程序源码分析-客户端连接服务器

服务器开始监听 //从配置文件获取要监听的IP和端口 string strIP = System.Configuration.ConfigurationManager.AppSettings["IPAddress"]; int port = int.Parse(System.Configuration.ConfigurationManager.AppSettings["Port"]); //开始监听 Connection.StartListening(Connect

【开源下载】基于TCP网络通信的自动升级程序c#源码

本程序使用开源的来自英国的networkcomms2.3.1网络通讯框架(c#语言编写) [http://www.networkcomms.net] 使用networkcomms框架作为工作中的主要编程框架1年多的时间了,networkcomms的有优美.稳定深深打动了我,基于此框架开发了不少程序,特别的稳定. networkcomms框架由英国剑桥的2位工程师开发,支持.net2.0以上平台,原生态的支持xamarion.android(安卓),xamarin.ios,以及蓝牙等多平台开发.

基于RTL819X实现的Router/AP的源码分析[一]

*************************************************************************************************************************** 作者:EasyWave                                                                               时间:2015.01.11 类别:路由器类-基于RTL819X实现的Ro

Tomcat源码分析——server.xml文件的加载与解析

前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析进行分析. 加载过程分析 Bootstrap的load方法用于加载tomcat的server.xml,实际是通过反射调用Catalina的load方法,代码如下: /** * Load daemon. */ private void load(String[] arguments) throws Exception { // Call

CodeIgniter框架——源码分析之入口文件index.php

CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 源码分析如下: <?php //这个文件是入口,后期所有的文件都要在这里执行. /*----------------------------------------------- * 系统环境配置常量 * 能够配置错误显示级别 * ----------------------------------------------- * 默认情况下: * developmen

Tomcat源码分析——server.xml文件的加载

前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载的进行分析. 源码分析 Bootstrap的load方法是加载tomcat的server.xml的入口,load方法实际通过反射调用了Catalina的load方法,见代码清单1. 代码清单1 /** * Load daemon. */ private void load(String[] arguments) throws Exceptio