zoukankan      html  css  js  c++  java
  • c/s 自动升级(WebService)

    c/s 自动升级(WebService)

    首先声明,本人文笔不好,大家见笑,请高手不要吐槽.

    做c/s开发肯定会遇到的就是自动升级功能,而这实现方式是非常多. 本文使用 webservice的方式来提供升级服务

      


    首先准备服务

    为了方便我们专门用一个文件夹来存放需要更新的应用程序

    因为觉得通过新版本来更新很麻烦,所以验证文件是否需要更新用md5来判断

    WebService:

    复制代码
     public string GetVer()
            {
                DirectoryInfo dir = new DirectoryInfo(Server.MapPath("update"));
                var list = new List<object>();
                var url = string.Format("http://{0}:{1}/update/", HttpContext.Current.Request.Url.Host,
                                        HttpContext.Current.Request.Url.Port);
    
                DirectoryInfoHelper.SetDirectoryInfo(dir, list, url, "");
                JavaScriptSerializer json = new JavaScriptSerializer();
                return json.Serialize(list);
            }
    复制代码

    相关方法:

    复制代码
    public static void SetDirectoryInfo(DirectoryInfo dir, List<object> list, string url, string dirName)
            {
                foreach (var file in dir.GetFiles())
                {
                    FileStream fs = File.OpenRead(file.FullName);
                    list.Add(new { file.Name, Md5 = Security.GetMd5(fs), LocalHost = url, Directory = dirName });
                    fs.Close();
                }
                foreach (var dirInfo in dir.GetDirectories())
                {
                    SetDirectoryInfo(dirInfo, list, url, string.Format("{0}{1}/", dirName, dirInfo.Name));
                }
            }
    复制代码

    说明:1.不创建模型,而服务端只需要提供数据,所以采用匿名对象

           2.GetVer服务返回信息中 包含 文件名,md5值,域名地址,该文件上级目录


    C/S:

    先看界面

    现在就跟着提示消息走吧.

    1.获取服务文件特征

    调用webservice获取文件信息

    复制代码
    private List<VerMd5Date> GetServerData()
            {
                AutoUpdate.Update update = new AutoUpdate.Update();
                var json = update.GetVer();
                var list = AppCode.JsonHelper.JsonDeserialize<VerMd5Dates>(json);
                return list;
            }
    复制代码

    客户端需要反序列化json 所以建了一个对应model

    复制代码
    public class VerMd5Date
        {
            public string Name { get; set; }
            public string Md5 { get; set; }
            public string LocalHost { get; set; }
            public string Directory { get; set; }
        }
        class VerMd5Dates : List<VerMd5Date>
        {
        }
    复制代码

    反序列化:

    复制代码
     /// <summary>
            /// 反序列化json
            /// </summary>
            /// <typeparam name="T">对象</typeparam>
            /// <param name="jsonString">json字符串</param>
            public  static T JsonDeserialize<T>(string jsonString)
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
                MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
                T obj = (T)ser.ReadObject(ms);
                return obj;
            }
    复制代码

    2.获取本地文件特征

    复制代码
    private List<VerMd5Date> GetLocalData(List<string> serverNames)
            {
                DirectoryInfo dir = new DirectoryInfo(Application.StartupPath);
                var list = new List<VerMd5Date>();
                DirectoryInfoHelper.GetDirectoryInfo(dir, list,"",serverNames);
                return list;
            }
    复制代码

    相关方法:

    复制代码
    public static void GetDirectoryInfo(DirectoryInfo dir, List<VerMd5Date> list, string dirName, List<string> serverNames)
            {
                foreach (var file in dir.GetFiles().Where(m=>serverNames.Contains(dirName+m.Name)))
                {
                    using (FileStream fs = File.OpenRead(file.FullName))
                    {
                        list.Add(new VerMd5Date
                            {
                                Name = file.Name,
                                Directory = dirName,
                                Md5 = Security.GetMd5(fs)
                            });
                    }
                }
                foreach (var dirInfo in dir.GetDirectories())
                {
                    GetDirectoryInfo(dirInfo, list, string.Format("{0}{1}/", dirName, dirInfo.Name), serverNames);
                }
            }
    复制代码

    说明:serverNames 是服务器文件名集合,主要用来排除本地文件夹中非本程序文件

    3.对比文件差异

    复制代码
    private List<VerMd5Date> EqualsList(List<VerMd5Date> list, List<VerMd5Date> localList)
            {
                var getList = new List<VerMd5Date>();
                foreach (var ver in list)
                {
                    var file = localList.FirstOrDefault(m => m.Name == ver.Name && m.Directory == ver.Directory);
                    if (file == null)
                    {
                        getList.Add(ver);
                    }
                    else
                    {
                        if (file.Md5 != ver.Md5 && file.Directory == ver.Directory)
                        {
                            getList.Add(ver);
                        }
                    }
                }
                return getList;
            }
    复制代码

    4.下面就开始下载吧

    foreach (var file in _getList)
                {
                    SetItem(string.Format("正在下载 {0}{1}", file.Directory, file.Name));
                    DownloadFile(file.LocalHost, file.Directory, file.Name, progressBar1);
                }
    DownloadFile:
     View Code

    public void DownloadFile(string localHost, string dirName, string filename, ProgressBar prog)
    {
    try
    {
    WebRequest rq = WebRequest.Create(string.Format("{0}{1}{2}", localHost, dirName, filename));
    WebResponse rp = rq.GetResponse();

    if (prog != null)
    {
    SetProg((int) rp.ContentLength, 1);
    }
    string path = string.Format("{0}/{1}", Application.StartupPath, dirName);
    if (!Directory.Exists(path))
    {
    Directory.CreateDirectory(path);
    }
    Stream newFile = File.Create(string.Format("{0}{1}", dirName, filename));
    Stream serviceFile = rp.GetResponseStream();
    if (serviceFile == null)
    return;

    long totalDownloadedByte = 0;
    byte[] by = new byte[102400];
    int osize = serviceFile.Read(by, 0, by.Length);
    while (osize > 0)
    {
    if (!cbCpu.Checked)
    Thread.Sleep(1);

    newFile.Write(by, 0, osize);
    osize = serviceFile.Read(by, 0, by.Length);
    if (prog == null)
    continue;

    totalDownloadedByte = osize + totalDownloadedByte;
    SetProg((int) totalDownloadedByte, 2);
    }
    newFile.Close();
    serviceFile.Close();
    SetItem("下载完成");
    }
    catch(Exception e)
    {
    SetItem(string.Format("---程序异常:{0}", e.Message));
    }
    }

    下载方式有很多,这里已经有了文件的下载地址,下载代码大家就尽情发挥.有什么好的方式也告诉我一下,非常感谢

    运行截图

    基本上就完了.请高手不要吐槽啊.

     源码地址:http://pan.baidu.com/share/link?shareid=656896785&uk=2215622930

     
     
    分类: C/S
  • 相关阅读:
    thinkphp---部署在IIS8.0服务器上
    程序员撩妹小技巧
    php---进行签名验证
    php---进行RSA进行非对称加密
    python---使用md5加密
    (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 顺序分析和聚类分析算法)
    (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 关联规则分析算法)
    (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 时序算法——结果预算+下期彩票预测篇)
    (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 时序算法)
    (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(结果预测篇)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3289356.html
Copyright © 2011-2022 走看看