【QT】QT网络编程简介
一、QT网络编程简介
QT自身有着完善的网络管理体系,既支持底层协议,也支撑上层封装。
本文介绍三个常用类和实践代码
1. 重要的类
- 管理类
QNetworkAccessManager 网络接入管理类,使用该管理类可以方便管理网络请求等 - 请求类
QNetworkRequest 请求类,用于发送网络请求 - 相应类
QNetworkReply 相应类,用于处理相应信息
2. 网络体系
一个通用的网络体系大概步骤如下
- 通过管理类创建一个管理器
- 通过QUrl确认链接和其它请求信息
- 通过QNetworkRequest进行请求操作
- 通过管理类发送请求并关联接收
- 处理接收
3. 一个GET所需要的组件
- 通常一个GET请求需要QUrl进行构建请求链接
- 通过Request来封装请求
- 通过管理类发送请求
- 通过Reply处理相应
二、快速实践
案例一:创建一个GET请求
1. 在类内部定义网络编程所需的类
private:
QNetworkAccessManager* manager;
QNetworkReply* reply;
private slots:
void finishSlot(QNetworkReply*reply);
QNetworkAccessManager是管理类
QNetworkReply是相应类
finishSlot是接收相应的槽
2. new一个QNetworkAccessManager类
MainWindow::manager = new QNetworkAccessManager(this);
3. 将Manager的finish信号和接受槽相关联
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(finishSlot(QNetworkReply*)));
4. 编写接收槽函数
void MainWindow::finishSlot(QNetworkReply *reply)
{
ui->strLab->setText("This is a text");
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString all = codec->toUnicode(reply->readAll());
ui->strLab->setText(all);
}
5. 发送请求
manager->get(QNetworkRequest(QUrl("http://localhost:8080/")));
6. 注销资源
reply->deleteLater();
不同于new运算符的是,QT使用了智能销毁的函数deleteLater,这个函数会自动判断合适的时机将资源销毁。
QT有着较为优秀的内存回收机制,当对象数量有对象树结构化的支持时,相关对象会按照对象树的规则自动销毁,避免了内存溢出的情况。
不过QT在内存管理方面需要编者着重注意内存问题,例如越界检查和野指针。
#:一个tip
当你的QT内存管理出现问题时往往会和当前系统其它使用QT编写的应用程序发生冲突,尤其是Windows平台下的一系列第三方服务。
经验来讲,野指针和内存越界的问题是引起蓝屏的主要根源。有时也会引起搜狗输入法的程序冲突。
#:GET函数封装流程
- const char* 封装为QUrl
- QUrl封装为QNetworkRequest
- QNetworkRequest作为get参数发送
案例二:中文编码问题
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString all = codec->toUnicode(reply->readAll());
因为reply对象返回的是字节序,字节数组,是完全按照http返回的二进制数据
因此如果想要得到中文或者其他形式的编码,则需要进行二次编码
使用QTextCodec进行编码
编码结果得到的是QString