Qt UDP传送图片

news/2024/5/18 15:59:58 标签: qt, udp, 开发语言

Qt UDP传送图片,server发送,client接收。

 server

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QPainter>

#define TRAN_SIZE 1024;
struct ImageFrameHead
{
    int funCode;                        //!功能码
    unsigned int uTransFrameHdrSize;    //!sizeof(WIFI_FRAME_HEADER)
    unsigned int uTransFrameSize;       //!sizeof(WIFI_FRAME_HEADER) + Data Size

    //数据帧变量
    unsigned int uDataFrameSize;        //数据帧的总大小
    unsigned int uDataFrameTotal;       //一帧数据被分成传输帧的个数
    unsigned int uDataFrameCurr;        //数据帧当前的帧号
    unsigned int uDataInFrameOffset;    //数据帧在整帧的偏移
};

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QFont font;
    font.setPixelSize(16);
    setFont(font);
    setWindowTitle(QStringLiteral("UDP Server"));
    ui->label->setMaximumHeight(ui->pushButton->sizeHint().height());

    mUdpSocket = new QUdpSocket(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    Q_UNUSED(event);

    mFlag = true;
    mUdpSocket->close();
}

void MainWindow::on_pushButton_clicked()
{
    QString name;
    int sendCount = 1;
    int size = 0;
    int num = 0;
    int count = 0;
    int endSize = 0;
    ImageFrameHead mes;
    while(1)
    {
        name = QStringLiteral("./data/%1.jpg").arg(sendCount, 3, 10, QLatin1Char('0'));
        mFile.setFileName(name);
        mFile.open(QIODevice::ReadOnly);
        char *m_sendBuf = new char[1024];

        size = mFile.size();
        num = 0;
        count = 0;
        endSize = size%996;
        if (endSize == 0)
        {
            num = size/996;
        }
        else
        {
            num = size/996+1;
        }

        while (count < num)
        {
            memset(m_sendBuf, 0, 1024);

            mes.funCode = 24;
            mes.uTransFrameHdrSize = sizeof(ImageFrameHead);
            if ((count+1) != num)
            {
                mes.uTransFrameSize = 996;
            }
            else
            {
                mes.uTransFrameSize = endSize;
            }

            mes.uDataFrameSize = size;
            mes.uDataFrameTotal = num;
            mes.uDataFrameCurr = count+1;
            mes.uDataInFrameOffset = count*(1024 - sizeof(ImageFrameHead));

            mFile.read(m_sendBuf+sizeof(ImageFrameHead), 1024-sizeof(ImageFrameHead));
            memcpy(m_sendBuf, (char *)&mes, sizeof(ImageFrameHead));
            mUdpSocket->writeDatagram(m_sendBuf, mes.uTransFrameSize+mes.uTransFrameHdrSize, QHostAddress("127.0.0.1"), 9930);

            QTime dieTime = QTime::currentTime().addMSecs(1);
            while( QTime::currentTime() < dieTime )
            {
                QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
            }
            qDebug() << "";

            count++;
        }

        delete []m_sendBuf;

        QTime dieTime = QTime::currentTime().addMSecs(10);
        while( QTime::currentTime() < dieTime )
        {
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
        }

        ui->label->setText(QStringLiteral("%1").arg(sendCount++));

        if (sendCount == mMaxFileNum + 1)
        {
            sendCount = 1;
        }

        mFile.close();

        if (mFlag)
        {
            break;
        }
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    QImage image("wintersun.jpg");
    QImage image2(image.size(), QImage::Format_ARGB32);

    for (int i = 1; i <= mMaxFileNum; ++i)
    {
        QString name = QStringLiteral("%1").arg(i, 3, 10, QLatin1Char('0'));
        QPainter painter(&image2);
        painter.drawImage(0, 0, image);
        QPen pen(Qt::red);
        QFont font("微软雅黑", 30, QFont::Bold);
        painter.setPen(pen);
        painter.setFont(font);
        painter.drawText(30, 50, name);

        image2.save(QStringLiteral("./data/%1.jpg").arg(name), "jpg", 100);
        ui->label_image->setPixmap(QPixmap::fromImage(image2));
        QCoreApplication::processEvents(QEventLoop::AllEvents);
    }
}

client

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QThread>
#include <QUdpSocket>
struct ImageFrameHead
{
    int funCode;                        //!功能码
    unsigned int uTransFrameHdrSize;    //!sizeof(WIFI_FRAME_HEADER)
    unsigned int uTransFrameSize;       //!sizeof(WIFI_FRAME_HEADER) + Data Size

    //数据帧变量
    unsigned int uDataFrameSize;        //数据帧的总大小
    unsigned int uDataFrameTotal;       //一帧数据被分成传输帧的个数
    unsigned int uDataFrameCurr;        //数据帧当前的帧号
    unsigned int uDataInFrameOffset;    //数据帧在整帧的偏移
};

class UdpThread : public QThread
{
    Q_OBJECT

public:
    explicit UdpThread(QObject *parent = 0);
    ~UdpThread();

protected:
    virtual void run();

signals:
    void sigRecvOk(char *buf, int len);

public slots:
    void slotRecv();

private:
    QUdpSocket *m_udpSocket;
    char *m_buf;
};

UdpThread::UdpThread(QObject *parent) :
    QThread(parent)
{
    m_buf = new char[1024*1024];
    memset(m_buf, 0, 1024*1024);
}

UdpThread::~UdpThread()
{
    m_udpSocket->close();
    delete []m_buf;
}

void UdpThread::run()
{
    m_udpSocket = new QUdpSocket;
    connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(slotRecv()), Qt::DirectConnection);
    m_udpSocket->bind(QHostAddress("127.0.0.1"), 9930);
    exec();
}

