目录
前言:
网络协议是每个平台都必须遵守的,只是不同的平台所提供的网络API不相同,而Qt具有跨平台性,因此Qt对网络编程也封装了一套自己的API。值得注意的是,在使用Qt进行网络编程之前, 需要在项目中的.pro文件中添加network模块。
1、Qt的UDP Socket
Qt使用UDP通信,需要用到两个类,分别是:1、QUdpSocket,2、QNetworkDatagram。其中在网络通信中关于socket的相关工作都被集成在QUdpSocket类中,而数据传输用到的数据报则用QNetworkDatagram类表示(数据报包括数据内容,对方的端口号、ip地址)。
QUdpSocket提供的接口介绍如下:
bind(const QHostAddress&, quint16)
|
绑定端口号、ip地址 |
receiveDatagram()
|
返回
QNetworkDatagram,即
对方发送过来的数据报
|
writeDatagram(const QNetworkDatagram&)
|
向对方发送一个QNetworkDatagram |
readyRead(是一个信号)
|
在收到数据并准备就绪后触发
|
QNetworkDatagram提供的接口介绍如下:
QNetworkDatagram(const QByteArray&, const QHostAddress& , quint16 )
|
通过
QByteArray,
目标IP地址,目标端⼝号构造⼀个 UDP数据报,通常用于发送数据时
|
data()
|
返回QByteArray,表示数据报内部持有的文本
|
senderAddress()
|
获取数据报中对方的IP地址
|
senderPort()
|
获取数据报中对方的端⼝号
|
QByteArray是⼀个字节数组,可以和QString进行相互转换。例如: 使⽤QString的构造函数即可把QByteArray转成QString,使用QString的toUtf8函数即可把QString转成QByteArray。
1.1 用Udp实现服务器
服务器的界面设计比较简单,因为服务器只需要显示消息即可,服务器回馈给客户端的信息也是程序自动触发的,所以只需要一个QListWidget控件即可,界面设计如下:
1、首先在widget.h文件中创建一个QUdpSocket对象,代码如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void request();//槽函数
private:
Ui::Widget *ui;
QUdpSocket* ser;
};
#endif // WIDGET_H
2、在widget.cpp文件中new出一个QUdpSocket对象给到udp指针,并完成信号readyRead与槽函数的连接,而所有的发送、接收逻辑都在该槽函数中实现。于此同时还要完成绑定,目的是让服务器能够接收到客户端的消息。代码如下: