网络编程的本质就是在编写应用层代码。需要传输层支持。而传输层的协议有UDP、TCP等
使用QT网络编程的API,需要在.pro文件中添加network模块,而QT中的控件和其他内容都是包含在QtCore模块中的(默认添加)
QT为什么要划分模块?
Qt是一个庞大的框架,当功能集中放在一块时,如果书写一个简单的程序,没有进行模块划分,那么此时生成的可执行程序就会很大,而其中包含了很多没有使用的功能,性价比太低,不如做模块化处理,按需引入所需要的模块
UDP Socket
主要的类有:QUdpSocket、QNetworkDatagram。QUdpSocket表示一个UDP的socket文件,QNetworkDatagram表示一个UDP数据报
名称 | 类型 | 解释 | 对标原生API |
bind(const QHostAddress&,quint16) | 方法 | 绑定指定端口 | bind |
receiveDategram() | 方法 | 返回QNetWorkDatagram,读取一个UDP数据报 | recvfrom |
writeDatagram(const QNetworkDataGram&) | 方法 | 发送一个UDP数据报 | sendto |
readyRead | 信号 | 收到数据并准备就绪后触发 |
名称 | 类型 | 解释 | 对标原生API |
QNetworkDatagram(const QByteArray&,const QHostAddress&,quint16) | 构造函数 | 通过QByteArray,目标IP地址,目标端口号构造一个UDP数据报,通常用于发送数据时 | |
data() | 方法 | 获取数据报中内部持有的数据,返回QByteArray | |
senderAddress() | 方法 | 获取数据报中包含的对端IP地址 | recvfrom包含了该功能 |
senderPort() | 方法 | 获取数据报中包含的对端的端口号 | recvfrom包含了该功能 |
要在QT中编写网络代码需要在.pro文件中添加network
端口绑定要在信号槽后面,因为绑定意味着请求可以被收到
服务器逻辑:
客户端逻辑:
Tcp Socket:
- UDP无连接,不可靠传输,面向数据报
- TCP有链接,可靠传输,面向字节流
核心类:QTcpServer 和 QTcpSocket
名称 | 类型 | 说明 | 对标原生API |
listen(const QHostAddress&, quint16 port) | 方法 | 绑定指定的地址和端⼝号,并开始监听. | Bind和listen |
nextPendingConnection() | 方法 | 从系统中获取到⼀个已经建⽴好的tcp连接.返回⼀个 QTcpSocket ,表⽰这个客⼾端的连接.通过一个socket对象完成和客⼾端之间的通信. | accept |
newConnection | 信号 | 有新的客⼾端建⽴连接好之后触发 | 无 |
QTcpServer ⽤于监听端⼝,和获取客⼾端连接.
名称 | 类型 | 解释 | 对标原生API |
readAll() | 方法 | 读取当前接收缓冲区中的所有数据.返回QByteArray对象. | read |
write(const QByteArray&) | 方法 | 把数据写⼊socket中. | write |
deleteLater | 方法 | 暂时把socket对象标记为⽆效.Qt会在下个事件循环中析构释放该对象. | 无 |
deleteLater | 信号 | 有数据到达并准备就绪时触发. | 无 |
disconnected | 信号 | 连接断开时触发. | 无 |
QTcpSocket用户客户端与服务器的数据交互
tcp服务端回显界面代码:
tcp客户端回显代码:
HTTP
QNetworkRequest表示一个HTTP请求。
关键类:
- QNetworkAccessManager
- QNetworkRequest
- QNetworkReply。
get(const QNetworkRequest& ) | 发起一个HTTP GET请求,返回QNetworkReply对象 |
post(const QNetworkRequest&,const QByteArray& ) | 发起一个HTTP POST请求,返回QNetworkReply对象 |
QTextEdit天然支持对HTML的解析,会对HTML进行解析渲染,最终显示的效果不是原始的HTML
http客户端回显界面代码:
get本身不是阻塞函数,get只负责发送请求,不负责等待响应回来。但response中带有一个finnished信号,通过该信号对应的槽函数来处理响应
QT多媒体
在Qt中,音频主要通过QSound类实现,但是QSound类只支持wav格式的音频文件,如果想添加音频效果需要将非wav格式的音频文件转换为wav格式。
在编写代码时,需要往.pro文件中添加multimedia模块
play() | 播放音频 |
- 将声音文件添加到.qrc中
- 创建一个Sond对象
- 调用API函数play