利用UDP发送图片是试验UDP传输视频流的基础。
UDP发送端
UDPSender.pro
#-------------------------------------------------
#
# Project created by QtCreator 2017-04-06T20:01:35
#
#-------------------------------------------------
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = UDPSender
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
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_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QUdpSocket *m_udpSocket;
};
#endif // MAINWINDOW_H
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");
}
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
ui
UDP接收端
UDPReceiver.pro
#-------------------------------------------------
#
# Project created by QtCreator 2017-04-06T20:10:32
#
#-------------------------------------------------
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = UDPReceiver
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
udpthread.cpp
HEADERS += mainwindow.h \
udpthread.h
FORMS += mainwindow.ui
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "udpthread.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void slotRecv(char *buf, int len);
private:
Ui::MainWindow *ui;
UdpThread *m_udpThread;
};
#endif // MAINWINDOW_H
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_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;
};
#endif // UDPTHREAD_H
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);
}
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;
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
ui
测试: