Qt详解实现TCP文件传输例子(文件下载和上传)附源码

02-29 1521阅读

网络通信我们用的很频繁,如文字,语音,文件,图片等,这个些传输方式都差不多

QT文件传输主要考验对传输的控制,还是需要点逻辑的,文件传输的大致框架如下

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

先看一下简单例子实现的效果(界面有点丑,重点在于内容):

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

 接下来重点讲一下需要用到哪些东西:

1.数据流 QDataStream

通过数据流可以操作各种数据类型,包括类对象,存储到文件中数据可以还原到内存,对QDataStream不懂的,可以去看下我写的这个:QDataStream中 << 和 >> 输入输出重载的理解_qdatastream text()); QThread::msleep(10); //添加延时 m_fileInfoWriteBytes = socket->write(DataInfoBlock) - typeMsgSize; qDebug()textBrowser->append(QString("网络请求超时,原因:%1").arg(socket->errorString())); return; } ui->textBrowser->append(QString("文件信息发送完成,开始对[%1]进行文件传输------------------") .arg(socket->localAddress().toString())); qDebug()append(QString("没有要传输的文件!" + filePath)); return ""; } m_sendFilePath = filePath; ui->textBrowser->append(QString("正在获取文件信息[%1]......").arg(filePath)); QFileInfo info(filePath); //获取要发送的文件大小 m_sendFileSize = info.size(); ui->textBrowser->append(QString("要发送的文件大小:%1字节,%2M").arg(m_sendFileSize).arg(m_sendFileSize/1024/1024.0)); //获取发送的文件名 QString currentFileName=filePath.right(filePath.size()-filePath.lastIndexOf('/')-1); QByteArray DataInfoBlock; QDataStream sendOut(&DataInfoBlock,QIODevice::WriteOnly); sendOut.setVersion(QDataStream::Qt_5_12); int type = MsgType::FileInfo; //封装发送的信息到DataInfoBlock中 sendOuttextBrowser->append(QString("当前上传进度:%1/%2 -> %3%").arg(bytesWritten).arg(m_sendFileSize).arg(progress)); ui->textBrowser->append(QString("-------------对[%1]的文件传输完成!------------------").arg(socket->peerAddress().toString())); ui->sendProgressBar->setValue(100); m_localFile.close(); return; } if(bytesWritten > m_sendFileSize) { ui->textBrowser->append("意外情况!!!"); return; } if(bytesWritten/1.0/m_sendFileSize > progressByte) { ui->textBrowser->append(QString("当前上传进度:%1/%2 -> %3%").arg(bytesWritten).arg(m_sendFileSize).arg(progress)); progressByte+=0.1; } } }

服务端的核心代码讲完了,接下来将客户端的代码,界面如下:

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

先定义一个文件类对象,用来存储接收文件的对象,每个下载的文件就是一个文件类对象

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

 当连接上服务器后,点击下载文件后,客户端会先发送获取文件的消息

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

 服务端收到后,就会获取文件信息(流程上面讲过了),将文件信息发送给客户端

然后客户端根据服务器发送的消息类型处理消息

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

 收到服务器发送的文件信息消息后,进行读取,获取文件名,文件大小,用文件类对象进行存储,新建准备写入一个要下载的文件,准备工作完成后,向服务器发送获取文件数据的消息

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

 然后设置下载标识为true

bool isDownloading; //是否正在下载标识

标识接下来接下来收到的将全是文件数据,接收即可,直到文件全部接收完成,在将其设为false

文件数据接收的代码流程这样子:

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

 实现代码如下:

void FileManager::fileDataRead()
{
    qint64 readBytes = m_tcpSocket->bytesAvailable();
    if(readBytes bytesReceived fileSize) {
        // 返回等待读取的传入字节数
        QByteArray data = m_tcpSocket->read(readBytes);
        myFile->bytesReceived+=readBytes;
        ui->textBrowser->append(QString("接收进度:%1/%2(字节)").arg(myFile->bytesReceived).arg(myFile->fileSize));
        progress =static_cast(myFile->bytesReceived*100/myFile->fileSize);
        myFile->progressByte = myFile->bytesReceived;
        myFile->progressStr = QString("%1").arg(progress);
        ui->progressBar->setValue(progress);
        myFile->localFile.write(data);
    }
    // 接收数据完成时
    if (myFile->bytesReceived==myFile->fileSize){
        ui->textBrowser->append(tr("接收文件[%1]成功!").arg(myFile->fileName));
        progress = 100;
        myFile->localFile.close();
        ui->textBrowser->append(QString("接收进度:%1/%2(字节)").arg(myFile->bytesReceived).arg(myFile->fileSize));
        myFile->progressByte = myFile->bytesReceived;
        ui->progressBar->setValue(progress);
        isDownloading = false;
        myFile->initReadData();
    }
    if (myFile->bytesReceived > myFile->fileSize){
        qDebug()
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]