Qt(二):使用udp发送与接收图片

使用Qt来通过UDP协议发送和接收图片可以分为几个步骤。以下是一个基本的指南:

发送图片
准备图片数据 :首先,你需要将图片转换为可以在网络上传输的数据格式。通常,这涉及到将图片转换为字节数组。
设置UDP套接字 :在Qt中,你可以使用QUdpSocket类来创建UDP套接字。你需要指定目标地址和端口号。
发送数据:使用writeDatagram方法将图片数据发送到目标地址。

cpp 复制代码
//发送udp
void MainWindow::sendMess(){
    QByteArray receBuffer;//创建接收字节流
    QBuffer bufferDevice(&receBuffer);//
    bufferDevice.open(QIODevice::WriteOnly);//打开缓冲区,写入字节流
    image.save(&bufferDevice,"png");//图像保存为指定类别
    QHostAddress address("192.168.1.100");//创建IP地址
    quint16 port =1234;//创建端口号
    sendUdp->writeDatagram(receBuffer,QHostAddress::Broadcast,port);//将图片转为字节流发送到指定地址、端口
    sendUdp->flush();
    qDebug()<<"发送字节流:"<<receBuffer.size();
}

//选择图像
void MainWindow::on_pBtn_selectImage_clicked()
{
    ui->label->setText("");//清空文本
    //打开文件
    QString fileName=QFileDialog::
                     getOpenFileName(this,"open file",
                     QDir::currentPath(),"Image File(*.jpg *.png)");
    image.load(fileName);//导入图片
    ui->label->setPixmap(QPixmap::fromImage(image));//将图像显示在标签label
    ui->label->resize(image.width(),image.height());//根据图像的大小调整显示大小

}

//发送图像
void MainWindow::on_pBtn_sendImage_clicked()
{
    sendUdp=new QUdpSocket(this);//创建字节套
    timerSend=new QTimer(this);
    connect(timerSend,&QTimer::timeout,this,&MainWindow::sendMess);//启动定时器发送图片信息
    timerSend->start(1000);//1s发一次
}

//停止发送
void MainWindow::on_pushButton_clicked()
{
    timerSend->stop();
    disconnect(timerSend,&QTimer::timeout,this,&MainWindow::sendMess);
    qDebug()<<"停止发送";
}

接收图片

设置UDP套接字: 同样,你需要使用QUdpSocket来创建一个UDP套接字。
接收数据:使用readDatagram方法来接收数据。你需要处理接收到的数据,并将其转换回图片格式。

cpp 复制代码
//接收udp
void MainWindow::udpRece(){
//    receUdp->waitForReadyRead(100);//等待10ms写入
    while(receUdp->hasPendingDatagrams()){
        quint64 size=receUdp->pendingDatagramSize();//读取字节流大小
        QByteArray receData;//创建接收字节流
        receData.resize(size);//改变与发送端的字节流大小一样
        receUdp->readDatagram(receData.data(),receData.size());//读取发送端的字节流
        QBuffer receBuffer(&receData);//
        QImageReader reader(&receBuffer,"png");
        QImage receImage=reader.read();
        sence=new QGraphicsScene(ui->graphicsView);
        ui->graphicsView->setScene(sence);
        QGraphicsPixmapItem *pixmapItem=
                new QGraphicsPixmapItem(QPixmap::fromImage(receImage));
        sence->addItem(pixmapItem);
        qDebug()<<"接收端字节流大小:"<<receData.size();
    }
}

//开始接收连接
void MainWindow::on_pBtn_receImage_clicked()
{

    timerRece=new QTimer(this);
    connect(timerRece,&QTimer::timeout,this,&MainWindow::udpRece);
    timerRece->start(1000);
//    receUdp=new QUdpSocket(this);
//    receUdp->bind(QHostAddress::Any,1234);
//    connect(receUdp,&QUdpSocket::readyRead,this,&MainWindow::udpRece);
}

//停止接收
void MainWindow::on_pBtn_stopRece_clicked()
{
    timerRece->stop();
    disconnect(timerRece,&QTimer::timeout,this,&MainWindow::udpRece);
    qDebug()<<"停止接收";
}

结果显示:

相关推荐
2501_944521591 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
行思理2 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
青瓦梦滋2 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
zhang133830890752 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻3 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
wangchunyu1143 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
初阳7853 小时前
【基于Qt5仿音乐播放器(六)】——细节打磨与总结
qt·1024程序员节
程序 代码狂人4 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
IpdataCloud4 小时前
批量查IP的API接口怎么选?免费API配额瓶颈与离线库本地批量方案实测
网络·网络协议·tcp/ip
meiying88385 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化