Qt 网络编程

文章目录

  • QtNetwork模块提供了用于编写TCP/IP网络应用程序的各种类,如用于TCP通信的QTcpSocket 和QTcpServer,用于UDP通信的QUdpSocket,还有用于网络承载管理的类,以及基于SSL协议的用于网络安全通信的类

主机信息查询

  • QHostInfo类可以根据主机名获取主机的IP地址,或者通过IP地址获取主机名
    • 静态函数localHostName()可获取本机的主机名
    • 静态函数fromName()可以通过主机名获取IP地址
    • 静态函数lookupHost()可通过一个主机名以异步方式查找这个主机的IP地址
  • QNetworkInterface类可以获得运行主机的所有IP地址和网络接口列表
    • 静态函数allInterface()返回主机上所有的网络接口列表,一个网络接口可能包含多个IP地址,每个IP地址与掩码或广播地址关联
    • 静态函数allAddresses()可以获取主机上所有的IP地址列表,无须知道子网掩码和广播地址

TCP通信

  • 传输控制协议(transmission control protocol, TCP)是一种被大多数Internet网络协议用于数据传输的底层网络协议,它是可靠的、面向流和连接的传输协议,适用于连续数据的传输。TCP通信必须先建立TCP连接,通信端分为客户端和服务器端
  • 使用Qt提供的类进行基于TCP的套接字通信需要用到两个类:
    • QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接
    • QTcpSocket:通信的套接字类,客户端、服务器端都需要使用
    • 这两个套接字通信类都属于网络模块 network
  • 重点函数
cpp 复制代码
//继承自QAbstractSocket
//连接服务器
virtual void connectToHost(const QHostAddress &address, 
                quint16 port, 
                QIODevice::OpenMode openMode= ReadWrite);
//断开连接
virtual void disconnectFromHost()
//继承自QIODevice
//判断是否有数据可读
virtual qint64 bytesAvailable() const
//读取接收到的数据
QByteArray read(qint64 maxSize)
QByteArray readAll()
//发送数据
qint64 write(const QByteArray &byteArray)
  • 重点信号
cpp 复制代码
//继承自QAbstractSocket
//connectToHost连接服务器成功后发射此信号
void connected()
//断开连接后发射此信号
void disconnected()
//有错误发生时 发射此信号
void error(QAbstractSocket::SocketError socketError)
//继承自QIODevice
//当缓冲区中有数据需要读时发射此信号
void readyRead()

UDP通信

  • 用户数据报协议 ( User Datagram Protocol ,UDP)是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务 ,与TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。 适用于需要快速传输少量数据的场景,因为它不会建立连接,所以传输效率比较高 , 通常用于实时应用程序,比如视频会议在线游戏、语音聊天等,因为这些应用程序通常要求实时性比较高,而且数据包丢失对应用程序的影响也不是很大
  • Qt环境下UDP编程,如果通信的双方都绑定特定的端口号,就不再严格区分客户端与服务器端了
  • TCP中需要用到两个类:QTcpSever和QTcpSocket,而UDP中只需要使用一个类QUdpSocket。 UDP通信时需要用到本地端口,目标端口,目标IP地址,其中:
    • 本地端口:自己为该UDP主机设置的端口号,目的是对方发送数据时,会发到本机此端口上
  • QUdpSocket类用于实现UDP通信,它与QTcpSocket具有相同的父类QAbstractSocket,因而这两个类共享大部分的接口函数
  • 重点函数
cpp 复制代码
//继承自QAbstractSocket
//绑定端口号
bool bind(quint16 port, QAbstractSocket::BindMode mode);
//关闭套接字
void QAbstractSocket::close();
//QUdpSocket自身定义
//数据报发送,形参分别为数据报,目的IP地址,目的端口号
qint64 writeDatagram(const char *data, qint64 size, 
                    const QHostAddress &address, 
                    quint16 port);
qint64 writeDatagram(const QNetworkDatagram &datagram);
qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port);
//socket中有接收到用户发来的数据报时,返回值为true
bool hasPendingDatagrams() const
//返回待读取数据报的大小
qint64 pendingDatagramSize() const
//读取数据报,返回读取数据报的字节数,maxSize为设置的读取字节数
qint64 readDatagram(char *data, qint64 maxSize, 
                    QHostAddress *address = nullptr, 
                    quint16 *port = nullptr)
  • 重点信号
cpp 复制代码
//继承自QIODevice
//当缓冲区中有数据需要读时发射此信号
void readyRead()

基于TCP的HTTP通信

  • Qt网络模块提供了一些类来实现OSI七层网络模型中高层的网络协议,例如HTTP、FTP、SNMP等,这些类主要是QNetworkRequest、QNetworkAccessManager和QNetworkReply
  • QNetworkRequest, 通过URL发起网络协议请求,也保存网络请求的信息,目前支持HTTP、FTP和本地文件URL的上传和下载
cpp 复制代码
//设置url
void setUrl(const QUrl &url)
//设置头部
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)
  • QNetworkReply,表示网络请求的响应,由 QNetworkAccessManager 在发送网络请求后创建网络响应
  • QNetworkReply提供的信号finished()、readyRead()、downloadProgress()可用于监测网络响应的执行情况,进而进行相应的操作
cpp 复制代码
//下载进度信号
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
//有错误发生发出信号
void error(QNetworkReply::NetworkError code)
//结束
void finished()
//有数据来时会发出信号
void readyRead()
  • QNetworkAccessManager,负责发送网络请求,以及创建网络响应
cpp 复制代码
//将数据内容上载到目标请求
QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QIODevice *data)
//发送请求,获取响应
QNetworkReply *get(const QNetworkRequest &request)
// post 等等
相关推荐
IAUTOMOBILE2 小时前
Qt 入门级开发实践:浅析基于 QTtest 项目的 C++ GUI 编程基础
开发语言·c++·qt
m0_738120722 小时前
渗透测试——Ripper靶机详细横向渗透过程(rips扫描文件,水平横向越权,Webmin直接获取root权限)
linux·网络·数据库·安全·web安全·php
我在人间贩卖青春2 小时前
Qt 事件处理
qt·事件处理
我在人间贩卖青春2 小时前
Qt 多线程编程
qt·多线程编程
不知名。。。。。。。。2 小时前
网络层———IP
服务器·网络·tcp/ip
RTC老炮2 小时前
webrtc弱网-BBRv2算法原理
网络·算法·webrtc
RTC老炮2 小时前
webrtc弱网-BBRv1算法原理
网络·算法·webrtc
ivy159868377156 小时前
芯锦科技 HP9116 QC3+多协议USB快充接口芯片
网络·单片机·嵌入式硬件·5g·p2p
左手厨刀右手茼蒿14 小时前
Flutter 组件 http_requests 适配鸿蒙 HarmonyOS 实战:极简网络请求,构建边缘端轻量级 RESTful 通讯架构
网络·flutter·http