当前位置:   article > 正文

QT发送数据之udp发送文件_qt udp传输文件

qt udp传输文件

QT发送数据之udp发送文件

为了处理丢包等原因,发送端每发送一帧接收端都要回复,最后要判断文件接收是否完整。
发送文件
1.浏览选择文件

	filepath.clear();//初始化文件路径
    fdialog = new QFileDialog();//这里用QFileDialog浏览文件夹
    fdialog->setFileMode(QFileDialog::ExistingFiles);
    filepath = fdialog->getOpenFileName();
    this->ui->lineEdit->setText(filepath);
  • 1
  • 2
  • 3
  • 4
  • 5

2.对文件进行读取

if(false == filepath.isEmpty()) {//文件路径不为空
        QFileInfo info(filepath);
        filename = info.fileName();
        file.setFileName(filepath);//QFile file
        if(file.size() > 0) {
            bool isOk = file.open(QIODevice::ReadOnly);
            this->ui->textBrowser->append("发送" + file.fileName());//打印操作
            if(false == isOk) {
                this->ui->textBrowser->append("只读方式打开文件失败 77 ");
                return 0;
            }
            return 1;//返回值
        } else {
            this->ui->textBrowser->append("文件为空");
            return 0;
        }
    } else {
        this->ui->textBrowser->append("选择文件路径出错 62");
        return 0;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3.发送开始标志与文件名

	QString data1(ty);//ty是发送的一个标志戳,确保文件统一
    if(!file.atEnd()) {
        QString data2( data1 );
        data2.append("start");
        data2.append(filename);
        udpsocket->writeDatagram(data2.toUtf8(), QHostAddress(IP2), Prot);//toUtf8处理文件名可能是中文的
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.发送文件

  QString data1(ty);
  //一次性发全部将if改为while
    if (!file.atEnd()) {//文件指针
        QString data2( data1 );
        QByteArray  line = data2.toUtf8() + file.read(8000);
        udpsocket->writeDatagram(line, QHostAddress(IP2), Prot);
    } else {
        data1.append("end");//结尾标志
        data1.append(QString::number(file.size()));//文件大小
        udpsocket->writeDatagram(data1.toUtf8(), QHostAddress(IP2), Prot);
        file.close();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

接收文件
1.接收文件名

QByteArray datag;//
udpsocket->readDatagram(datag.data(), udpsocket->pendingDatagramSize());
  • 1
  • 2
	QString data4;
    memcpy(msg, datags.data(), 1);//标志
    data4.append(datags.mid(1, 5));//"start"
    if(data4  == "start") {
        QString filenamedata;
        filenamedata.append(datags.data() + 6);
        if(filenamedata == NULL) {
            return;
        }
        filename = "./debug/" + filenamedata;
        rfile.setFileName(filename);
        if(!rfile.open(QIODevice::WriteOnly | QIODevice::Append)) {
            this->ui->textBrowser->append("文件打开失败");
            return;
        } else {
            this->ui->textBrowser->append(rfile.fileName().toUtf8());//打印
            QString ret;
            ret.append(msg[0]);
            ret.append("0");
            udpsocket->writeDatagram(ret.toUtf8(), QHostAddress(IP2), Prot);//回复发送端
        }
        rfile.resize(0);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2.接收文件

 unsigned char msg2[1] = {0};
 memcpy(msg2, datag.data(), 1);
   if(msg2[0] == msg[0]) {//接收文件
       QByteArray datags;
       datags = datag.mid(1);
       getfile(datags);//调用
    else {//不同接收新文件
             msg[0] = 0;
             start = false;
             ty = 0;
             i = 0;
             getfilename(datag);
         }
     }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
 QString str = datags.mid(0, 3);
    if(str != "end") {//结尾标志
        num++;
        QString ret;
        ret.append(msg[0]);
        ret.append(QString::number(num));
        udpsocket->writeDatagram(ret.toUtf8(), QHostAddress(IP2), Prot);//回复接收多少文件了
        QString filess;
        qint64 q = rfile.write(datags);
        this->ui->textBrowser->append(QString::number(q));
        qDebug() << filess.size() << endl;
    } else {
        qint64 filelen = datags.mid(3).toULongLong();
        if(filelen == rfile.size()) {
            this->ui->textBrowser->append("接收完成");
            rfile.close();
            msg[0] = 0;
            start = false;
            filename.clear();
            num = 0;
        } else {
            this->ui->textBrowser->append("接收失败");
            QString datagram;
            datagram.append("new");
            datagram.append("重新发送");
            //qDebug("%d", datagram.size());
            udpsocket->writeDatagram(datagram.toUtf8(),  QHostAddress(IP2), Prot);
        }
        return;
    }
  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/305238
推荐阅读
相关标签
  

闽ICP备14008679号