• Qt UDP传送图片


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

     server

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. #include
    5. #define TRAN_SIZE 1024;
    6. struct ImageFrameHead
    7. {
    8. int funCode; //!功能码
    9. unsigned int uTransFrameHdrSize; //!sizeof(WIFI_FRAME_HEADER)
    10. unsigned int uTransFrameSize; //!sizeof(WIFI_FRAME_HEADER) + Data Size
    11. //数据帧变量
    12. unsigned int uDataFrameSize; //数据帧的总大小
    13. unsigned int uDataFrameTotal; //一帧数据被分成传输帧的个数
    14. unsigned int uDataFrameCurr; //数据帧当前的帧号
    15. unsigned int uDataInFrameOffset; //数据帧在整帧的偏移
    16. };
    17. MainWindow::MainWindow(QWidget *parent)
    18. : QMainWindow(parent)
    19. , ui(new Ui::MainWindow)
    20. {
    21. ui->setupUi(this);
    22. QFont font;
    23. font.setPixelSize(16);
    24. setFont(font);
    25. setWindowTitle(QStringLiteral("UDP Server"));
    26. ui->label->setMaximumHeight(ui->pushButton->sizeHint().height());
    27. mUdpSocket = new QUdpSocket(this);
    28. }
    29. MainWindow::~MainWindow()
    30. {
    31. delete ui;
    32. }
    33. void MainWindow::closeEvent(QCloseEvent *event)
    34. {
    35. Q_UNUSED(event);
    36. mFlag = true;
    37. mUdpSocket->close();
    38. }
    39. void MainWindow::on_pushButton_clicked()
    40. {
    41. QString name;
    42. int sendCount = 1;
    43. int size = 0;
    44. int num = 0;
    45. int count = 0;
    46. int endSize = 0;
    47. ImageFrameHead mes;
    48. while(1)
    49. {
    50. name = QStringLiteral("./data/%1.jpg").arg(sendCount, 3, 10, QLatin1Char('0'));
    51. mFile.setFileName(name);
    52. mFile.open(QIODevice::ReadOnly);
    53. char *m_sendBuf = new char[1024];
    54. size = mFile.size();
    55. num = 0;
    56. count = 0;
    57. endSize = size%996;
    58. if (endSize == 0)
    59. {
    60. num = size/996;
    61. }
    62. else
    63. {
    64. num = size/996+1;
    65. }
    66. while (count < num)
    67. {
    68. memset(m_sendBuf, 0, 1024);
    69. mes.funCode = 24;
    70. mes.uTransFrameHdrSize = sizeof(ImageFrameHead);
    71. if ((count+1) != num)
    72. {
    73. mes.uTransFrameSize = 996;
    74. }
    75. else
    76. {
    77. mes.uTransFrameSize = endSize;
    78. }
    79. mes.uDataFrameSize = size;
    80. mes.uDataFrameTotal = num;
    81. mes.uDataFrameCurr = count+1;
    82. mes.uDataInFrameOffset = count*(1024 - sizeof(ImageFrameHead));
    83. mFile.read(m_sendBuf+sizeof(ImageFrameHead), 1024-sizeof(ImageFrameHead));
    84. memcpy(m_sendBuf, (char *)&mes, sizeof(ImageFrameHead));
    85. mUdpSocket->writeDatagram(m_sendBuf, mes.uTransFrameSize+mes.uTransFrameHdrSize, QHostAddress("127.0.0.1"), 9930);
    86. QTime dieTime = QTime::currentTime().addMSecs(1);
    87. while( QTime::currentTime() < dieTime )
    88. {
    89. QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
    90. }
    91. qDebug() << "";
    92. count++;
    93. }
    94. delete []m_sendBuf;
    95. QTime dieTime = QTime::currentTime().addMSecs(10);
    96. while( QTime::currentTime() < dieTime )
    97. {
    98. QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
    99. }
    100. ui->label->setText(QStringLiteral("%1").arg(sendCount++));
    101. if (sendCount == mMaxFileNum + 1)
    102. {
    103. sendCount = 1;
    104. }
    105. mFile.close();
    106. if (mFlag)
    107. {
    108. break;
    109. }
    110. }
    111. }
    112. void MainWindow::on_pushButton_2_clicked()
    113. {
    114. QImage image("wintersun.jpg");
    115. QImage image2(image.size(), QImage::Format_ARGB32);
    116. for (int i = 1; i <= mMaxFileNum; ++i)
    117. {
    118. QString name = QStringLiteral("%1").arg(i, 3, 10, QLatin1Char('0'));
    119. QPainter painter(&image2);
    120. painter.drawImage(0, 0, image);
    121. QPen pen(Qt::red);
    122. QFont font("微软雅黑", 30, QFont::Bold);
    123. painter.setPen(pen);
    124. painter.setFont(font);
    125. painter.drawText(30, 50, name);
    126. image2.save(QStringLiteral("./data/%1.jpg").arg(name), "jpg", 100);
    127. ui->label_image->setPixmap(QPixmap::fromImage(image2));
    128. QCoreApplication::processEvents(QEventLoop::AllEvents);
    129. }
    130. }

    client

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. #include
    5. struct ImageFrameHead
    6. {
    7. int funCode; //!功能码
    8. unsigned int uTransFrameHdrSize; //!sizeof(WIFI_FRAME_HEADER)
    9. unsigned int uTransFrameSize; //!sizeof(WIFI_FRAME_HEADER) + Data Size
    10. //数据帧变量
    11. unsigned int uDataFrameSize; //数据帧的总大小
    12. unsigned int uDataFrameTotal; //一帧数据被分成传输帧的个数
    13. unsigned int uDataFrameCurr; //数据帧当前的帧号
    14. unsigned int uDataInFrameOffset; //数据帧在整帧的偏移
    15. };
    16. class UdpThread : public QThread
    17. {
    18. Q_OBJECT
    19. public:
    20. explicit UdpThread(QObject *parent = 0);
    21. ~UdpThread();
    22. protected:
    23. virtual void run();
    24. signals:
    25. void sigRecvOk(char *buf, int len);
    26. public slots:
    27. void slotRecv();
    28. private:
    29. QUdpSocket *m_udpSocket;
    30. char *m_buf;
    31. };
    32. UdpThread::UdpThread(QObject *parent) :
    33. QThread(parent)
    34. {
    35. m_buf = new char[1024*1024];
    36. memset(m_buf, 0, 1024*1024);
    37. }
    38. UdpThread::~UdpThread()
    39. {
    40. m_udpSocket->close();
    41. delete []m_buf;
    42. }
    43. void UdpThread::run()
    44. {
    45. m_udpSocket = new QUdpSocket;
    46. connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(slotRecv()), Qt::DirectConnection);
    47. m_udpSocket->bind(QHostAddress("127.0.0.1"), 9930);
    48. exec();
    49. }
    50. void UdpThread::slotRecv()
    51. {
    52. char *recvBuf = new char[1052];
    53. memset(recvBuf, 0, 1052);
    54. while(m_udpSocket->hasPendingDatagrams())
    55. {
    56. memset(recvBuf, 0, 1052);
    57. int size = m_udpSocket->pendingDatagramSize();
    58. m_udpSocket->readDatagram(recvBuf, size);
    59. ImageFrameHead *mes = (ImageFrameHead *)recvBuf;
    60. if (mes->funCode == 24) {
    61. memcpy(m_buf+mes->uDataInFrameOffset, (recvBuf+ sizeof(ImageFrameHead)), mes->uTransFrameSize);
    62. if (mes->uDataFrameCurr == mes->uDataFrameTotal)
    63. {
    64. emit sigRecvOk(m_buf, mes->uDataFrameSize);
    65. }
    66. }
    67. }
    68. delete []recvBuf;
    69. }
    70. MainWindow::MainWindow(QWidget *parent)
    71. : QMainWindow(parent)
    72. , ui(new Ui::MainWindow)
    73. {
    74. ui->setupUi(this);
    75. QFont font;
    76. font.setPixelSize(16);
    77. setFont(font);
    78. setWindowTitle(QStringLiteral("UDP client"));
    79. m_udpThread = new UdpThread;
    80. connect(m_udpThread, SIGNAL(sigRecvOk(char*,int)), this, SLOT(slotRecv(char*,int)));
    81. }
    82. MainWindow::~MainWindow()
    83. {
    84. delete ui;
    85. }
    86. void MainWindow::on_pushButton_clicked()
    87. {
    88. m_udpThread->start();
    89. }
    90. void MainWindow::closeEvent(QCloseEvent *event)
    91. {
    92. Q_UNUSED(event);
    93. if (m_udpThread->isRunning())
    94. {
    95. m_udpThread->quit();
    96. }
    97. }
    98. void MainWindow::slotRecv(char * buf, int len)
    99. {
    100. QPixmap pixmap;
    101. pixmap.loadFromData((uchar*)buf, len, "JPG");
    102. ui->label->setPixmap(pixmap);
    103. }
  • 相关阅读:
    Spark和Hadoop的对比
    前端知识复习
    【EI检索会议】第四届智能电网与能源工程国际研讨会(SGEE 2023)
    Linux系统上安装软件
    数据库操作
    吴恩达机器学习笔记 二十二 机器学习项目的完整周期 公正、偏见和伦理
    WPF第三方开源UI框架:打造独特体验的魔法师
    C++的缺陷和思考(七)
    My Eighty-fourth Page - 买卖股票的最佳时机 - By Nicolas
    常用CSS样式属性
  • 原文地址:https://blog.csdn.net/mabing993/article/details/132941941