Qt5--UDP图片传输并显示

来源:互联网 发布:网络电视台客户端 编辑:程序博客网 时间:2024/06/06 09:00

利用UDP发送图片是试验UDP传输视频流的基础。


【来源】http://blog.csdn.net/qq_28877125/article/details/69470139

UDP发送端
UDPSender.pro

#-------------------------------------------------## Project created by QtCreator 2017-04-06T20:01:35##-------------------------------------------------QT       += core guiQT       += networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = UDPSenderTEMPLATE = appSOURCES += main.cpp\        mainwindow.cppHEADERS  += mainwindow.hFORMS    += mainwindow.ui
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QUdpSocket>#include <QFile>#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;    //数据帧在整帧的偏移};namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private slots:    void on_pushButton_clicked();private:    Ui::MainWindow *ui;    QUdpSocket *m_udpSocket;};#endif // MAINWINDOW_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QTime>#include <QDesktopWidget>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    m_udpSocket = new QUdpSocket(this);}MainWindow::~MainWindow(){    delete ui;}void MainWindow::on_pushButton_clicked(){    while(1) {//        QPixmap result = QPixmap();//        result = QPixmap::grabWindow(QApplication::desktop()->winId(), 0, 0, 800, 600); //抓取当前屏幕的图片//        result.save("D:\\LX\\Work\\Project\\802PC\\TcpServetTest\\802TCPServer\\eee.jpg");        QFile file("D:\\tempdata.jpg");        if (!file.open(QIODevice::ReadOnly))            return;        char *m_sendBuf = new char[1024];        int size = file.size();        int num = 0;        int count = 0;        int endSize = size%996;        if (endSize == 0) {            num = size/996;        }        else {            num = size/996+1;        }        while (count < num) {            memset(m_sendBuf, 0, 1024);            ImageFrameHead mes;            mes.funCode = 24;            mes.uTransFrameHdrSize = sizeof(ImageFrameHead);            if ((count+1) != num) {                mes.uTransFrameSize = 996;            }            else {                mes.uTransFrameSize = endSize;            }            //qDebug()<<size;            mes.uDataFrameSize = size;            mes.uDataFrameTotal = num;            mes.uDataFrameCurr = count+1;            mes.uDataInFrameOffset = count*(1024 - sizeof(ImageFrameHead));            file.read(m_sendBuf+sizeof(ImageFrameHead), 1024-sizeof(ImageFrameHead));            memcpy(m_sendBuf, (char *)&mes, sizeof(ImageFrameHead));            m_udpSocket->writeDatagram(m_sendBuf, mes.uTransFrameSize+mes.uTransFrameHdrSize, QHostAddress("192.168.56.1"), 65522);            QTime dieTime = QTime::currentTime().addMSecs(1);            while( QTime::currentTime() < dieTime )                QCoreApplication::processEvents(QEventLoop::AllEvents, 100);            count++;        }        file.close();        QTime dieTime = QTime::currentTime().addMSecs(10);        while( QTime::currentTime() < dieTime )            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);        //qDebug("ok");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

ui
这里写图片描述
UDP接收端
UDPReceiver.pro

#-------------------------------------------------## Project created by QtCreator 2017-04-06T20:10:32##-------------------------------------------------QT       += core guiQT       += networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = UDPReceiverTEMPLATE = appSOURCES += main.cpp\        mainwindow.cpp \    udpthread.cppHEADERS  += mainwindow.h \    udpthread.hFORMS    += mainwindow.ui
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "udpthread.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private slots:    void slotRecv(char *buf, int len);private:    Ui::MainWindow *ui;    UdpThread *m_udpThread;};#endif // MAINWINDOW_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

udpthread.h

#ifndef UDPTHREAD_H#define UDPTHREAD_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_OBJECTpublic:    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;};#endif // UDPTHREAD_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    m_udpThread = new UdpThread;    connect(m_udpThread, SIGNAL(sigRecvOk(char*,int)), this, SLOT(slotRecv(char*,int)));    m_udpThread->start();    qDebug("OK");}MainWindow::~MainWindow(){    delete ui;}void MainWindow::slotRecv(char * buf, int len){    QPixmap pixmap;    pixmap.loadFromData((uchar*)buf, len, "JPG");    ui->label->setPixmap(pixmap);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

udpthread.cpp

#include "udpthread.h"UdpThread::UdpThread(QObject *parent) :    QThread(parent){    m_buf = new char[1024*1024];    memset(m_buf, 0, 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);    qDebug()<< m_udpSocket->bind(QHostAddress::Any, 65522);    exec();}void UdpThread::slotRecv(){    char *recvBuf = new char[1052];    memset(recvBuf, 0, 1052);    //qDebug("start");    while(m_udpSocket->hasPendingDatagrams()) {        memset(recvBuf, 0, 1052);        int size = m_udpSocket->pendingDatagramSize();        //qDebug()<<"size"<<size;        m_udpSocket->readDatagram(recvBuf, size);        ImageFrameHead *mes = (ImageFrameHead *)recvBuf;        //qDebug()<<mes->uDataFrameCurr<<mes->uDataFrameTotal;        if (mes->funCode == 24) {            memcpy(m_buf+mes->uDataInFrameOffset, (recvBuf+ sizeof(ImageFrameHead)), mes->uTransFrameSize);            if (mes->uDataFrameCurr == mes->uDataFrameTotal) {                qDebug("write");                emit sigRecvOk(m_buf, mes->uDataFrameSize);            }        }    }    delete recvBuf;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

ui
这里写图片描述

测试:
这里写图片描述