文章目录

- 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 等等