【QT学习】13.使用TCP实现文件传输

embedded/2024/10/22 8:00:20/

一。传输文件流程

二。实现

结果:

1. server

server类属性

    Ui::Widget *ui;QTcpServer* pTcpServer;QTcpSocket* pTcpSocket;//文件与文件信息QFile file;QString m_fileName;qint64 m_fileSize;  //整个文件大小qint64 fileSize;    //当前已经发送的文件大小bool isHead;

文件传递

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("服务器,文件接收端,port:6666");ui->progressBar->setValue(0);isHead=true;    //接受文件的标识//1创建socketpTcpServer=new QTcpServer(this);//2监听--》udp这里是绑定,ip与portpTcpServer->listen(QHostAddress::Any,6666);fileSize=0;//3等待客户端连接connect(pTcpServer,&QTcpServer::newConnection,[=](){pTcpSocket=pTcpServer->nextPendingConnection();QString ip=pTcpSocket->peerAddress().toString();quint16 port=pTcpSocket->peerPort();QString str=QString("客户端连接服务器成功IP:%1 Port:%2").arg(ip).arg(port);ui->textEdit->setText(str);//4接受数据connect(pTcpSocket,&QTcpSocket::readyRead,[=](){QByteArray buff;buff=pTcpSocket->readAll();if(isHead){//接受文件信息--》创建文件isHead=false;m_fileName=QString(buff).section("--",0,0);m_fileSize=QString(buff).section("--",1,1).toInt();ui->textEdit->append(buff);QString tmp=QString("文件名:%1 文件大小:%2").arg(m_fileName).arg(m_fileSize);ui->textEdit->append(tmp);file.setFileName(m_fileName);bool is=file.open(QIODevice::WriteOnly);if(is){qDebug()<<"创建文件成功";}else{qDebug()<<"创建文件失败";}}else{//接受文件内容qint64 r=file.write(buff);fileSize+=r;//设置进度条ui->progressBar->setValue(100*fileSize/m_fileSize);if(fileSize>=m_fileSize){file.close();QMessageBox::information(this,"文件接受","文件接受完成");pTcpSocket->disconnect();pTcpSocket->close();}}});});}

2. client

    Ui::Form *ui;QTcpSocket* pTcpSocket;QFile file;QString m_fileName; //文件名qint64 m_fileSize;  //文件大小qint64 fileSize;    //当前已经发送文件大小QTimer timer;       //定时器//发送文件内容void sendData();

1实现client

Form::Form(QWidget *parent) :QWidget(parent),ui(new Ui::Form)
{ui->setupUi(this);setWindowTitle("客户端 文件发送端");//1创建socketpTcpSocket=new QTcpSocket(this);//设置两个按钮不可按下--》不可发送,不可打开文件ui->pushButtonSend->setEnabled(false);ui->pushButtonOpen->setEnabled(false);//2监听connect(pTcpSocket,&QTcpSocket::connected,[=](){ui->textEdit->setText("连接服务器成功");ui->pushButtonOpen->setEnabled(true);});//文件信息发送后,再发送文件内容(定时器)connect(&timer,&QTimer::timeout,[=](){timer.stop();//关掉ui->textEdit->append("开始发送数据");sendData();});
}
void Form::sendData(){qint64 r=0;char buff[1024];while(1){r = file.read(buff,1024);//从文件中读取if(r<=0) break;r = pTcpSocket->write(buff,r);//发给接收端if(r <=0 ) break;fileSize += r;//累加已经发送的文件大小}qDebug()<<"文件传递成功";
}

tcp连接

void Form::on_pushButtonConnect_clicked()
{QString ip=ui->lineEditIP->text();quint16 port=ui->lineEditPORT->text().toUInt();pTcpSocket->connectToHost(ip,port);
}

打开文件

void Form::on_pushButtonOpen_clicked()
{QString fileName=QFileDialog::getOpenFileName(this,"打开发送文件","C:/Users/Administrator/Desktop","TXT(*.txt);;""DOC(*.doc,*.doxc);;""MP4(*.mp4);;""ALL(*.*)");if(!fileName.isEmpty()){m_fileName.clear();m_fileSize=0;fileSize=0;//文件信息QFileInfo info(fileName);m_fileName=info.fileName();m_fileSize=info.size();QString str=QString("文件名%1 文件大小%2").arg(m_fileName).arg(m_fileSize);ui->textEdit->append(str);//打开文件file.setFileName(fileName);//注意用带路径的文件名bool is=file.open(QIODevice::ReadOnly);if(is){ui->textEdit->append("准备发送文件路径");ui->textEdit->append(fileName);ui->pushButtonSend->setEnabled(true);ui->pushButtonOpen->setEnabled(false);}else{qDebug()<<"打开文件失败";}}else{qDebug()<<"获取文件失败";}
}

发送文件消息触发

void Form::on_pushButtonSend_clicked()
{QString fileHead=QString("%1--%2").arg(m_fileName).arg(m_fileSize);qint64 ret=pTcpSocket->write(fileHead.toUtf8());if(ret>0){qDebug()<<"文件发送信息成功";timer.start(20);//定时器20ms发送}else{qDebug()<<"发送文件信息失败";file.close();ui->pushButtonSend->setEnabled(false);ui->pushButtonOpen->setEnabled(true);}
}


http://www.ppmy.cn/embedded/30666.html

相关文章

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color&#xff1a;设置文本颜色。 8.font-family&#xff1a;设置字体系列。 9.font-size&#xff1a;设置字体大小。…

真机无需root实现抓包的两种方式之一小黄鸟篇

最新买了一部vivo Y30手机(V2034,android版本10,内存8G,存储128G)。 pc环境:win10,python3.8.10。 目的:实现vivo Y30上浏览器以及各类APP的https抓包。 众所周知,在Andorid7(含)以上系统内抓包,需要root环境,将https证书从用户证书转移到系统证书中来,在没有…

高德地图在vue3项目中使用:实现画矢量图、编辑矢量图

使用高德地图实现画多边形、矩形、圆&#xff0c;并进行编辑保存和回显。 1、准备工作 参考高德地图官网&#xff0c;进行项目key申请&#xff0c;链接: 准备 2、项目安装依赖 npm i amap/amap-jsapi-loader --save3、地图容器 html <template><!-- 绘制地图区域…

课程35:Docker容器:Windows Containers与Linux Containers区别

这里写目录标题 🚀前言一、Windows Containers与Linux Containers区别二、基于Linux本地Docker调试2.1 添加Docker支持2.2 Windows与Linux本地Docker调试的区别2.2.1 对比不同目标OS2.2.2 Dockerfile区别2.2.3 项目文件2.3 总结三、Windows下基于Linux Containers部署3.1 发布…

快讯! MySQL 8.4.0 LTS 发布(MySQL 第一个长期支持版本)

MySQL 第一个长期支持版本 8.4.0 LTS 发布&#xff0c;社区版下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 功能变更 添加或更改的功能 组复制&#xff1a;与组复制相关的两个服务器系统变量的默认值已更改&#xff1a; 系统变量的默认值为 group_replication…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;它通过把Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂…

【JAVA基础之反射】反射详解

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 1.反射 1.1 概述 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它…

24.什么是跨域?解决方案有哪些?

为什么会出现跨域问题 存在浏览器同源策略&#xff0c;所以才会有跨域问题。那么浏览器是出于何种原因会有跨域的限制呢。其实不难想到&#xff0c;跨域限制主要的目的就是为了用户的上网安全。 同源策略导致的跨域是浏览器单方面拒绝响应数据&#xff0c;服务器端是处理完毕…