Qt:多线程TCP服务器客户端双向文件互传,Server端和Client端分离(带进度条)
创始人
2025-01-18 02:03:16
0

Client 界面:

Server 界面:

Server 操作:

输入端口号后,点击启动监听

Client 操作:

1.连接服务器

输入IP(服务器的IP地址)和端口号后,点击连接按钮,连接成功如下图所示:

2.向服务器发送文件

2.1 点击“选择本地文件”按钮,选择一个本地的文件。

2.2 点击“选择存储在服务器的目录”,选择发送的文件将要存储在服务器的哪个目录中。(此功能可直接在一台电脑上测试,当多台电脑的时候可以将目录改为服务器的实际目录地址)

2.3 点击“发送文件”按钮,即可开始向服务器传输文件,传输成功后客户端会有提示框。

3.下载服务器的文件(服务器向客户端发送文件)

3.1 点击“选择要下载的文件”按钮,选择想要下载的服务器下的文件(此功能可直接在一台电脑上测试,当多台电脑的时候可以将目录改为服务器的实际文件地址)。

3.2 点击“选择下载目录”按钮,选择下载文件的存储位置。

3.3 点击“下载文件”按钮,即可开始下载服务器的文件,下载成功后客户端会有提示框。

Server-Mainwindow核心代码

    //设置进度条     ui->progressBar->setRange(0,100);     ui->progressBar->setValue(0);       QWidget *progressWidget = new QWidget(this);     progressWidget->setLayout(new QHBoxLayout());     progressWidget->layout()->addWidget(ui->progressBar);      // 创建 QStatusBar     // 将小部件添加到 QStatusBar     ui->statusbar->addPermanentWidget(progressWidget);     // 设置主窗口的状态栏     setStatusBar(ui->statusbar);     ui->statusbar->setSizeGripEnabled(false);        //创建线程对象     QThread *thread = new QThread;     //创建任务对象     RecvFile *recvWork = new RecvFile;     //将任务对象移到子线程中     recvWork->moveToThread(thread);      connect(this,&MainWindow::startListen,recvWork,&RecvFile::startListen);     //更新进度条     connect(recvWork,&RecvFile::curPercent,ui->progressBar,&QProgressBar::setValue);       //启动线程     thread->start();

Server-receiver.cpp核心代码

void RecvFile::startListen(unsigned short port) {     qDebug()<listen(QHostAddress::Any,port);     connect(tcpServer,&QTcpServer::newConnection,[=]()     {         //取出建立好连接的套接字         tcpSocket = tcpServer->nextPendingConnection();          isStart = true;         connect(tcpSocket,&QTcpSocket::readyRead,this,&RecvFile::recvFile);         connect(tcpSocket,&QTcpSocket::disconnected,this,[=]()         {             //断开连接             tcpSocket->close();             tcpSocket->deleteLater();         });     }); }    void RecvFile:: recvFile() {     qDebug()<<"触发recvFile";     //取出接收的内容     QByteArray buf = tcpSocket->readAll();     if(true == isStart)//之前未接收文件的头部信息     {         //接收头部         qDebug()<<"接收头部===";         isStart = false;         //解析头部  buf的内容格式 <文件名>##<文件大小>         QString token=QString(buf).section("##",0,0);//token         qDebug()<<"token1="<0)         {             recvfilesize += len;//累计接收大小             int percent = ((recvfilesize)*100)/filesize;             //发出更新进度条的信号             //qDebug()<<"percent="<write(completionMessage);             tcpSocket->waitForBytesWritten(); // 等待数据写入完毕         }         else{             qDebug()<<"recvfilesize != filesize";             //isStart = true;         }     } }  void RecvFile::sendDownloadFile(QString path,QString targetDir)//发送头 {     timer = new QTimer(this);     connect(timer,&QTimer::timeout,[=]()     {         //关闭定时器         timer->stop();         //发送文件数据         sendDownloadFileData();     });      file.setFileName(path);     //获取文件信息     QFileInfo info(path);     filesize = info.size();//获取文件大小     filename = info.fileName();//获取文件名     //============================================Token==================================================================     QString token="197%*FILE*%197";     //============================================Token==================================================================     //只读方式打开文件     bool isOk = file.open(QIODevice::ReadOnly);     if(true == isOk)     {         //创建文件头信息         QString head = QString("%1##%2##%3##%4").arg(token).arg(filename).arg(filesize).arg(targetDir);         //创建文件头信息,格式为"文件名##文件大小",例如 "example.txt##1024"         //发送头部信息         qint64 len = tcpSocket->write(head.toUtf8());         if(len>0)//发送成功         {             //防止tcp黏包问题,延时20ms             timer->start(20);         }         else         {             //发送失败             file.close();         }     }     else     {         QMessageBox::warning(nullptr,"错位","打开文件失败!");         return;     } }  

相关内容

热门资讯

每日必看推荐!微信小程序雀神辅... 每日必看推荐!微信小程序雀神辅助器(辅助挂)一贯是真的有辅助工具(有挂详情)1、很好的工具软件,可以...
最新技巧!陕西辅助(辅助挂)一... 最新技巧!陕西辅助(辅助挂)一直是真的有辅助工具(有挂秘诀)陕西辅助是不是有人用挂微扑克wpk插件教...
据玩家消息!决战平安京辅助软件... 据玩家消息!决战平安京辅助软件(辅助挂)总是是有辅助插件(有挂技术)1、决战平安京辅助软件脚本辅助下...
围绕透视问题!陕麻圈延安辅助(... 围绕透视问题!陕麻圈延安辅助(辅助挂)总是确实有辅助技巧(有挂规律);1、完成陕麻圈延安辅助辅助器v...
研究成果!潘潘讲故事app有挂... 研究成果!潘潘讲故事app有挂吗(辅助挂)好像存在有辅助方法(有挂神器)1、很好的工具软件,可以解锁...
截至发稿!微信小程序多乐辅助下... 截至发稿!微信小程序多乐辅助下载(辅助挂)确实存在有辅助器(有挂分析)微信小程序多乐辅助下载辅助器是...
必备攻略!赣湘互娱挂(辅助挂)... 必备攻略!赣湘互娱挂(辅助挂)好像确实有辅助攻略(发现有挂)1、用户打开应用后不用登录就可以直接使用...
目前来看!广西微乐小程序微信辅... 目前来看!广西微乐小程序微信辅助器免费(辅助挂)果然是有辅助插件(有挂教学)1、让任何用户在无需广西...
盘点几款!新超凡软件辅助(辅助... 盘点几款!新超凡软件辅助(辅助挂)果然真的有辅助技巧(真的有挂)1、每一步都需要思考,不同水平的挑战...
揭秘攻略!方片十三张外挂(辅助... 揭秘攻略!方片十三张外挂(辅助挂)真是是有辅助挂(确实有挂)1、方片十三张外挂免费脚本咨询教程、方片...