Qt学习笔记之网络编程

Qt网络模块提供了允许您编写TCP / IP客户端和服务器的类。它提供了代表低级网络概念的低级类(例如QTcpSocketQTcpServerQUdpSocket),以及高级类(例如QNetworkRequestQNetworkReplyQNetworkAccessManager)来使用通用协议执行网络操作。它还提供实现承载管理的类,例如QNetworkConfigurationQNetworkConfigurationManagerQNetworkSession

Qt的网络编程课程

“ Qt Network C ++类”页面包含Qt Network中C ++类的列表。

HTTP和FTP的高级网络操作

网络访问API是用于执行常见网络操作的类的集合。该API在所使用的特定操作和协议上提供了一个抽象层(例如,通过HTTP获取和发布数据),并且仅公开了用于通用或高级概念的类,函数和信号。

网络请求由QNetworkRequest类表示,该类也充当与请求关联的信息(例如,任何标头信息和所使用的加密)的常规容器。构造请求对象时指定的URL确定用于请求的协议。当前支持HTTP,FTP和本地文件URL进行上载和下载。

网络操作的协调由QNetworkAccessManager类执行。创建请求后,将使用此类来分派请求并发出信号以报告其进度。管理器还协调使用Cookie来存储客户端上的数据,身份验证请求以及代理的使用。

对网络请求的答复由QNetworkReply类表示。这些是由QNetworkAccessManager在调度请求时创建的。QNetworkReply提供的信号可用于单独监视每个答复,或者开发人员可以选择为此目的使用管理器的信号,并丢弃对答复的引用。由于QNetworkReplyQIODevice的子类,因此可以同步或异步地处理答复。即作为阻塞或非阻塞操作。

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

将TCP与QTcpSocket和QTcpServer一起使用

TCP(传输控制协议)是大多数Internet协议(包括HTTP和FTP)用于数据传输的低级网络协议。它是一种可靠的,面向流,面向连接的传输协议。它特别适合连续数据传输。

TCP流

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

必须先与远程主机和端口建立TCP连接,然后才能开始任何数据传输。建立连接后,即可通过QTcpSocket :: peerAddress()和QTcpSocket :: peerPort()获得对等方的IP地址和端口。对等方可以随时关闭连接,然后数据传输将立即停止。

QTcpSocket异步工作,并发出信号来报告状态更改和错误,就像QNetworkAccessManager一样。它依靠事件循环来检测输入数据并自动刷新输出数据。您可以使用QTcpSocket :: write()将数据写入套接字,并使用QTcpSocket :: read()读取数据。QTcpSocket表示两个独立的数据流:一个用于读取,一个用于写入。

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

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

尽管它的大多数功能都是异步工作的,但也可以同步使用QTcpSocket(即阻塞)。要获得阻止行为,请调用QTcpSocket的waitFor ...()函数;它们暂停调用线程,直到发出信号为止。例如,在调用非阻塞QTcpSocket :: connectToHost()函数之后,调用QTcpSocket :: waitForConnected()阻塞线程,直到发出connect ()信号为止。

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

财富客户财富服务器实例展示了如何使用与QTcpSocketQTcpServer既可写的TCP客户机-服务器应用程序。有关如何在单独的线程中使用同步QTcpSocket(不使用事件循环)的示例,另请参见阻止财富客户端。有关每个活动客户端一个线程的多线程TCP服务器的示例,请参阅线程财富服务器

将UDP与QUdpSocket一起使用

UDP(用户数据报协议)是一种轻量级,不可靠,面向数据报的无连接协议。当可靠性不重要时可以使用它。例如,报告时间的服务器可以选择UDP。如果丢失了一天中的数据报,则客户端可以简单地发出另一个请求。

udppackets.pnguploading.4e448015.gif转存失败重新上传取消udppackets.pnguploading.4e448015.gif转存失败重新上传取消udppackets.pnguploading.4e448015.gif转存失败重新上传取消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()读取数据报。

广播发送器广播接收器的示例显示如何写一个UDP发送者和使用Qt一个UDP接收机。

QUdpSocket还支持多播。“ 多播发送者”和“ 多播接收器”示例显示了如何使用写入UDP多播客户端。

使用QHostInfo解析主机名

在建立网络连接之前,QTcpSocketQUdpSocket执行名称查找,将您要连接的主机名转换为IP地址。通常使用DNS(域名服务)协议执行此操作。

QHostInfo提供了一个静态函数,使您可以自己执行这种查找。通过使用主机名,QObject指针和插槽签名调用QHostInfo :: lookupHost(),QHostInfo将执行名称查找并在结果准备好时调用给定的插槽。实际查找在单独的线程中完成,利用操作系统自己的方法执行名称查找。

QHostInfo还提供了一个称为QHostInfo :: fromName()的静态函数,该函数将主机名作为参数并返回结果。在这种情况下,名称查找是在与调用方相同的线程中执行的。此重载对于非GUI应用程序或在单独的非GUI线程中进行名称查找很有用。(在GUI线程中调用此功能可能会导致用户界面冻结,而该功能在执行查找时会阻塞。)

支持网络代理

可以通过代理执行与Qt的网络通信,代理可以直接或过滤本地和远程连接之间的网络流量。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值