//////////////grabthread.h////////////////////
#ifndef GRABTHREAD_H
#define GRABTHREAD_H
#include <QThread>
class QNetworkAccessManager;
#include <QNetworkReply>
class GrabThread : public QThread
{
Q_OBJECT
public:
explicit GrabThread(QObject *parent = 0);
void run();
void saveToFile(QString&);
bool runrun;
signals:
public slots:
void slot_httpFinished();
void slot_httpError(QNetworkReply::NetworkError);
private:
QNetworkAccessManager* qnam;
QNetworkReply* reply;
QString query_word;
bool is_init;
};
#endif // GRABTHREAD_H
//////////////grabthread.cpp////////////////////
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>
#include <QEventLoop>
GrabThread::GrabThread(QObject *parent) :
QThread(parent),
is_init(true)
{
}
void GrabThread::run()
{
if (is_init)
{
qnam = new QNetworkAccessManager();
is_init = false;
}
while(runrun)
{
startQuery("");
}
}
void GrabThread::startQuery(QString redirect_url)
{
QNetworkRequest request;
QString url;
// 如果是重定向请求, 则直接指向位置, 否则拼字符串
if (redirect_url.length() != 0)
{
url = redirect_url;
}else
{
url = "http://www.nuihq.com/" + query_word;
}
// 设定url
request.setUrl(QUrl(url));
// 设定请求头
request.setRawHeader("Host", "www.nuihq.com");
request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");
request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
request.setRawHeader("Accept-Language", "zh-cn,zh;q=0.5");
// TODO:使用gzip
request.setRawHeader("Accept-Encoding", "deflate");
request.setRawHeader("Accept-Charset", "utf-8;q=0.7,*;q=0.7");
request.setRawHeader("Connection", "keep-alive");
// 使用get方式发起请求
reply = qnam->get(request);
/***************如果需要同步********************/
qRegisterMetaType<QNetworkReply::NetworkError>
("QNetworkReply::NetworkError");
QEventLoop loop; // 使用事件循环使得网络通讯同步进行
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this,
SLOT(slot_httpError(QNetworkReply::NetworkError)));
loop.exec(); // 进入事件循环, 直到reply的finished()信号发出, 这个语句才能
//退出
slot_httpFinished();
/**************************************/
/****************如果需要异步**********************/
connect(reply, SIGNAL(finished()), this, SLOT(slot_httpFinished()));
qRegisterMetaType<QNetworkReply::NetworkError>("QNetworkReply::NetworkError");
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this,
SLOT(slot_httpError(QNetworkReply::NetworkError)));
/**************************************/
}
void GrabThread::slot_httpFinished()
{
int http_status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
reply->close();
reply->deleteLater();
// 判断是否是重定向
if (http_status == 302)
{
startQuery(reply->rawHeader("Location"));
}else
{
QString reply_content = QString::fromUtf8(reply->readAll());
if (reply->error() == QNetworkReply::NoError)
{
saveToFile(reply_content);
}else
{
qDebug() << "ERROR:" << query_word << " CODE:" << reply->error();
}
}
}
void GrabThread::slot_httpError(QNetworkReply::NetworkError)
{
}
void GrabThread::saveToFile(QString & html_content)
{
QFile file("html/" + query_word + ".html");
file.open(QIODevice::WriteOnly);
file.write(file_content.toUtf8());
file.close();
}
分享到:
相关推荐
### Qt教程及软件知识点概述 ...这些内容不仅覆盖了Qt的基础使用方法,还涉及到了一些高级主题,如2D绘图、数据库操作、网络编程等。通过学习这些教程,初学者可以迅速上手Qt开发,并逐步成长为熟练的Qt开发者。
0.本项目是本人毕业设计项目,原创,拒绝抄袭,可以学习参考! 项目使用遇到问题私聊我 1. 可以进行私聊和传输文件功能 2. 管理员可以进行权限管理 3. 数据库使用Mysql数据库,使用本项目,需要提前在服务器或者本地...
QT4.6实践编写串口调试助手(原创全源码), 包括使用qextserial,包括可在linux和windows两种环境下识别通讯方式,和硬件接口识别。非常适合初学者学习,建议下载QT_Create最新版本
本项目"原创 PC与单片机双向通讯智能温控程序"涉及了多个重要知识点,包括单片机编程、串行通信、智能控制以及温度监测。以下是对这些知识点的详细阐述: 1. **单片机编程**:单片机是一种微控制器,它集成了CPU、...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
可能使用的技术有GUI框架(如Qt、Android UI、iOS UIKit)和布局管理。 6. **消息推送与通知**:当收到新消息时,软件需要及时提醒用户。这可能涉及到服务器端的消息队列、推送服务(如GCM/FCM、APNS)以及客户端的...
1. **网络通信协议**:大灰狼远控可能使用TCP/IP协议进行数据传输,也可能采用HTTP/HTTPS等协议以隐藏通讯行为。理解这些协议的工作方式对于优化通信效率和安全性至关重要。 2. **加密技术**:为了保护数据安全,...