秋招日记(三十一)小米投递&QT文档阅读翻译
学习记录
- QTNetwork文档阅读
- QT NB!
- 明天写一点样例代码
投递记录
小米 正式批 深圳 软件开发c++方向
Network Programming with QT
-
QT 帮助文档翻译和阅读笔记
-
QTNetwork介绍
- Qt Network模块提供了用以编写TCP/IP客户端和服务器的类
- 其提供的类可以分为三大块
- 较低抽象级别的类:代表基础的网络连接概念
- QTcpSocket
- QTcpServer
- QUdpSocket
- 较高抽象级别的类:用来支持常见网络协议的实现
- QNetworkRequest
- QNetworkReply
- QNetworkAccessManager
- 用于管理网络连接的类:
- QNetworkConfiguration
- QNetworkConfigurationManager
- QNetworkSession
- 较低抽象级别的类:代表基础的网络连接概念
-
QTNetwork包含的所有类
-
-
与HTTP和FTP相关的高级网络操作
- QT中的网络访问API是常见网络操作的类的集合,该API为使用的特定操作和协议提供了一个抽象层,并在这个抽象层上只提供高级概念的类,函数和信号,隐藏了其内部细节。
- 网络请求由QNetworkRequest类表示,它还充当与请求相关的信息的一般容器,如任何头部信息和使用的加密。构造请求对象时指定的URL决定了请求使用的协议。目前支持HTTP、FTP和本地文件url的上传和下载
- 对网络请求的应答由QNetworkReply类表示;当请求被处理时,QNetworkAccessManager创建应答。QNetworkReply提供的信号可以用来单独监控每个回复,也可以选择使用管理者的信号来及监控回复。由于QNetworkReply是QIODevice的一个子类,因此回复可以被同步或异步处理,也即回复操作可以时阻塞的也可以是非阻塞的。
- 网络操作的协调由QNetworkAccessManager类执行。一旦创建了一个请求,这个类就被用来分派它并发出信号来报告它的进度。管理器还协调使用cookie在客户端存储数据、身份验证请求和代理的使用
- 每个应用程序或库可以创建一个或多个QNetworkAccessManager实例来处理网络通信
-
基于QTcpSocket和QTcpServer使用TCP
- TCP是一种可靠的、面向连接和面向流的传输协议
- QTcpSocket类中提供了TCP的接口,使用QTcpSocket类可以实现一些标准的应用层协议,例如:POP3、SMTP和NNTP,也能用来实现一些用户自己实现的协议
- TCP连接基于host和port,可以通过QTcpSocket::peerAddress() 和QTcpSocket::peerPort() 来获得连接方的host和port
- QTcpSocket是异步的,其通过信号来报告其状态变化和错误。
- QTcpSocket的工作基于事件循环(event loop),它依赖于事件循环来检测传入数据并自动刷新传出数据。
- QTcpSocket代表了两个独立的数据流,一个用于读,一个用于写。可以通过QTcpSocket::write() 和 **QTcpSocket::read()**读写数据
- QTcpSocket继承了QIODevice,所以可以像处理一个流对象的方式,处理QTcpSocket对象
- 使用QTcpSerevr类来管理到来的TCP连接,使用QTcpServer::listen()监听连接,当有连接到来时,QTcpServer对象将会发送一个QTcpServer::newConnection()信号,相对这个型号的槽函数中可以使用QTcpServer::nextPendingConnection()函数来接受这个连接,并创建一个QTcpSocket对象来与发起连接的客户端通信。
- QTcpSocket通常以异步的方式工作,但是其也可以以同步的方式工作。
-
基于QUdpSocket使用UDP
- UDP是一个轻量、不可靠,面向数据包,无连接的传输协议,在可以接受数据不可靠的情况下使用。
- QUdpSocket类可以实现UDP数据包的发送和接受,其接口与QTcpSocket一致
- UDP与TCP的区别在于UDP通过一个含有目的地址和端口的有限大小的包来发送数据,而TCP是基于一个连续的数据流进行数据传输。
- **QUdpSocket::bind()为接收传入的数据报准备套接字,很像TCP服务器的QTcpServer::listen()每当有一个或多个数据报到达时,QUdpSocket就会发出readyRead()信号。调用QUdpSocket::readDatagram()**来读取数据报。
查看16道真题和解析