Qt 8. UDP客户端通信

news2025/4/21 11:38:35
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.coloradmin.cn/o/864682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云服务器远程连接的方法大全

腾讯云服务器怎么连接登录&#xff1f;腾讯云服务器支持多种远程连接方法&#xff0c;可以使用腾讯云管理控制台自带的远程连接工具&#xff0c;也可以使用第三方远程连接工具&#xff0c;如如PuTTY、Xshell等&#xff0c;Linux操作系统可以SSH登录&#xff0c;Windows可以使用…

半导体学习入门书籍推荐之《Verilog数字系统设计教程》

Verilog HDL&#xff08;简称 Verilog &#xff09;是一种硬件描述语言&#xff0c;用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog 继承了 C 语言的多种操作符和结构&#xff0c;与另一种硬件描述语言 VHDL 相比&#xff0c;语法不是…

JavaScript 操作历史记录api怎样使用 JavaScript

JavaScript 操作历史记录api怎样使用 JavaScript History 是 window 对象中的一个 JavaScript 对象&#xff0c;它包含了关于浏览器会话历史的详细信息。你所访问过的 URL 列表将被像堆栈一样存储起来。浏览器上的返回和前进按钮使用的就是 history 的信息。 History 对象包含…

数据库信息速递 -- MariaDB 裁员后,前景不确定 (翻译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群&#xff…

【算法挨揍日记】day01——双指针算法_移动零、 复写零

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

C语言之位运算

一、什么是位运算 所谓位运算是指进行二进制位的运算 在系统软件中&#xff0c;常要处理二进位的问题 例如&#xff0c;将一个存储单元中的各二进位左移或右移一位&#xff0c;两个数按位相加等 二、位运算符和位运算 1、按位与 运算符(&) 参加运算的两个数据&#xff…

单志刚的七年联盟链之路:在正确的方向,同行者总会相遇丨对话MVP

单志刚在联盟链的道路上已经坚守了7年。 从最初创业时期的“用字节开发”&#xff0c;到现在作为数金公共服务 (青岛) 有限公司&#xff08;下称“数金公服”&#xff09;区块链研发中心产品总监&#xff0c;落地全国首个以数字人民币结算的碳普惠平台“青碳行”App&#xff0…

PhotoShop2023 Beta AI版安装教程

从 Photoshop 开始&#xff0c;惊艳随之而来​ 从社交媒体贴子到修饰相片&#xff0c;设计横幅到精美网站&#xff0c;日常影像编辑到重新创造 – 无论什么创作&#xff0c;Photoshop 都可以让它变得更好。​ Photoshop2023 Beta版本安装教程和软件下载 地址&#xff1a;点击…

Redis:揭秘高效缓存与数据存储利器

Redis&#xff08;Remote Dictionary Server&#xff09;是一款开源的、内存数据结构存储系统&#xff0c;广泛应用于高性能缓存、消息队列、实时分析和计数器等场景。本文将深入探索Redis的重要概念、底层架构实现原理&#xff0c;指导程序员如何部署和使用Redis&#xff0c;并…

力扣70.爬楼梯(动态规划)

/*** author Limg* date 2023/08/11* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。* 每次你可以爬 1 或 2 个台阶。* 你有多少种不同的方法可以爬到楼顶呢&#xff1f; */#include<iostream> using namespace std; int climbStairs(int n); int main() {int n0;cin>&…

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目&#xff1a; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …

Floyd算法

正如我们所知道的&#xff0c;Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展&#xff0c;三个for循环就可以解决问题&#xff0c;所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下&#xff1a;从任意节点A到任意节点B的最短路径不外乎2种可能&#xff…

FreeRTOS(消息队列)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、消息队列的基本概念 1、消息队列的基本概念 2、消息队列的通信机制 3、FreeRTOS中消息队列特性 4、消息队列应用场景 二、消息队列常用API 1、使用消息队列的典型流程 三、消…

烘焙光照贴图,模型小部分发黑

1.首先确定创建了光照贴图UV&#xff0c;其次确定不是溢色&#xff0c;这个最简单&#xff0c;所有模型材质设置为双面就可以&#xff0c;URP材质球的话这里就是设置双面 在scence界面Texel Validity模式里查看溢色&#xff0c;红色表示有溢色&#xff0c;绿色表示正常 2. 光照…

异常(中)创建自定义异常,throw,throws关键字抛出异常

文章目录 前言一、创建自定义异常二、在方法中抛出异常 1.使用throw关键字抛出异常2.使用throws关键字抛出异常总结 前言 该文介绍了Java的异常的创建自定义异常&#xff0c;让我们可以自己创建出一个异常&#xff0c;应对Java API中没有的基础的异常报错。throw关键字抛出异常…

【服务平台】Rancher运行和管理Docker和Kubernetes,提供管理生产中的容器所需的整个软件堆栈

Rancher是一个开源软件平台&#xff0c;使组织能够在生产中运行和管理Docker和Kubernetes。使用Rancher&#xff0c;组织不再需要使用一套独特的开源技术从头开始构建容器服务平台。Rancher提供了管理生产中的容器所需的整个软件堆栈。  完整软件堆栈 Rancher是供采用容器的团…

7款轻量级平面图设计软件推荐

平面图设计的痕迹体现在日常生活的方方面面&#xff0c;如路边传单、杂志、产品包装袋或手机开屏海报等&#xff0c;平面设计软件层出不穷。Photoshop是大多数平面图设计初学者的入门软件&#xff0c;但随着设计师需求的不断提高&#xff0c;平面图设计软件Photoshop逐渐显示出…

Ajax 笔记(四)—— Ajax 进阶

笔记目录 4. Ajax 进阶4.1 同步代码和异步代码4.2 回调函数地狱4.2.1 解决方法一&#xff1a;Promise 链式调用4.2.2 解决方法二&#xff1a;async 函数和 await 4.3 Promise.all 静态方法4.4 事件循环4.4.1 事件循环4.4.2 宏任务与微任务 4.5 案例4.5.1 案例一-商品分类4.5.2 …

“反AI斗士”马斯克宣布成立xAI :目标是了解宇宙真实本质

北京时间7月13日凌晨&#xff0c;马斯克在Twitter上宣布&#xff1a;“xAI正式成立&#xff0c;去了解现实。”马斯克表示&#xff0c;推出xAI的原因是想要“了解宇宙的真实本质”。Ghat GPT横空出世已有半年&#xff0c;国内外“百模大战”愈演愈烈&#xff0c;AI大模型的现状…

【golang】数组和切片底层原理

数组类型的值&#xff08;以下简称数组&#xff09;的长度是固定的&#xff0c;而切片类型的值&#xff08;以下简称切片&#xff09;是可变长的。 数组的长度在声明它的时候就必须给定&#xff0c;并且之后不会再改变。可以说&#xff0c;数组的长度是其类型的一部分。比如&a…