赞
踩
为了处理丢包等原因,发送端每发送一帧接收端都要回复,最后要判断文件接收是否完整。
发送文件
1.浏览选择文件
filepath.clear();//初始化文件路径
fdialog = new QFileDialog();//这里用QFileDialog浏览文件夹
fdialog->setFileMode(QFileDialog::ExistingFiles);
filepath = fdialog->getOpenFileName();
this->ui->lineEdit->setText(filepath);
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; }
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处理文件名可能是中文的
}
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.接收文件名
QByteArray datag;//
udpsocket->readDatagram(datag.data(), udpsocket->pendingDatagramSize());
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); }
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);
}
}
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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。