用QT写一个网络通信类
时间: 2024-09-20 22:13:01 浏览: 35
在Qt中创建一个网络通信类(通常称为QNetworkAccessManager或QNetworkRequest的扩展)可以帮助你处理HTTP/HTTPS请求以及TCP/IP连接。以下是一个基础的网络通信类的例子,使用了Qt的QNetworkAccessManager和信号槽机制:
```cpp
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
class NetworkCommunicator : public QObject
{
Q_OBJECT
public:
explicit NetworkCommunicator(QObject *parent = nullptr)
: QObject(parent), manager(new QNetworkAccessManager(this)) {}
~NetworkCommunicator()
{
// 如果有正在进行的请求,取消它们
if (!pendingRequests.empty()) {
foreach (auto request, pendingRequests) {
request->deleteLater();
}
}
}
// 发送GET请求
QFuture<QByteArray> sendGetRequest(const QString &url) {
QNetworkRequest request(QUrl(url));
request.setRawHeader("User-Agent", "MyApp/1.0");
QFuture<QNetworkReply> reply = manager->get(request);
connect(reply, &QFuture::finished, [this, reply] {
QByteArray data;
if (reply.result().error() == QNetworkReply::NoError) {
data = reply.result().readAll();
} else {
qWarning() << "Failed to fetch data from" << url << ": " << reply.errorString();
}
pendingRequests.remove(reply);
emit dataReceived(data);
});
return reply.then([this](QByteArray data) {
emit requestFinished(url, data);
return data; // 返回未来的结果以便消费者使用
});
}
private:
QNetworkAccessManager *manager;
QVector<QFuture<QNetworkReply>> pendingRequests; // 保存正在等待的请求
};
```
在这个例子中:
- `NetworkCommunicator`是一个继承自`QObject`的类,用于封装网络访问操作。
- `sendGetRequest`方法接收一个URL,发送GET请求并返回一个包含响应数据的QFuture对象。
- 使用QNetworkAccessManager的`get`方法发起请求,同时连接到`QFuture::finished`信号,当请求完成时处理数据。
- 请求完成后,从`pendingRequests`队列中移除该请求,并发出`dataReceived`和`requestFinished`信号。
要使用这个类,你需要实例化它,并注册监听相应的信号,例如:
```cpp
NetworkCommunicator communicator;
connect(&communicator, &NetworkCommunicator::dataReceived, this, &YourClass::handleDataReceived);
connect(&communicator, &NetworkCommunicator::requestFinished, this, &YourClass::handleRequestFinished);
// 发送请求
communicator.sendGetRequest("http://example.com");
```
阅读全文