【Qt笔记】Qt建立UDP通信

目录

一、前言

二、服务端

①在项目配置文件中加入network模板

②创立一个继承自QObject的UdpServer的类

③构造函数的实现

④读取信息函数的实现

三、客户端

①绑定服务端的IP地址和端口号

②发送数据报给服务端

四、实现效果


一、前言

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);

四、实现效果

相关推荐
inferno7 分钟前
SVN学习笔记(一)
笔记·学习·svn
高山有多高9 分钟前
【Linux笔记】线程同步与互斥
linux·笔记
艾莉丝努力练剑16 分钟前
【QT】系统相关:多线程QThread基础
开发语言·网络·c++·qt·学习·大模型
奕鼎竜瑆30 分钟前
GPT-6 Luna Batch API 调用实践笔记
笔记·gpt·batch
妄汐霜39 分钟前
SSE,RocketMQ,MQTT不同之处
笔记·学习·rocketmq
東隅已逝,桑榆非晚1 小时前
c++模板进阶
开发语言·c++·笔记·学习
杨逢昌工厂6S管理1 小时前
107-杨逢昌钣金车间换型管控:从物料切换杂乱到有序换型的四步技术方案
经验分享·笔记·职场和发展·学习方法
FakeOccupational12 小时前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
Horn Still Sounds15 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
xcyxiner15 小时前
DicomViewer24 修复编译bug(window test 失败)
前端·qt