void UdpThread::slotRecv()
{
    char *recvBuf = new char[1052];
    memset(recvBuf, 0, 1052);
    while(m_udpSocket->hasPendingDatagrams())
    {
        memset(recvBuf, 0, 1052);
        int size = m_udpSocket->pendingDatagramSize();
        m_udpSocket->readDatagram(recvBuf, size);

        ImageFrameHead *mes = (ImageFrameHead *)recvBuf;
        if (mes->funCode == 24) {
            memcpy(m_buf+mes->uDataInFrameOffset, (recvBuf+ sizeof(ImageFrameHead)), mes->uTransFrameSize);
            if (mes->uDataFrameCurr == mes->uDataFrameTotal)
            {
                emit sigRecvOk(m_buf, mes->uDataFrameSize);
            }
        }
    }

    delete []recvBuf;
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QFont font;
    font.setPixelSize(16);
    setFont(font);
    setWindowTitle(QStringLiteral("UDP client"));

    m_udpThread = new UdpThread;
    connect(m_udpThread, SIGNAL(sigRecvOk(char*,int)), this, SLOT(slotRecv(char*,int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    m_udpThread->start();
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    Q_UNUSED(event);

    if (m_udpThread->isRunning())
    {
        m_udpThread->quit();
    }
}

void MainWindow::slotRecv(char * buf, int len)
{
    QPixmap pixmap;
    pixmap.loadFromData((uchar*)buf, len, "JPG");
    ui->label->setPixmap(pixmap);
}

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

相关文章

html form表单高级用法

场景&#xff1a;想单纯使用表单内置的api完成提交&#xff0c;不使用js代码 代码如下&#xff1a; <form name"myForm" action"http://localhost:13734/form" method"post"><label>用户名<input type"text" name&qu…

C#复习:面向对象基本概念

C#复习&#xff1a;面向对象基本概念 前言什么是面向对象类&#xff0c;名称空间的介绍 如何导入类库DLL引用(黑盒引用)项目引用(白盒引用)NuGet介绍 依赖关系C#的分装(个人理解) 前言 关于我C#的博客是根据刘铁猛老师的C#入门课程为基础写的&#xff0c;可以配合刘铁猛老师的…

开源免费的流程图软件draw.io

2023年9月16日&#xff0c;周六上午 想买微软的visio&#xff0c;但发现不是很值得&#xff0c;因为我平时也不是经常需要画图。 所以我最后还是决定使用开源免费的draw.io来画图 draw.io网页版的网址&#xff1a; Flowchart Maker & Online Diagram Software draw.io的…

你能想象在亚运赛场打《王者荣耀》吗?

作者&#xff1a;April叶 快评&#xff1a;20年前&#xff0c;没人敢相信电竞加入亚运会&#xff0c;但在今年的杭州亚运会&#xff0c;电竞不仅正式成为官方竞赛项目&#xff0c;首次登场还一举成了亚运会“顶流”。 你以为 打游戏只会毁了你 但其实 打游戏也能为国争光 …

Debian环境下搭建STM32开发环境

1. 安装交叉编译工具&#xff0c;解压gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2&#xff0c;并且把交叉编译环境添加到path路径。 2.安装下载工具驱动和下载工具 # 安装下载工具openocd sudo apt -y install openocd 3.下载测试 sudo openocd -f cmsis-dap.cfg -…

【视觉SLAM入门】8. 回环检测,词袋模型,字典,感知,召回,机器学习

"见人细过 掩匿盖覆” 1. 意义2. 做法2.1 词袋模型和字典2.1.2 感知偏差和感知变异2.1.2 词袋2.1.3 字典 2.2 匹配(相似度)计算 3. 提升 前言&#xff1a; 前端提取数据&#xff0c;后端优化数据&#xff0c;但误差会累计&#xff0c;需要回环检测构建全局一致的地图&…

探索Java生态系统的其他技术与工具

导言&#xff1a; Java生态系统拥有广泛的技术和工具&#xff0c;其中一些对于开发者来说至关重要。除了核心Java编程语言和开发框架&#xff0c;还有一些其他技术和工具可以帮助开发者更好地构建和管理Java项目。本文将深入探索这些技术和工具&#xff0c;包括Maven和Gradle的…

深度学习-偏导数复习

文章目录 前言1.偏导数2.偏导数概念1.对x的偏导数2.对y的偏导数3.多元函数偏导数4.如何计算偏导数1.二元函数的偏导数2.复杂函数的偏导数3.分段函数1.分界点的偏导数 5.偏导数与连续之间的关系6.偏导数的几何意义7.高阶偏导数1.定义2.高阶偏导数例题&#xff08;二阶偏导数&…