Qt编写的软件在线升级系统(客户端)
2017-08-14 20:13
525 查看
这个是客户端的实现,查看服务器端实现请看这里
程序入口(main.cpp):
[cpp] view
plain copy
#include <QtGui>
#include <QApplication>
#include <QProcess>
#include <QTextCodec>
#include "Update.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
Update *update=new Update();
return a.exec();
}
客户端用Qt设计师画了一个界面,有一个进度条和四个标签:
Update类继承自Qt设计师生成的类,所以界面可以在这个类中控制。该类的定义如下:
[cpp] view
plain copy
#ifndef UPDATE_H
#define UPDATE_H
#include <QtGui/QDialog>
#include <QtGui/QMessageBox>
#include <QFile>
#include <QTcpSocket>
#include <QDataStream>
#include <QProcess>
#include <QDatetime>
#include "ui_ProgressBar.h"
class Update : public QDialog,public Ui::ProgressBarClass
{
Q_OBJECT
public:
Update(QWidget *parent = 0);
~Update();
private:
QTcpSocket *clientSocket;
quint64 nextBlockSize;
QString version,version_s;
int bytesWritten;
private slots:
void disconnect();
void communicate();
};
#endif // UPDATE_H
类的实现:
[cpp] view
plain copy
#include "Update.h"
Update::Update(QWidget *parent)
: QDialog(parent)
{
setupUi(this);
nextBlockSize=0;
bytesWritten=0;
progressBar->setMaximum(0);
QFile vfile("version.dat");
if (vfile.open(QIODevice::ReadOnly))
{
QTextStream stream(&vfile);
version = stream.readLine();
vfile.close();
}
//获取服务器地址
QString ipAdd;//服务器地址
QFile netfile("net.dat");
if (netfile.open(QIODevice::ReadOnly))
{
QTextStream stream(&netfile);
ipAdd = stream.readLine();
netfile.close();
}
//连接到服务器
clientSocket=new QTcpSocket(0);
clientSocket->connectToHost(ipAdd,3327);
QObject::connect(clientSocket,SIGNAL(readyRead()),this,SLOT(communicate()));
QObject::connect(clientSocket,SIGNAL(disconnected()),this,SLOT(disconnect()));
}
Update::~Update()
{
}
void Update::communicate()
{
QDataStream in(clientSocket);
in.setVersion(QDataStream::Qt_4_5);
while(1)
{
int bytes=(int)(clientSocket->bytesAvailable());
//已经接收
bytesWritten+=bytes;
if(progressBar->maximum())
{
//设置进度条当前进度
progressBar->setValue(bytes);
comeLabel->setText(QString::number(bytes));
}
if (nextBlockSize == 0)
{
if (quint64(bytes) < sizeof(quint64))
{
break;
}
//总的数据大小
in >> nextBlockSize;
//设置进度条最大值
progressBar->setMaximum((int)nextBlockSize);
totleLabel->setText(QString::number((int)nextBlockSize));
this->show();
}
if (quint64(bytes)<nextBlockSize)
{
break;;
}
//通信协议
quint16 protocol;
in>>protocol;
switch(protocol)
{
case 0x0001:
{
in>>version_s;
//最新版本,不用升级
if(version==version_s)
{
QMessageBox::information(this,tr("提示"),tr("当前版本已经是最新的了!"));
QProcess::startDetached("MRP.exe");
qApp->quit();
}
else
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_5);
out<<quint64(0)<<quint16(0x0001);
out.device()->seek(0);
out<<quint64(block.size()-sizeof(quint64));
clientSocket->write(block);
}
break;
}
case 0x0002:
{
QByteArray block1;
QByteArray block2;
in>>block1>>block2;
//打开要更新的文件并写入数据
QFile file1("MRP.exe");
if (file1.open(QIODevice::WriteOnly)&&block1.length()!=0)
{
file1.write(block1);
file1.close();
}
QFile file2("common.dll");
if (file2.open(QIODevice::WriteOnly)&&block2.length()!=0)
{
file2.write(block2);
file2.close();
}
//修改版本文件
QFile wvfile("version.dat");
if (wvfile.open(QIODevice::WriteOnly))
{
wvfile.write(version_s.toUtf8());
wvfile.write("/r/n");
//写入更新日期
wvfile.write(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss").toUtf8());
wvfile.close();
}
QMessageBox::information(this,tr("升级成功"),"您的软件版本已经从"+version+"升级到"+version_s+",将重启启动软件!");
//启动主程序
QProcess::startDetached("MRP.exe");
qApp->quit();
break;
}
}
nextBlockSize=0;
}
}
void Update::disconnect()
{
clientSocket->deleteLater();
QMessageBox::information(this,tr("错误"),tr("网络连接中断!"));
qApp->quit();
}
from:http://blog.csdn.net/FairyStepWGL/article/details/53582839
程序入口(main.cpp):
[cpp] view
plain copy
#include <QtGui>
#include <QApplication>
#include <QProcess>
#include <QTextCodec>
#include "Update.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
Update *update=new Update();
return a.exec();
}
客户端用Qt设计师画了一个界面,有一个进度条和四个标签:
Update类继承自Qt设计师生成的类,所以界面可以在这个类中控制。该类的定义如下:
[cpp] view
plain copy
#ifndef UPDATE_H
#define UPDATE_H
#include <QtGui/QDialog>
#include <QtGui/QMessageBox>
#include <QFile>
#include <QTcpSocket>
#include <QDataStream>
#include <QProcess>
#include <QDatetime>
#include "ui_ProgressBar.h"
class Update : public QDialog,public Ui::ProgressBarClass
{
Q_OBJECT
public:
Update(QWidget *parent = 0);
~Update();
private:
QTcpSocket *clientSocket;
quint64 nextBlockSize;
QString version,version_s;
int bytesWritten;
private slots:
void disconnect();
void communicate();
};
#endif // UPDATE_H
类的实现:
[cpp] view
plain copy
#include "Update.h"
Update::Update(QWidget *parent)
: QDialog(parent)
{
setupUi(this);
nextBlockSize=0;
bytesWritten=0;
progressBar->setMaximum(0);
QFile vfile("version.dat");
if (vfile.open(QIODevice::ReadOnly))
{
QTextStream stream(&vfile);
version = stream.readLine();
vfile.close();
}
//获取服务器地址
QString ipAdd;//服务器地址
QFile netfile("net.dat");
if (netfile.open(QIODevice::ReadOnly))
{
QTextStream stream(&netfile);
ipAdd = stream.readLine();
netfile.close();
}
//连接到服务器
clientSocket=new QTcpSocket(0);
clientSocket->connectToHost(ipAdd,3327);
QObject::connect(clientSocket,SIGNAL(readyRead()),this,SLOT(communicate()));
QObject::connect(clientSocket,SIGNAL(disconnected()),this,SLOT(disconnect()));
}
Update::~Update()
{
}
void Update::communicate()
{
QDataStream in(clientSocket);
in.setVersion(QDataStream::Qt_4_5);
while(1)
{
int bytes=(int)(clientSocket->bytesAvailable());
//已经接收
bytesWritten+=bytes;
if(progressBar->maximum())
{
//设置进度条当前进度
progressBar->setValue(bytes);
comeLabel->setText(QString::number(bytes));
}
if (nextBlockSize == 0)
{
if (quint64(bytes) < sizeof(quint64))
{
break;
}
//总的数据大小
in >> nextBlockSize;
//设置进度条最大值
progressBar->setMaximum((int)nextBlockSize);
totleLabel->setText(QString::number((int)nextBlockSize));
this->show();
}
if (quint64(bytes)<nextBlockSize)
{
break;;
}
//通信协议
quint16 protocol;
in>>protocol;
switch(protocol)
{
case 0x0001:
{
in>>version_s;
//最新版本,不用升级
if(version==version_s)
{
QMessageBox::information(this,tr("提示"),tr("当前版本已经是最新的了!"));
QProcess::startDetached("MRP.exe");
qApp->quit();
}
else
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_5);
out<<quint64(0)<<quint16(0x0001);
out.device()->seek(0);
out<<quint64(block.size()-sizeof(quint64));
clientSocket->write(block);
}
break;
}
case 0x0002:
{
QByteArray block1;
QByteArray block2;
in>>block1>>block2;
//打开要更新的文件并写入数据
QFile file1("MRP.exe");
if (file1.open(QIODevice::WriteOnly)&&block1.length()!=0)
{
file1.write(block1);
file1.close();
}
QFile file2("common.dll");
if (file2.open(QIODevice::WriteOnly)&&block2.length()!=0)
{
file2.write(block2);
file2.close();
}
//修改版本文件
QFile wvfile("version.dat");
if (wvfile.open(QIODevice::WriteOnly))
{
wvfile.write(version_s.toUtf8());
wvfile.write("/r/n");
//写入更新日期
wvfile.write(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss").toUtf8());
wvfile.close();
}
QMessageBox::information(this,tr("升级成功"),"您的软件版本已经从"+version+"升级到"+version_s+",将重启启动软件!");
//启动主程序
QProcess::startDetached("MRP.exe");
qApp->quit();
break;
}
}
nextBlockSize=0;
}
}
void Update::disconnect()
{
clientSocket->deleteLater();
QMessageBox::information(this,tr("错误"),tr("网络连接中断!"));
qApp->quit();
}
from:http://blog.csdn.net/FairyStepWGL/article/details/53582839
相关文章推荐
- Qt编写的软件在线升级系统(客户端)
- Qt编写的软件在线升级系统(客户端)
- Qt编写的软件在线升级系统(客户端)
- Qt编写的软件在线升级系统(客户端)
- Qt编写的软件在线升级系统(服务器端)
- Qt编写的软件在线升级系统(服务器端)
- Qt编写的软件在线升级系统(服务器端)
- Qt编写的软件在线升级系统(服务器端)
- 使用C#的WebService实现客户端软件的在线升级功能(转)
- CPC客户端离线升级失败,不能获取updatesipo信息,可能你的软件在线更新程序没有安装
- 基于数据兼容的软件升级方法、客户端、服务器及系统
- 使用C#的WebService实现客户端软件在线升级
- 使用C#的WebService实现客户端软件的在线升级功能[转]
- 使用C#的WebService实现客户端软件的在线升级功能
- 使用C#的WebService实现客户端软件的在线升级功能
- android studio最简单的更新方式(像普通软件一样直接在线升级,谁说as不能在线升级的???)
- 电信的星空极速客户端软件强制安装策略升级了
- 系统漏洞扫描及XP升级认证补丁软件
- 编写软件架构文档说明,第 2 部分: 开发系统上下文
- [转]用C# 实现C/S模式下软件自动在线升级