目录
一、前言
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的、面向报文的、基于网络的传输层协议。
二、服务端
①在项目配置文件中加入network模板
cpp
QT += core gui network
②创立一个继承自QObject的UdpServer的类
UdpServer构造函数用于创建对象时初始化对象
readDatagram函数用于读取客户端发来的信息,并进行相应的操作
cpp
#include <QUdpSocket>
#include <QDebug>
#include <QBuffer>
#include <QDataStream>
class UdpServer : public QObject
{
Q_OBJECT
public:
//构造函数
UdpServer(QObject *parent = nullptr);
private slots:
//读取客户端发来的信息函数
void readDatagram();
private:
//udp通信的变量
QUdpSocket *udpSocket;
};
③构造函数的实现
bind函数 绑定到所有可用的网络接口上的12345端口,其中的QHostAddress::Any 参数是所有可用的网络接口,你也可以给具体的IP地址
connect函数是用于连接信号与槽,确保接收到UDP数据报时能够自动调用readDatagram函数
cpp
UdpServer::UdpServer(QObject *parent = nullptr)
: QObject(parent)
, udpSocket(new QUdpSocket(this))
{
udpSocket->bind(QHostAddress::Any, 12345); //绑定到所有可用的网络接口上的12345端口
connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readDatagram); //连接信号与槽,确保接收到UDP数据报时能够自动调用readDatagram函数
}
④读取信息函数的实现
使用while循环读取数据报,通过调用hasPendingDatagrams()的方法实现
当有数据报时,声明了一个QByteArray 类型的变量 datagram,用于存储从 UDP 套接字接收到的数据。
调用**pendingDatagramSize()**方法获取当前待处理数据报的大小
声明了QHostAddress 类型的变量sender 和quint16 类型的变量senderPort,它们将用于存储发送数据报的计算机的 IP 地址和端口号
调用readDatagram() 方法从udpSocket读取数据报,如果读取失败(例如,套接字关闭或发生错误),它将返回-1
truncate() 方法调整datagram的大小以匹配实际读取的字节数
cpp
void UdpServer::readDatagram()
{
while (udpSocket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(int(udpSocket->pendingDatagramSize()));
QHostAddress sender;
quint16 senderPort;
int bytesRead = udpSocket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
if (bytesRead == -1) {
qDebug() << "Failed to read datagram";
continue;
}
datagram.truncate(bytesRead);
// 假设我们发送的是简单的字符串命令,如"pressKeyA"
QString command(datagram);
qDebug() << "Received command:" << command << "from" << sender.toString() << ":" << senderPort;
}
}
三、客户端
①绑定服务端的IP地址和端口号
这里服务端的IP地址使用的是本机地址,端口号是前面服务端设置的端口号
cpp
QString serverIp = "192.168.1.100"; // 服务端IP地址
quint16 serverPort = 12345; // 服务端端口号
②发送数据报给服务端
message为发送的数据,本文只是举例子,因此只发送了一次,你可以通过循环结构发送或者通过Qt按钮点击发送
cpp
QByteArray message = "Hello, Server!";
sendUdpMessage(serverIp, serverPort, message);