码迷,mamicode.com
首页 > 数据库 > 详细

Qt之处理QNetworkAccessManager网络连接超时

时间:2016-11-17 20:47:35      阅读:766      评论:0      收藏:0      [点我收藏+]

标签:ddc   服务器   网络   页面   退出   视频   pst   思路   erro   

简述

在网络操作中,经常会由于各种原因引起网络连接超时,究竟何为网络连接超时?

网络连接超时:在程序默认的等待时间内没有得到服务器的响应

超时原因

引起网络连接超时的原因很多,下面,列举一些常见的原因:

  • 网络断开,不过经常显示无法连接
  • 网络阻塞,导致你不能在程序默认等待时间内得到回复数据包
  • 网络不稳定,网络无法完整传送服务器信息
  • 系统问题,系统资源过低,无法为程序提供足够的资源处理服务器信息
  • 设备不稳定,如网线松动、接口没插好等等
  • 网络注册时系统繁忙,无法回应
  • 网速过慢,如 使用 BT 多线程下载,在线收看视频等大量占用带宽的软件 ,若使用共享带宽还要防范他人恶意占用带宽
  • 计算机感染了恶意软件,计算机病毒,计算机木马等

Qt 中的网络连接超时

在 Qt 中,关于 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply,并没有提供关于设置超时的方法。这种情况下,我们只能自己去处理了。

解决思路:

  • 使用 QTimer 启动一个单次定时器,并设置超时时间。
  • 在事件循环退出之后,判断定时器的状态,如果是激活状态,证明请求已经完成;否则,说明超时。

来先看一个简单的例子,获取 Qt 官网 网页内容:

QTimer timer;
timer.setInterval(30000);  // 设置超时时间 30 秒
timer.setSingleShot(true);

// 请求 Qt 官网
QNetworkAccessManager manager;
QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

QNetworkReply *pReply = manager.get(request);

QEventLoop loop;
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
timer.start();
loop.exec();  // 启动事件循环

if (timer.isActive()) {  // 处理响应
    timer.stop();
    if (pReply->error() != QNetworkReply::NoError) {
        // 错误处理
        qDebug() << "Error String : " << pReply->errorString();
    } else {
        QVariant variant = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
        int nStatusCode = variant.toInt();
        // 根据状态码做进一步数据处理
        //QByteArray bytes = pReply->readAll();
        qDebug() << "Status Code : " << nStatusCode;
    }
} else {  // 处理超时
    disconnect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
    pReply->abort();
    pReply->deleteLater();
    qDebug() << "Timeout";
}

首先,定义一个 QTimer,然后设置超时时间为 30000 毫秒(30 秒)。然后,使用 QNetworkRequest 实现一个简单的网络请求,通过 QNetworkAccessManager::get() 开始获取 Qt 官网的 HTML 页面内容。因为请求过程是异步的,所以通过使用 QEventLoop 启动一个事件循环,并将 QTimer 的 timeout() 信号以及 QNetworkReply 的 finished() 信号连接至其 quit() 槽函数,保证在定时器过期之后或者网络响应完成后事件循环得到退出,不至于一直处于阻塞状态。

正如上面所述,事件循环退出的时候有两种情况:

  1. QTimer 30 秒到期,超时
  2. 网络连接响应完成

所以,当 QTimer::isActive() 激活的情况下,证明响应完成,还尚未超时。这时需要先调用 QTimer::stop() 来停止定时器,再对响做进一步处理。否则,进行超时处理 - QNetworkReply::abort() 立即中止操作并关闭网络连接。

Qt之处理QNetworkAccessManager网络连接超时

标签:ddc   服务器   网络   页面   退出   视频   pst   思路   erro   

原文地址:http://blog.csdn.net/u011012932/article/details/53204396

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!