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
测试:
阅读全文
0 0
- Qt5--UDP图片传输并显示
- Qt5--UDP图片传输并显示
- 获取后台传输的二进制流图片并显示
- UDP传输图片的尝试
- Socket UDP远程传输图片
- UDP传输
- UDP传输
- UDP传输
- 图片上传并显示
- Android开发之局域网内udp传输图片
- Qt5 UDP开发
- Qt5 UDP广播
- Qt5 UDP网络通讯详解
- C++编程使用QT5 SDK录制屏幕并显示
- 用Qt5和OpenCV读取显示中文路径的图片
- 在QT5中搭建SDL2环境以及显示bmp图片
- ssh上传并显示图片
- 获取网络图片并显示
- linux驱动之NOR FLASH驱动程序
- Windows线程管理和调度机制概述
- 多线程获取豆瓣网页的网络爬虫(Python实现)
- Docker基础系列(一)Centos6.4离线安装docker
- 关于部署多个php版本共存
- Qt5--UDP图片传输并显示
- Java:对象的强、软、弱和虚引用
- MySQL的概述:
- sql server express版本不能启动代理服务的另类解决办法
- 135Candy
- 我的第一天
- iOS开发中QQ好友列表下拉显示全部好友实现思路
- window.getComputedStyle()方法的使用
- python super()和classmethod