16,815
社区成员




while(1){
QNetworkAccessManager *aa = new QNetworkAccessManager();
QNetworkReply *bb;
QNetworkRequest Request;
Request.setUrl(QUrl("http://127.0.0.1"));
bb= aa->get(Request);
bb->abort();
bb->close();
bb->deleteLater();
bb = NULL;
delete aa;
aa = NULL;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager = new QNetworkAccessManager;
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onfinished(QNetworkReply*)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onfinished(QNetworkReply *reply)
{
qDebug() << reply->readAll();
reply->abort();
reply->close();
reply->deleteLater();
}
void MainWindow::on_pushButtonLogin_clicked()
{
isNeedVcode();
}
int MainWindow::isNeedVcode()
{
QNetworkRequest request;
//QString strurl = QString("http://www.baidu.com");
QString strurl = QString("http://check.ptlogin2.qq.com/check?&uin=870603663");
request.setUrl(QUrl(strurl));
//
request.setRawHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)");
//
manager->get(request);
return 0;
}
#include "downloadmanager.h"
//==========清理
void DownloadManager::clear(){
m_DownloadReceived = 0;
m_DownloadTotal = 0;
n_DownloadError = 0;
m_DownloadType = 0;
m_DownloadFaildRetryNum = 2;
m_DownloadFaildNum = 0;
m_IsCoverFile = true;
m_IsSuccess = true;
m_IsFinished = false;
m_strUrl = "";
m_strPath = "";
m_strPostData = "";
m_strCookie = "";
m_strHtmlData = "";
m_pFile = NULL;
}
DownloadManager::DownloadManager(QObject *parent)
:QObject(parent)
{
clear();
m_pManager = new QNetworkAccessManager();
}
DownloadManager::~DownloadManager()
{
m_pManager->deleteLater();
}
//==========添加cookie
void DownloadManager::setCookie(QString strCookie){
m_strCookie = strCookie;
}
//==========下载http资源文件,异步
void DownloadManager::DownloadSrc_Asyn(QString strUrl,QString strSavePath,QString strReferer){
m_DownloadType = 1;
m_strUrl = strUrl;
m_strPath = strSavePath;
if(m_IsCoverFile == false){
if(QFile::exists(strSavePath)) {
n_DownloadError = -2;
m_IsSuccess = false;
return;
}
}
if(m_pFile == NULL){
m_pFile = new QFile(strSavePath);
if (!m_pFile->open(QIODevice::WriteOnly)) {
n_DownloadError = -3;
m_IsSuccess = false;
delete m_pFile;
return;
}
}
if(strReferer.length() == 0){
strReferer = strUrl;
}
m_strReferer = strReferer;
QNetworkRequest Request;
Request.setUrl(QUrl(strUrl));
Request.setRawHeader("Referer",strReferer.toStdString().c_str());
Request.setRawHeader("User-Agent","Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)");
if(m_strCookie != ""){
Request.setRawHeader("Cookie",m_strCookie.toStdString().c_str());
}
QNetworkReply *pReply = m_pManager->get(Request);
connect(pReply,SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError()));
connect(pReply,SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64)));
connect(pReply,SIGNAL(finished()),this,SLOT(replyFinished()));
}
//==========下载http资源文件
bool DownloadManager::DownloadSrc(QString strUrl,QString strSavePath,QString strReferer)
{
DownloadSrc_Asyn(strUrl,strSavePath,strReferer);
if(m_DownloadFaildNum == 0){
if(m_Event.isRunning() == false){
m_Event.exec();
}
}
return m_IsSuccess;
}
//==========http Get方式获取网页源码,异步
void DownloadManager::HttpGetData_Asyn(QString strUrl){
//qDebug("Start A HTTP Get Task:%s",strUrl.toStdString().c_str());
m_DownloadType = 2;
m_strUrl = strUrl;
QNetworkRequest Request;
Request.setUrl(QUrl(strUrl.toUtf8()));
Request.setRawHeader("Referer",strUrl.toStdString().c_str());
Request.setRawHeader("User-Agent","Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)");
Request.setRawHeader("Accept-Encoding","gzip");
if(m_strCookie != ""){
Request.setRawHeader("Cookie",m_strCookie.toStdString().c_str());
}
QNetworkReply *pReply = m_pManager->get(Request);
connect(pReply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError()));
connect(pReply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadProgress(qint64,qint64)));
connect(pReply,SIGNAL(finished()),this,SLOT(replyFinished()));
}
//==========http Get方式获取网页源码
bool DownloadManager::HttpGetData(QString strUrl){
HttpGetData_Asyn(strUrl);
if(m_DownloadFaildNum == 0){
if(m_Event.isRunning() == false){
m_Event.exec();
}
}
return m_IsSuccess;
}
//==========http Post方式获取网页源码,异步
void DownloadManager::HttpPostData_Asyn(QString strUrl,QString strData){
//qDebug("Start A HTTP Post Task");
m_DownloadType = 3;
m_strUrl = strUrl;
m_strPostData = strData;
QNetworkRequest Request;
Request.setUrl(QUrl(strUrl));
Request.setRawHeader("Referer",strUrl.toStdString().c_str());
Request.setRawHeader("User-Agent","Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)");
Request.setRawHeader("Accept-Encoding","gzip");
if(m_strCookie != ""){
Request.setRawHeader("Cookie",m_strCookie.toStdString().c_str());
}
QNetworkReply *pReply = m_pManager->post(Request,strData.toLocal8Bit());
connect(pReply,SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError()));
connect(pReply,SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64)));
connect(pReply,SIGNAL(finished()),this,SLOT(replyFinished()));
}
//==========http Post方式获取网页源码
bool DownloadManager::HttpPostData(QString strUrl,QString strData){
HttpPostData_Asyn(strUrl,strData);
if(m_DownloadFaildNum == 0){
if(m_Event.isRunning() == false){
m_Event.exec();
}
}
return m_IsSuccess;
}
//==========任务完成信号
void DownloadManager::replyFinished()
{
QNetworkReply* pReply = (QNetworkReply*)sender();
if(pReply->hasRawHeader("Location")){
QString strLocation = pReply->header(QNetworkRequest::LocationHeader).toString();
switch(m_DownloadType){
case 1:
DownloadSrc(strLocation,m_strPath,m_strReferer);
break;
case 2:
HttpGetData(strLocation);
break;
case 3:
HttpPostData(strLocation,m_strPostData);
break;
}
return;
}
if(n_DownloadError == 0){
switch(m_DownloadType){
case 1:{
if (m_pFile){
m_pFile->write(pReply->readAll());
m_pFile->close();
delete m_pFile;
m_pFile = NULL;
}else{
n_DownloadError = -4;
}
}
break;
case 2:
case 3:
{
QByteArray strHttpData;
//-----------GZIP解压
if(pReply->rawHeader("Content-Encoding").toUpper() == "GZIP"){
strHttpData = BaseLib::gzipDecompress(pReply->readAll());
}else{
strHttpData = pReply->readAll();
}
//-----------判断网页编码
QString m_strContentCodec = pReply->rawHeader("Content-Type");
if(BaseLib::subStr_Str(m_strContentCodec,"charset=","\0",m_strContentCodec) == false){
m_strContentCodec = BaseLib::GetHtmlCharset(&strHttpData);
}
//-----------转换为unicode qstring
QTextCodec *codec = QTextCodec::codecForName(m_strContentCodec.toStdString().c_str());
//-----------如果不存在这个编码,那就让他默认为utf8
if(codec == NULL){
codec = QTextCodec::codecForName("utf8");
}
m_strHtmlData = codec->toUnicode(strHttpData.data());
strHttpData.clear();
}
break;
}
//qDebug("任务完成:%s",m_strUrl.toStdString().c_str());
downloadFinished(true);
}else{
if(n_DownloadError == 203){
qDebug("Page 404,HttpGetFaild");
downloadFinished(false);
}else{
if(m_DownloadFaildNum < m_DownloadFaildRetryNum){
m_DownloadFaildNum++;
n_DownloadError = 0;
qDebug("%dth/%d failed,retry",m_DownloadFaildNum,m_DownloadFaildRetryNum);
switch(m_DownloadType){
case 1:
DownloadSrc(m_strUrl,m_strPath);
break;
case 2:
HttpGetData(m_strUrl);
break;
case 3:
HttpPostData(m_strUrl,m_strPostData);
break;
}
}else{
qDebug("Already try %d times,still fails,quit\r\nquit url:%s",m_DownloadFaildRetryNum,m_strUrl.toStdString().c_str());
downloadFinished(false);
}
}
}
pReply->deleteLater();
}
//==========下载完成
bool DownloadManager::downloadFinished(bool bResult)
{
m_IsFinished = true;
m_IsSuccess = bResult;
m_Event.exit(0);
emit DownloadManagerFinished(m_IsSuccess);
return bResult;
}
//==========发生错误信号
void DownloadManager::slotError(){
QNetworkReply* pReply = (QNetworkReply*)sender();
n_DownloadError = pReply->error();
emit DownloadManagerError(n_DownloadError);
pReply->deleteLater();
qDebug("DownloadManager slotError:%d\r\n",n_DownloadError);
}
//==========详细进度
void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal){
m_DownloadReceived = bytesReceived;
m_DownloadTotal = bytesTotal;
emit DownloadManagerProgress(m_DownloadReceived,m_DownloadTotal);
}
//==========获取get 或 post 得到的html
QString DownloadManager::GetHtmlData()
{
return m_strHtmlData;
}
//==========设置html
void DownloadManager::setHtmlData(QString strHtml)
{
m_strHtmlData = strHtml;
}
//==========获取cookie
QString DownloadManager::GetCookie()
{
return m_strCookie;
}
//==========设置重试次数
void DownloadManager::setFaildRetryNum(int n)
{
m_DownloadFaildRetryNum = n;
}
//==========下载是否完成
bool DownloadManager::DownloadIsFinished()
{
return m_IsFinished;
}
#ifndef DOWNLOADMANAGER_H
#define DOWNLOADMANAGER_H
#include <QApplication>
#include "baselib.h"
#include <QtNetwork/QHttpRequestHeader>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
class DownloadManager : public QObject
{
Q_OBJECT
public:
DownloadManager(QObject *parent=0);
~DownloadManager();
void clear();
void setCookie(QString);
bool downloadFinished(bool bResult);
void setHtmlData(QString strHtml);
void setFaildRetryNum(int n);
QString GetHtmlData();
QString GetCookie();
public:
bool HttpGetData(QString);
bool HttpPostData(QString,QString);
bool DownloadSrc(QString strUrl,QString strSavePath,QString strReferer = "");
bool DownloadIsFinished();
void HttpGetData_Asyn(QString);
void HttpPostData_Asyn(QString,QString);
void DownloadSrc_Asyn(QString strUrl,QString strSavePath,QString strReferer = "");
signals:
void DownloadManagerProgress(int, int);
void DownloadManagerFinished(bool);
void DownloadManagerError(int);
private slots:
void replyFinished();
void slotError();
void downloadProgress(qint64, qint64);
public:
bool m_IsSuccess;
bool m_IsCoverFile;
bool m_IsFinished;
int m_DownloadType;
int m_DownloadFaildRetryNum;
int m_DownloadFaildNum;
int m_DownloadReceived;
int m_DownloadTotal;
int n_DownloadError;
QString m_strUrl;
QString m_strPath;
QString m_strReferer;
QString m_strCookie;
QString m_strPostData;
QString m_strHtmlData;
QString m_strContentCodec;
private:
QNetworkAccessManager *m_pManager;
QEventLoop m_Event;
QFile *m_pFile;
};
#endif // DOWNLOADMANAGER_H
class abc : public QThread{
protected:
void run(){
QNetworkAccessManager *aa = new QNetworkAccessManager();
QNetworkReply *bb;
QNetworkRequest Request;
Request.setUrl(QUrl("http://127.0.0.1/1.php"));
bb= aa->get(Request);
bb->abort();
bb->close();
delete aa;
aa = NULL;
}
};
void main(){
QApplication a(argc, argv);
for(int i=0;i<1000;i++){
abc *bbb = new abc;
bbb->start();
bbb->wait();
delete bbb;
bbb = NULL;
}
return a.exec();
}