一下软件更新服务里面的客户度端更新,可以待会出门看一下

软件更新服务之顾客端更新

在现今的软件开发和使用中,软件的更新是很关键的一环。通过不停的更新软件,迭代,给用户带来更好的体验和更多的功能以及修补用户反馈的bug。我们在更新的软件的时侯,假如每次都要用户从新安装软件的话,想必体验也不会挺好,也很麻烦,浪费毋须要的资源。

这么明天就继续给你们说要一下软件更新服务上面的顾客度端更新。有些前面关注的朋友没听到上面写的那篇服务端搭建的文章的话,可以待会出门左转看一下。

奢华分割线

在此次顾客端编撰过程当中,为了给你们可以看见愈发直观的疗效就简单做了个界面,使用到了以下技术:

PyQt5

Python3

python序列化

urllib下载文件

你们先在pycharm中,把pyqt5给装上,pipinstallPyQt5,也可以在设置的上面的projectinterpreter上面下载安装。

接着,就配置好外部工具,QtDesigner以及PyUIC这两个外部工具。

因为这两个工具的配置比较简单,我就不作说明了,你们可以自行百度一下百度客户端自动更新程序,随便参考一种都可以顺利配置好这两个外部工具的。

接着,打开designer来对界面进行勾画设计。

图片[1]-一下软件更新服务里面的客户度端更新,可以待会出门看一下-唐朝资源网

大约就这样就可以了,一个标题、一个文本框、两个按键就足够显示了。

尽管长得丑了一点,而且我们此次文章的关键不是界面的美化,所以就不作其他处理了。

保存好,再到pycharm上面对ui文件运行一下PYUIC就OK

图片[2]-一下软件更新服务里面的客户度端更新,可以待会出门看一下-唐朝资源网

这个时侯,界面代码已然由设计图转成Python代码了,可以看见它生成了一个类,而且还跑不动,由于没有引用到它。所以,我们先放它到一边。

图片[3]-一下软件更新服务里面的客户度端更新,可以待会出门看一下-唐朝资源网

接着,我们就重新创建好一个py文件,导出我们预期就要用到的库。

hashlib估算MD5用

sys

pickle估算序列化

urllib下载文件

urllib3

os处理文件和目录

这几个库导进来后,就开始新建一个类,承继刚刚生成的那种界面类。写法如下

python11行

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

这个时侯,运行文件就可以显示出界面了。并且这样将界面和实际操作的代码分隔开来可以防止重新UIC界面时,代码会遗失,而造成要重画的问题。

OK,界面下来后,就要实现功能了。更新,更新怎样做?

上一篇更新服务文章早已提供了更新说明和下载服务了,所以,我们此次就借助好这种插口。

我们又新建一个类,专门拿来处理更新文件的,所以就简单的叫UpdateFiles吧。

在这儿再过一次流程:

从服务器里面领到清单文件

反序列清单文件

比较上面的数据,假如文件存在则估算MD5,相同就跳过,不相同就打算下载

假如文件不存在百度客户端自动更新程序,则不用估算MD5了,直接打算下载

所以,就须要3个函数,下载文件函数、计算MD5值函数、检查更新函数

根据这三个需求以及上一篇的插口,我们可以很快就完成代码的编撰。

在UpdateFiles这个类中完成这几个功能的开发后,便可以很便捷的完成更新文件的服务功能。

因为早已整理成一个类,所以,前面假如诸位希望可以在自己代码中用到这样子的更新服务的话吗,就可以直接将这个类copy过去,改一些东西就可以用了。

这儿说一下写代码踩的坑吧

1、因为用的是urllib去下载的文件,多级目录下,文件不存在的时侯,并不会在目标目录手动新建目录。所以,在下载的时侯,须要对路径进行处理,筛选出目标目录,mkdir创建一下目录后,再下载目标文件。具体实现可以看downloadFiles函数,代码很简单,理解上去肯定没问题。

疗效如下

图片[4]-一下软件更新服务里面的客户度端更新,可以待会出门看一下-唐朝资源网

点击检测更新会将须要更新的文件列在前面

点击下载便会手动下载文件了。并且有个简单的进度条可以看见进度。

图片[5]-一下软件更新服务里面的客户度端更新,可以待会出门看一下-唐朝资源网

代码我就直接贴下来了。

python107行

# -*- coding: utf-8 -*-
# @Time    : 4/1/2019 19:36
# @Author  : MARX·CBR
# @File    : updateClient.py
import json
import hashlib
import sys
import pickle
from PyQt5 import QtWidgets
from urllib3 import request
from urllib import request
import os
from updateServer.UClient.sample import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.showUpdate)
        self.pushButton_2.clicked.connect(self.updateNow)
        self.updateList = []
        self.updateServer = UpdateFiles()
    def showUpdate(self):

        self.textBrowser.clear()
        self.updateList = self.updateServer.check_update()
        for j in self.updateList:
            print(j)
            self.textBrowser.append(j)
    def updateNow(self):
        all_file_number = 0
        for j in self.updateList:
            self.updateServer.downloadFiles(j)
            all_file_number += 1
            vau = int((all_file_number * 100) / len(self.updateList))
            self.progressBar.setValue(vau)
            self.repaint()
class UpdateFiles():
    def __init__(self):
        self.server = '47.101.195.58'
        self.port = '1213'
        self.directory = os.getcwd()
    def downloadFiles(self, key):
        checkurl = 'http://' + self.server + ':' + self.port
        file_dir = self.directory + '\' + key
        file_dir = file_dir.replace('/', '\')
        if os.path.exists(file_dir):
            os.remove(file_dir)

            request.urlretrieve(checkurl + '/' + key, file_dir)
        else:
            newpath = '\'.join(file_dir.split('\')[:-1:])
            print(newpath)
            try:
                os.mkdir(newpath)
                request.urlretrieve(checkurl + '/' + key, file_dir)
            except:
                request.urlretrieve(checkurl + '/' + key, file_dir)
    def Getfile_md5(self, filename):
        if not os.path.isfile(filename):
            return
        myHash = hashlib.md5()
        f = open(filename, 'rb')
        while True:
            b = f.read(8096)
            if not b:
                break
            myHash.update(b)
        f.close()
        return myHash.hexdigest()
    def check_update(self):
        data = {}
        updateList = []
        checkurl = 'http://' + self.server + ':' + self.port
        request.urlretrieve(checkurl + '/.listFile', ".listFile")

图片[6]-一下软件更新服务里面的客户度端更新,可以待会出门看一下-唐朝资源网

with open(".listFile", "rb") as f: data = pickle.load(f) print(data) for key in data: new_md5 = data[key] file_dir = self.directory + '\' + key if os.path.exists(file_dir): oldmd5 = self.Getfile_md5(file_dir) if oldmd5 != new_md5: print(new_md5, "准备下载") updateList.append(key) # print(new_md5) else: updateList.append(key) print('准备下载', file_dir) return updateList if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_())

好了,本次文章就到这儿了,这篇是综合上一篇服务端搭建写的。

准备将这个软件更新服务写几篇内容下来分享给你们的

这儿是第二篇,给你们介绍软件更新服务中,顾客端该如何处理。

第三篇准备给你们讲一下热更新,怎样实现无须重启便完成软件的更新。

之前那篇服务端搭建的代码存在一些bug,我早已更新了。之后连同本次代码,将整个服务端以及顾客端一起递交到GitHub中了。

欢迎你们到GitHub中fork使用,倘若能给个star就最好啦。

GitHub地址:github.com/97CBR/SoftwareUpdateServer

© 版权声明
THE END
喜欢就支持一下吧
点赞274赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容