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 等等
相关推荐
用户8055336980317 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner18 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
网络研究院12 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智12 天前
ARP代理--工作原理
运维·网络·arp·arp代理