一、Qt网络编程概述
Qt Network模块提供了允许我们编写TCP/IP客户端和服务器的类。它提供了低级类来完成基础的数据传输,如QTcpSocket、QTcpServer和QUdpSocket,Qt也提供了高级类,主要其实就是一个通用应用层协议的工具类,如QNetworkRequest、QNetworkReply和QNetworkAccessManager,这些类是使用公共协议执行网络操作。
它还提供了QNetworkConfiguration、QNetworkConfigurationManager和QNetworkSession等实现承载管理的类。
在使用网络编程的这个模块时候在,pro文件中加入 下面的话以便于引入模块。
QT += network
我们要自己实现自己的应用层协议的话就需要在 低级的基础类上制定规则来匹配我们自己的场景。
二、Qt对Http,FTP应用层协议支持
Qt对Http,FTP应用层协议支持主要是通过 QNetworkRequest、QNetworkAccessManager、QNetworkReply 类来完成数据通信的功能。
网络请求由QNetworkRequest类表示,它还充当与请求相关的信息的一般容器,如任何首部信息和使用的加密。构造请求对象时指定的URL决定了请求使用的协议。目前支持HTTP、FTP和本地文件url的上传和下载。
网络操作的协调由QNetworkAccessManager类执行。一旦创建了一个请求,这个类就用来分派它并发出信号来报告它的进度。管理器还协调使用cookie在客户端存储数据、身份验证请求和代理的使用。
对网络请求的响应由QNetworkReply类表示。这些是由QNetworkAccessManager在请求被分派时创建的。QNetworkReply提供的信号可用于单独监控每个回复,或者开发人员可以选择使用管理器的信号来实现此目的,并丢弃对回复的引用。由于QNetworkReply是QIODevice的子类,回复可以同步或异步处理;即,阻塞或非阻塞操作。
每个应用程序都可以创建一个或多个QNetworkAccessManager实例来处理网络通信。
总结来说其实就是
- QNetworkRequest:构造一个请求URL
- QNetworkAccessManager:复制管理这个 QNetworkRequest
- QNetworkReply:就是处理 服务器 返回 请求 URL 的结果
三、TCP通信编程支持
TCP (Transmission Control Protocol,传输控制协议)是一种底层的网络协议,大多数互联网协议都使用它来传输数据,包括HTTP和FTP。它是一种可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输。
QTcpSocket类提供了一个TCP接口。我们可以使用QTcpSocket实现标准的网络协议,如POP3、SMTP和NNTP,以及自定义协议。 毕竟 Socket只管传数据,而不会说明数据的意义
在开始任何数据传输之前,必须建立到远程主机和端口的TCP连接。连接建立后,通过QTcpSocket::peerAddress()和QTcpSocket::peerPort() 可以获得对端IP地址和端口。在任何时候,对端都可以关闭连接,数据传输将立即停止。
QTcpSocket是异步工作的,并发出信号来报告状态变化和错误,就像QNetworkAccessManager一样。它依赖于事件循环来检测传入的数据并自动清除传出的数据。可以使用QTcpSocket::write()向套接字写入数据,使用QTcpSocket::read()读取数据。QTcpSocket表示两个独立的数据流:一个用于读取,另一个用于写入。全双工的
由于QTcpSocket继承了QIODevice,你可以将它与QTextStream和QDataStream一起使用。从QTcpSocket读取数据时,必须事先调用QTcpSocket::bytesAvailable(),以确保有足够的数据可用。
如果需要处理传入的TCP连接(例如,在服务器应用程序中),请使用QTcpServer类。调用QTcpServer::listen()来建立服务器,并连接到QTcpServer::newConnection()信号,该信号对每个连接的客户端都会发出一次。在socket中,调用 QTcpServer::nextPendingConnection() 来接受连接,并使用返回的QTcpSocket与客户端通信。
虽然 QTcpSocket 的大多数函数都是异步工作的,但也可以同步地使用QTcpSocket(即阻塞)。要获得阻塞行为,可以调用QTcpSocket 的 waitFor…()函数;这些函数会挂起调用线程,直到发出信号。例如,在调用非阻塞的QTcpSocket::connectToHost()函数之后,调用QTcpSocket::waitForConnected()来阻塞线程,直到connected()信号发出。
同步套接字通常会导致代码的控制流程更简单。waitFor…()方法的主要缺点是,当waitFor…()函数阻塞时,事件不会被处理。如果在GUI线程中使用,这可能会冻结应用程序的用户界面。出于这个原因,我们建议我们只在非gui线程中使用同步套接字。当同步使用时,QTcpSocket不需要事件循环。
四、UDP通信编程支持
QUdpSocket类允许发送和接收UDP数据报。它继承了QAbstractSocket,因此共享了QTcpSocket的大部分接口。主要的区别在于,QUdpSocket以数据报的形式传输数据,而不是以连续的数据流的形式。简而言之,数据报是一个有限大小的数据包(通常小于512字节),除了要传输的数据之外,还包括数据报发送方和接收方的IP地址和端口。
QUdpSocket支持IPv4广播。广播常用于实现网络发现协议,例如发现网络上哪台主机拥有最多的空闲硬盘空间。一台主机向所有其他主机接收的网络广播一个数据报。每个接收到请求的主机然后将其当前空闲磁盘空间的回复发送给发送者。发送者等待直到收到所有主机的回复,然后可以选择有最多空闲空间的服务器来存储数据。要广播数据报,只需将它发送到特殊地址QHostAddress:: broadcast(255.255.255.255),或发送到你本地网络的广播地址。
QUdpSocket::bind()为接收传入的数据报准备套接字,很像TCP服务器的QTcpServer::listen()。只要有一个或多个数据报到达,QUdpSocket就会发出readyRead()信号。调用QUdpSocket::readDatagram()来读取数据报。
五、主机信息的获取
在建立网络连接之前,QTcpSocket和QUdpSocket执行名称查找,将连接到的主机名转换为IP地址。一般通过DNS (Domain Name Service)协议 获取的。 Qt 获取主机IP等信息通过 QHostInfo 获取的。
QHostInfo 类提供了一个静态函数,可以让您自己执行这种查找。通过使用主机名、QObject指针和 Socket 签名调用QHostInfo::lookupHost(), QHostInfo将执行名称查找,并在结果准备好时调用给定的 Socket 。实际的查找是在一个单独的线程中完成的,使用操作系统自己的方法来执行名称查找。
QHostInfo还提供了一个名为QHostInfo::fromName()的静态函数,它接受主机名作为参数并返回结果。在这种情况下,名称查找与调用者在同一个线程中执行。这种重载对于非gui应用程序或在单独的非gui线程中进行名称查找非常有用。(在GUI线程中调用此函数可能会导致用户界面冻结,而函数在执行查找时阻塞。)
六、网络代理
使用Qt进行网络通信可以通过代理(proxy)进行,代理在本地和远程连接之间引导或过滤网络流量。 就行这种,代理其实就是相当于再加一层网络过滤的功能。
单个代理由QNetworkProxy类表示,这个类用于描述和配置到代理的连接。支持在不同层次的网络通信上运行的代理类型,soksok5 支持在低层次上进行网络流量代理,HTTP和FTP代理在协议层次上工作。查看QNetworkProxy::ProxyType了解更多信息。
代理可以基于每个套接字启用,也可以用于应用程序中的所有网络通信。新打开的套接字可以在连接之前调用它的QAbstractSocket::setProxy()函数,让它使用代理。通过使用QNetworkProxy::setApplicationProxy()函数,可以为所有后续的套接字连接启用全应用范围的代理。
代理工厂用于创建代理使用的策略。QNetworkProxyFactory提供了基于特定代理类型查询的代理。查询本身编码在QNetworkProxyQuery对象中,该对象允许根据关键标准选择代理,例如代理的目的(TCP、UDP、TCP服务器、URL请求)、本地端口、远程主机和端口,以及使用的协议(HTTP、FTP等)。
七、底层管理的支持
这个我就不太清楚了
承载管理控制设备的连接状态,以便应用程序可以启动或停止网络接口,并在接入点之间透明漫游。
QNetworkConfigurationManager类管理设备已知的网络配置列表。网络配置描述了用于启动网络接口的一组参数,由QNetworkConfiguration类表示。
根据给定的网络配置打开QNetworkSession来启动网络接口。在大多数情况下,基于平台指定的默认网络配置创建网络会话是合适的。默认的网络配置由QNetworkConfigurationManager::defaultConfiguration()函数返回。
在某些平台上,应用程序在执行任何网络操作之前打开网络会话是一个平台要求。这可以通过QNetworkConfigurationManager::NetworkSessionRequired标志在QNetworkConfigurationManager::capabilities()函数返回的值中进行测试。