Qt 8. UDP客户端通信

news/2024/5/18 13:17:10 标签: qt, udp, 开发语言
1. 代码
//UdpClient.h
#ifndef UDPCLIENT_H
#define UDPCLIENT_H

#include <QtNetwork>

class Ex2;      // 声明类
class UdpClient : public QObject
{
    Q_OBJECT
public:
    explicit UdpClient(Ex2 *ui = nullptr);
    ~UdpClient();
    void Send(QByteArray buf,QHostAddress addr, int port);
    void Send(char *buf,int length,QHostAddress addr, int port);
    void Send(char *buf,int length);
    void Send(QByteArray buf);
    void Receive();
    bool Close();
    bool Open(QString ip,int port);
    void SaveIpPort(QHostAddress ip,int port);
private:
    Ex2 *pUi;
    QUdpSocket *socket;
    QHostAddress addr;
    int port;
signals:

};

#endif // UDPCLIENT_H
//UdpClient.cpp
#include "UdpClient.h"
#include "ex2.h"
#include "ui_ex2.h"

UdpClient::UdpClient(Ex2 *ui)
{
    socket = new QUdpSocket();
    pUi = ui;
    connect(socket,&QUdpSocket::readyRead,this,&UdpClient::Receive);
}

UdpClient::~UdpClient()
{
    delete socket;
}

bool UdpClient::Open(QString ip,int port)
{
    socket->close();/*取消绑定端口号使用:udpsocket->close()方法*/
    QHostAddress ipAddr = QHostAddress(ip);
    SaveIpPort(ipAddr,port);
    socket->bind(ipAddr,port);
    return true;
}

bool UdpClient::Close()
{
    socket->close();
    return true;
}

void UdpClient::SaveIpPort(QHostAddress ipAddr,int ipPort)
{
    addr = ipAddr;
    port = ipPort;
}

void UdpClient::Send(char *buf,int length,QHostAddress addr, int port)
{
    QByteArray arr(buf,length);
    socket->writeDatagram(arr,addr,port);
    socket->flush();
}

void UdpClient::Send(char *buf,int length)
{
    QByteArray arr(buf,length);
    socket->writeDatagram(arr,addr,port);
    socket->flush();
}

void UdpClient::Send(QByteArray buf,QHostAddress addr, int port)
{
    socket->writeDatagram(buf,addr,port);
    socket->flush();
}

void UdpClient::Send(QByteArray buf)
{
    socket->writeDatagram(buf,addr,port);
    socket->flush();
}

//12 34 A1 A2 -> "12 34 A1 A2"
QString ByteArrayToHexString(QByteArray data)
{
    QString ret(data.toHex().toUpper());
    int len = ret.length()/2;
    for(int i=1;i<len;i++)
    {
        ret.insert(2*i+i-1," ");
    }

    return ret;
}

void UdpClient::Receive()
{

    QHostAddress addr; //用于获取发送者的 IP 和端口
    quint16 port;
    //数据缓冲区
    QByteArray buffer;
    while(socket->hasPendingDatagrams())
    {
        //调整缓冲区的大小和收到的数据大小一致
        buffer.resize(socket->bytesAvailable());

        //接收数据
        socket->readDatagram(buffer.data(),buffer.size(),&addr,&port);
        //显示
        QString str0 = ByteArrayToHexString(buffer) +" ";
        if(!buffer.isEmpty())
        {
            QString str = pUi->ui->textEditMy1->toPlainText();
            str += str0;
            //刷新显示
            pUi->ui->textEditMy1->setText(str);
        }
    }
}
//Ex2.cpp
#include "ex2.h"
#include "ui_ex2.h"

int static cnt = 0;

Ex2::Ex2(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Ex2)
{
ui->setupUi(this);

....
    //UDP
    udpClientSocket = new UdpClient(this);
    ui->lineEditUdpIp->setText("192.168.9.123");
    ui->lineEditUdpPort->setText("6000");
}

void Ex2::on_pushButtonUdpConnect_clicked()
{
    if(ui->pushButtonUdpConnect->text()==tr("创建"))
    {
        if(udpClientSocket->Open(ui->lineEditUdpIp->text(),ui->lineEditUdpPort->text().toInt()) == true)
        {
            ui->pushButtonUdpConnect->setText("取消");
        }
    }
    else
    {
        udpClientSocket->Close();
        ui->pushButtonUdpConnect->setText("创建");
    }
}

