当前位置 博文首页 > Allen Roson:QT QNetworkAccessManager
QNetworkAccessManager类允许应用程序发送网络请求和接收应答
NetworkAccess API是围绕一个QNetworkAccessManager对象构造的,该对象保存它发送的请求的公共配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号,以及可用于监视网络操作进展的应答信号。对于整个Qt应用程序,一个QNetworkAccessManager应该足够了。
一旦创建了QNetworkAccessManager对象,应用程序就可以使用它通过网络发送请求。提供了一组接受请求和可选数据的标准函数,每个函数返回一个QNetworkReply对象。返回的对象用于获取响应相应请求时返回的任何数据。
一个简单的网络下载可以完成:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
?
QNetworkAccessManager有一个异步API。当上面的replyFinished槽被调用时,它所接受的参数是QNetworkReply对象,该对象包含下载的数据以及元数据(报头等)。
注意:在请求完成后,用户有责任在适当的时间删除QNetworkReply对象。不要在连接到finished()的槽中直接删除它。您可以使用deleteLater()函数。
注意:QNetworkAccessManager对它接收到的请求进行队列。并行执行的请求数量取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合将并行执行6个请求。
一个更复杂的例子,假设经理已经存在,可以是:
QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(slotSslErrors(QList<QSslError>)));
?
网络和漫游支持 ?
随着Qt 4.7中增加了承载管理API, QNetworkAccessManager获得了管理网络连接的能力。QNetworkAccessManager可以在设备离线时启动网络接口,如果当前进程是最后一个使用上行链路的进程,则终止该接口。请注意,有些平台利用从最后一个应用程序停止使用上行链路到系统实际终止连接链路的宽限期。漫游同样是透明的。任何排队/未决的网络请求都会自动转移到新的接入点。
希望利用此特性的客户不应该要求任何更改。实际上,现有的特定于平台的连接代码可以简单地从应用程序中删除。
注意:QNetworkAccessManager中的网络和漫游支持是基于支持连接管理的平台。QNetworkConfigurationManager::NetworkSessionRequired可用于检测QNetworkAccessManager是否利用此特性。
请参见QNetworkRequest、QNetworkReply和QNetworkProxy。