Qt之处理QNetworkAccessManager网络连接超时
来源:互联网 发布:cf提示客户端数据异常 编辑:程序博客网 时间:2024/05/04 06:32
简述
在网络操作中,经常会由于各种原因引起网络连接超时,究竟何为网络连接超时?
网络连接超时:在程序默认的等待时间内没有得到服务器的响应
- 简述
- 超时原因
- Qt 中的网络连接超时
- 如何处理超时
- 封装类
超时原因
引起网络连接超时的原因很多,下面,列举一些常见的原因:
- 网络断开,不过经常显示无法连接
- 网络阻塞,导致你不能在程序默认等待时间内得到回复数据包
- 网络不稳定,网络无法完整传送服务器信息
- 系统问题,系统资源过低,无法为程序提供足够的资源处理服务器信息
- 设备不稳定,如网线松动、接口没插好等等
- 网络注册时系统繁忙,无法回应
- 网速过慢,如 使用 BT 多线程下载,在线收看视频等大量占用带宽的软件 ,若使用共享带宽还要防范他人恶意占用带宽
- 计算机感染了恶意软件,计算机病毒,计算机木马等
Qt 中的网络连接超时
在 Qt 中,关于 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply 的文档中,找到了有关超时相关的错误 QNetworkReply::NetworkError。
常量 QNetworkReply::TimeoutError:
the connection to the remote server timed out
瞬间欣喜若狂,既然有超时错误,必然有设置超时的接口吧!遗憾,遗憾,遗憾。。。重要的事情说 3 遍,翻遍了官方文档,能和超时扯上关系的就这么一个简单的常量说明(当然还有 QNetworkReply::ProxyTimeoutError)。
这种情况下,我们只能自己去处理超时了。
如何处理超时
解决思路:
- 使用 QTimer 启动一个单次定时器,并设置超时时间。
- 在事件循环退出之后,判断定时器的状态,如果是激活状态,证明请求已经完成;否则,说明超时。
来看一个简单的例子 - 获取 Qt 官网 网页内容:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
首先,定义一个 QTimer,设置超时时间为 30000 毫秒(30 秒)并设置为单次触发。然后,使用 QNetworkRequest 实现一个简单的网络请求,通过 QNetworkAccessManager::get() 开始获取 Qt 官网的 HTML 页面内容。因为请求过程是异步的,所以通过使用 QEventLoop 启动一个事件循环让其同步处理,并将 QTimer 的 timeout() 信号以及 QNetworkReply 的 finished() 信号连接至其 quit() 槽函数,保证在定时器过期之后或者网络响应完成后事件循环得到退出,不至于一直处于阻塞状态。
如上所述,事件循环退出的两种情况:
- QTimer 30 秒到期,超时
- 网络连接响应完成
所以,当 QTimer::isActive() 激活的情况下,证明响应完成,还尚未超时。这时需要先调用 QTimer::stop() 来停止定时器,再对响做进一步处理。否则,进行超时处理 - QNetworkReply::abort() 立即中止操作并关闭网络连接。
封装类
既然以后会经常用到,那么还是提供一个封装类 QReplyTimeout 专门处理超时。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
由于 QNetworkReply 和 QReplyTimeout 是父子关系,所以 QReplyTimeout 将被自动销毁。
使用起来非常简单:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如果对 Google 的获取未在 1000 毫秒(1 秒)内完成,则会中止,并发出 timeout() 信号,供进一步处理(例如:提示用户请求超时)。
- Qt之处理QNetworkAccessManager网络连接超时
- Qt网络编程之QNetworkAccessManager
- Qt网络编程之QNetworkAccessManager
- Qt网络开发之QNetworkAccessManager使用要点
- Qt之QNetworkAccessManager
- 【程序员一枚】Qt网络开发之QNetworkAccessManager的使用
- 程序员一枚】Qt网络开发之QNetworkAccessManager的使用
- QT QNetworkAccessManager跳转URL处理
- QT QNetworkAccessManager跳转URL处理
- QT之 QNetworkAccessManager学习笔记
- 网络连接 以及超时处理
- Qt通过QNetworkAccessManager实现Http网络通信
- Qt通过QNetworkAccessManager实现Http网络通信
- Qt---QNetworkAccessManager
- Qt: 网络编程实例,QNetworkAccessManager获取网页数据
- Symbian—如何处理网络连接超时的问题?
- Java非阻塞NIO网络编程连接超时的处理
- QT QNetworkAccessManager demo
- 51Nod 1596 搬货物
- charles安装与抓Https包的设置
- 发布自己的Angular2库初探
- 练习系统 实验二 摘花生
- 清除浮动几种方法
- Qt之处理QNetworkAccessManager网络连接超时
- SQL学习(1)----MySql v5.7.17-winx64 下载及初始配置
- 前端(2)——CSS
- bzoj 2299: [HAOI2011]向量 (gcd+裴蜀定理)
- JVM常量池及字符串==比较分析
- 用错的状态模式?
- 快速排序
- np.random.choice
- 【移动开发】Essential Studio for WPF 2017 v1新版发布丨附下载