void Ex2::on_pushButtonUdpSend_clicked()
{
    //获取文本框内容并以ASCII码形式发送
    uchar buf[13];
    int i=0;
    buf[i++] = 0xAA;
    buf[i++] = 0x55;
    buf[i++] = 0xAA;
    udpClientSocket->Send((char *)buf,i);
}
//Ex2.h
#ifndef EX2_H
#define EX2_H

#include <QDialog>

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include ".\UDP\UdpClient.h"


QT_BEGIN_NAMESPACE
namespace Ui { class Ex2; }
QT_END_NAMESPACE

class Ex2 : public QDialog
{
    Q_OBJECT

public:
    Ex2(QWidget *parent = nullptr);
    ~Ex2();
    Ui::Ex2 *ui;
    UdpClient *udpClientSocket;

private slots:
    void on_pushButtonUdpConnect_clicked();

    void on_pushButtonUdpSend_clicked();

private:
    //Ui::Ex2 *ui;
    QSerialPort *serial;
};
#endif // EX2_H
2. 效果

以上代码可以实现UDP收发功能。
在这里插入图片描述


http://www.niftyadmin.cn/n/4943153.html

相关文章

讯飞星火认知大模型全新升级,全新版本、多模交互—测评结果超预期

写在前面 版本新功能 1 体验介绍 登录注册 申请体验 2 具体使用 2.1 多模态能力 2.1.1 多模理解 2.1.2 视觉问答 2.1.3 多模生成 2.2 代码能力 2.2.1 代码生成 2.2.2 代码解释 2.2.3 代码纠错 2.2.4 单元测试 2.3 插件功能 2.3.1 PPT生成 2.3.2 简历生成 2.3.4 文档问答 3 其他…

如何写好一篇计算机毕业论文

主题选择&#xff1a;选择一个有足够研究价值和创新性的主题。确保选择的主题与计算机科学领域相关&#xff0c;并对你感兴趣和有一定了解。 文献综述&#xff1a;进行充分的文献调研&#xff0c;了解相关领域的前沿研究和最新进展。在文献综述中&#xff0c;总结和比较已有工…

OpenWrt -- OpenVPN配置ServerClient(TUN模式)

一、前言 目标是两台设备能通过OpenVPN TUN模式建立连接。 准备如下&#xff1a; 设备 友善R2S两台&#xff0c;一台做服务器&#xff0c;一台做客户端。 一台小米R1C&#xff0c;当作网关。 固件 采用openwrt-22.03版本&#xff0c;下载地址:https://downloads.openwrt.org/r…

【初级后台网优—工单处理】舒适圈待久了,你是否还拥有“破圈”的能力?

对于通信网优这个行业是主要分为前台测试和后台优化的&#xff0c;经过小编的普及和大家实际在工作中遇到的应该是很好理解的。这个时候就有同学举手问了&#xff0c;后台优化一般大家说的都是中高级&#xff0c;那么请问有没有初级后台优化&#xff1f;主要是做什么的呢&#…

synchronized锁小计

在Java中&#xff0c;synchronized是一个关键字&#xff0c;用于控制多个线程对共享资源的访问。它是一个修饰符&#xff0c;可以用于方法和块级别synchronized 关键字主要有以下几种用法&#xff1a; 非静态方法的同步&#xff1b;静态方法的同步&#xff1b;代码块。 1 syn…

用于弥散加权MRI的关节各向异性维纳滤光片研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【TypeScript】接口和对象类型

在 TypeScript 中&#xff0c;接口&#xff08;Interface&#xff09;是一种用于定义对象结构的约定&#xff0c;它描述了对象应该具有的属性和方法。接口提供了一种定义约束&#xff0c;使你能够在编写代码时明确地指定对象的形状和类型。接口在开发中常用于定义对象的结构、类…

正向代理与方向代码【总结】

1、前言 最近工作中用到反向代理&#xff0c;发现网络代理的玩法还真不少&#xff0c;网络背后有很多需要去学习。而在此之前仅仅使用了过代理软件&#xff0c;曾经为了访问google&#xff0c;使用了代理软件&#xff0c;需要在浏览器中配置代理的地址。我只知道有代理这个概念…