Roson的Qt之旅#78 Qt网络编程入门介绍(1)

158 篇文章 30 订阅

Qt Network

Qt Network为使用TCP/IP的编程应用程序提供了一组api。像requests、cookie和通过HTTP发送数据这样的操作是由各种c++类处理的。

要使用Qt Network类,请将此指令添加到c++文件中:

#include <QtNetwork>

要链接到Qt Network模块,请将这一行添加到项目文件中:

QT += network

Qt Network模块提供了允许您编写TCP/IP客户端和服务器的类。它提供了低级类,如QTcpSocket, QTcpServer和QUdpSocket,它们代表低级网络概念,以及高级类,如QNetworkRequest, QNetworkReply和QNetworkAccessManager,以使用通用协议执行网络操作。它还提供了类,如QNetworkConfiguration, QNetworkConfigurationManager和QNetworkSession实现承载管理。

Qt网络编程中的C++类

要学好Qt的网络编程,必须学习相关的C++类,下面是类的列表:

QAbstractNetworkCache缓存实现的接口
QNetworkCacheMetaData缓存信息
QHstsPolicy指定主机支持HTTP HSTS (Strict Transport Security)策略。
QHttpMultiPart类似于通过HTTP发送的MIME多部分消息
QHttpPart保存要在HTTP多部分MIME消息中使用的主体部分
QNetworkAccessManager允许应用程序发送网络请求和接收响应
QNetworkCookie保存一个网络cookie
QNetworkCookieJar实现了一个简单的罐子QNetworkCookie对象
QNetworkDiskCache非常基本的磁盘缓存
QNetworkReply包含用QNetworkAccessManager发送的请求的数据和头
QNetworkRequest保存要用QNetworkAccessManager发送的请求
QNetworkConfigurationManager管理系统提供的网络配置
QNetworkConfiguration一个或多个接入点配置的抽象
QNetworkSession控制系统的接入点,并在多个客户端访问同一接入点的情况下支持会话管理
QAuthenticator认证对象
QDnsDomainNameRecord存储域名记录信息
QDnsHostAddressRecord存储主机地址记录的信息
QDnsLookup表示DNS查找
QDnsMailExchangeRecord存储关于DNS MX记录的信息
QDnsServiceRecord存储DNS SRV记录信息
QDnsTextRecord存储DNS TXT记录信息
QHostAddressIP地址
QHostInfo用于主机名查找的静态函数
QNetworkDatagramUDP数据报的数据和元数据
QNetworkAddressEntry存储一个网络接口支持的一个IP地址,以及与其相关联的网掩码和广播地址
QNetworkInterface主机的IP地址和网络接口的列表
QNetworkProxy网络层代理
QNetworkProxyFactory细粒度的代理选择
QNetworkProxyQuery查询套接字的代理设置
QAbstractSocket所有套接字类型通用的基本功能
QLocalServer本地套接字服务器
QLocalSocket本地套接字
QSctpServerSCTP-based服务器
QSctpSocketSCTP套接字
QTcpServer基于tcp的服务器
QTcpSocketTCP套接字
QUdpSocketUDP套接字
QSslCertificate方便的API为X509证书
QSslCertificateExtension用于访问X509证书扩展的API
QSslCipher表示SSL加密密码
QSslConfiguration保存SSL连接的配置和状态
QSslDiffieHellmanParameters服务器的Diffie-Hellman参数接口
QSslEllipticCurve表示椭圆曲线,供椭圆曲线密码算法使用
QSslErrorSSL错误
QSslKey用于私钥和公钥的接口
QSslPreSharedKeyAuthenticator预共享密钥(PSK)密码套件的身份验证数据
QSslSocket客户端和服务器的SSL加密套接字

命名空间
QSsl:在Qt网络中声明所有SSL类通用的枚举

HTTP和FTP的高级网络操作

网络访问API是一组用于执行常见网络操作的类。API在使用的特定操作和协议上提供了一个抽象层(例如,通过HTTP获取和发布数据),并且只公开一般或高级概念的类、函数和信号。
网络请求由QNetworkRequest类表示,它还充当与请求相关的信息的通用容器,比如任何头部信息和使用的加密。在构造请求对象时指定的URL决定了请求使用的协议。目前支持HTTP、FTP和本地文件url上传和下载。

网络操作的协调是由QNetworkAccessManager类执行的。一旦创建了请求,这个类将用于分派请求并发出信号来报告请求的进度。管理器还协调cookie的使用,以便在客户机上存储数据、身份验证请求和代理的使用。

对网络请求的响应由QNetworkReply类表示;它们是在请求被分派时由QNetworkAccessManager创建的。QNetworkReply提供的信号可以用来单独监视每个回复,或者开发人员可以选择使用管理器的信号来代替这个目的,丢弃对回复的引用。因为QNetworkReply是QIODevice的子类,所以响应可以是同步的或者异步的;即作为阻塞或非阻塞操作。

每个应用程序或库都可以创建一个或多个QNetworkAccessManager实例来处理网络通信。

使用TCP与QTcpSocket和QTcpServer

TCP (Transmission Control Protocol,传输控制协议)是一种底层的网络协议,大多数Internet协议都使用它来传输数据,包括HTTP和FTP。它是一个可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输。

 QTcpSocket类为TCP提供了一个接口。您可以使用QTcpSocket来实现标准的网络协议,如POP3、SMTP和NNTP,以及自定义协议。

在任何数据传输开始之前,TCP连接必须建立到远程主机和端口。建立连接后,通过QTcpSocket::peerAddress()和QTcpSocket::peerPort()可以得到对等体的IP地址和端口。在任何时候,对等端都可以关闭连接,数据传输将立即停止。

QTcpSocket异步工作,并发出信号来报告状态更改和错误,就像QNetworkAccessManager一样。它依赖于事件循环来检测传入的数据并自动清除传出的数据。可以使用QTcpSocket::write()向socket写入数据,也可以使用QTcpSocket::read()读取数据。QTcpSocket表示两个独立的数据流:一个用于读取,一个用于写入。

由于QTcpSocket继承了QIODevice,你可以将它与QTextStream和QDataStream一起使用。当从QTcpSocket读取数据时,你必须事先通过调用QTcpSocket::bytesAvailable()来确保有足够的数据可用。

如果您需要处理传入的TCP连接(例如,在服务器应用程序中),请使用QTcpServer类。调用QTcpServer::listen()来建立服务器,并连接到QTcpServer::newConnection()信号,该信号为每一个连接的客户端发出一次。在您的插槽中,调用QTcpServer::nextPendingConnection()来接受连接,并使用返回的QTcpSocket与客户端通信。

尽管它的大多数函数都是异步工作的,但也可以同步使用QTcpSocket(即阻塞)。要获得阻塞行为,调用QTcpSocket的waitFor…()函数;它们挂起调用线程,直到发出信号。例如,在调用非阻塞的QTcpSocket::connectToHost()函数后,调用QTcpSocket::waitForConnected()来阻塞线程,直到发出connected()信号。

同步套接字通常会导致代码具有更简单的控制流。waitFor…()方法的主要缺点是,当waitFor…()函数阻塞时,事件不会被处理。如果在GUI线程中使用,这可能会冻结应用程序的用户界面。因此,我们建议您只在非gui线程中使用同步套接字。同步使用时,QTcpSocket不需要事件循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值