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

一。传输文件流程

二。实现

结果:

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.hqwc.cn/news/659814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巅峰之战·成长之美丨 纷享销客中南战区伙伴同行者大会圆满成功

近日&#xff0c;为期2天的纷享销客中南战区伙伴同行者大会在北京成功举行&#xff0c;从全国各地奔赴而来的渠道伙伴共襄盛举。大会以”巅峰之战成长之美“为主题&#xff0c;共同探讨”双向奔赴 、健康经营、赢盈共进“的发展之道。 一、数智赋能&#xff0c;任重道远 纷享销…

第三方软件测试机构的优势

软件测试机构在软件开发和验收过程中扮演着至关重要的角色&#xff0c;其优势主要体现在以下几个方面&#xff1a; 专业性&#xff1a;软件测试机构通常拥有专业的测试团队&#xff0c;这些团队成员具备丰富的测试经验和深厚的专业知识&#xff0c;能够准确识别软件中的潜在问…

新唐的nuc980/nuc972的开发1-环境和源码同步

开发环境安装 1.1更新源 服务器端&#xff1a;可以参考&#xff1a;Linux替换清华源_更改清华源-CSDN博客 下面是桌面端的方法&#xff1a; 打开系统的软件中心&#xff0c;选择自己想要使用的源 更新缓存 1.2安装必须的库 apt-get install patch apt-get install libc6-dev …

微信机器人openai免注册信用卡生成api

简介 chatgpt-on-wechat (cow) 项目是使用 ChatGPT 搭建的智能聊天机器人&#xff0c;在GPT3.5/4.0 API 及 itchat框架的基础上实现&#xff0c;支持微信公众号、企业微信、钉钉、飞书部署&#xff0c;能生成文本、语音和图片&#xff0c;访问操作系统和互联网。 最新版本支持…

【Qt之·控件·样式表】

系列文章目录 文章目录 前言一、Qt样式表的基础知识1.1 Qt样式表的定义和语法规则1.2 Qt样式表中的选择器和属性1.2.1 盒子模型1.2.2 border 1.3 Qt样式表中的伪类和伪元素 二、编写基本的Qt样式表2.1 在Qt应用程序中引入样式表文件的方式2.2 设置基本的背景色、字体样式等 三、…

大数据中的项目数据采集

Datax介绍 官网&#xff1a; DataX/introduction.md at master alibaba/DataX GitHub DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。 DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS…

源码篇--Nacos服务--中章(8):Nacos服务端感知客户端实例变更-3

文章目录 前言一、客户端实例变更&#xff1a;二、实例变更感知&#xff1a;2.1 实例注册信息通知&#xff1a;2.1.1 接收DistroDataRequest 请求&#xff1a;2.1.2 onReceive 处理请求&#xff1a;2.1.3 processData 处理请求&#xff1a;2.1.4 handlerClientSyncData 处理数据…

数据库分库分表

数据库分库分表 分库分表到底是什么 分库分表其实是分库,分表,分库分表的总称 分库 将数据按照一定规则存储到不同的数据库中,每个数据库存储一部分数据 分库主要解决的是并发量过大的问题&#xff0c;并发量一旦上升&#xff0c;那么数据库就可能成为系统的瓶颈&#xff…

Vulnhub-DIGITALWORLD.LOCAL: VENGEANCE渗透

文章目录 前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、smb下载线索三、制作字典四、爆破压缩包密码五、线索分析六、提权&#xff01;&#xff01;&#xff01; Vulnhub靶机&#xff1a;DIGITALWORLD.LOCAL: VENGEANCE ( digitalworld.local: VENGEANCE …

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多&#xff0c;浏览他们最喜欢的网站&#xff0c;点击电子邮件链接&#xff0c;或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用&#xff0c;但也会使组织面临一系列安全和业务风险&#…

[华为OD] C卷 货运 老李是货运公司承运人,老李的货车额定载货重量为Wt 100

题目&#xff1a; 老李是货运公司承运人&#xff0c;老李的货车额定载货重量为Wt。现有两种货物、货物A单件重量为 wa,单件运费利为pa,货物B单件重量为wb,单件运费利润为pb•老李每次发车时载货总 重量刚好为货车额定的载货重量wt,车上必须同时有货物A和货物B,货物A、B不可…

表格中斜线的处理

此处的斜线,不是用表格写的,但是也适用于表格,只是需要更改表格的样式,可以 按照如下处理,即可 呈现的效果:如图所示 template部分: <div class"header_detail custom"><div class"right">节次</div><div class"left">…