QT TCP传输文件+ui

TCPFile

tcp协议传输文件

在这里插入图片描述

TCPFile.pro

QT       += core gui network

clientwidget.h

#include <QWidget>
#include <QTcpSocket>  // 通信套接字
#include <QFile>private slots:void on_pushButton_clicked();private:QTcpSocket *tcpSocket;QFile file; // 文件对象QString fileName; // 文件名字qint64 fileSize;  // 文件大小qint64 recvSize;  // 已经接收文件的大小bool isStart;  // 标志位

widget.h

#include <QTcpServer>  // 监听套接字
#include <QTcpSocket>  // 通信套接字
#include <QFile>
#include <QTimer>public:void sendData(); // 发送文件数据private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:QTcpServer *tcpServer;QTcpSocket *tcpSocket;QFile file; // 文件对象QString fileName; // 文件名字qint64 fileSize;  // 文件大小qint64 sendSize;  // 已经发送文件的大小QTimer timer;  // 定时器

clientwidget.cpp


#include <QDebug>
#include <QMessageBox>
#include <QHostAddress>Clientwidget::Clientwidget(QWidget *parent) :QWidget(parent),ui(new Ui::Clientwidget)
{ui->setupUi(this);isStart = true;tcpSocket = NULL;// 分配空间,指定父对象tcpSocket = new QTcpSocket(this);setWindowTitle("客户端");// 进度条ui->progressBar->setValue(0);  //  当前值connect(tcpSocket, &QTcpSocket::readyRead, [=](){// 取出接收内容QByteArray buf = tcpSocket->readAll();if(true == isStart){ // 接收头信息isStart = false;// 解析头部信息 举例:// QString str = "hello##1024";// str.section("##", 0, 0);// 初始化fileName = QString(buf).section("##", 0, 0);fileSize = QString(buf).section("##", 1, 1).toInt();recvSize = 0;// 打开文件file.setFileName(fileName);bool isOK = file.open(QIODevice::WriteOnly);if (false == isOK){qDebug() << "WriteOnly error";}// 设置进度条ui->progressBar->setMinimum(0); // 最小值ui->progressBar->setMaximum(fileSize/1024); // 最大值ui->progressBar->setValue(0);  //  当前值}else { // 文件信息qint64 len = file.write(buf);if(len > 0){  // 接收数据大于0recvSize += len;  // 累加接收大小qDebug() << len;}ui->progressBar->setValue(recvSize/1024);  // 更新进度条if(recvSize == fileSize){  // 文件接收完毕file.close();QMessageBox::information(this, "完成", "文件接收完成");// 给服务器发送 接收文件完成的信息tcpSocket->write("file done");tcpSocket->disconnectFromHost();tcpSocket->close();}}});}void Clientwidget::on_pushButton_clicked()
{// 获取服务器ip和端口QString ip = ui->lineEdit->text();quint16 port = ui->lineEdit_2->text().toInt();// 主动和服务器建立连接tcpSocket->connectToHost(QHostAddress(ip), port);
}

widget.cpp


#include <QFileDialog>
#include <QDebug>
#include <QFileInfo>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);// 监听套接字tcpServer = new QTcpServer(this);// 监听tcpServer->listen(QHostAddress::AnyIPv4, 8888);setWindowTitle("服务器 端口8888");// 一开始两个按钮都不能按 需要建立连接后才可以按下ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);// 如果客户端成功和服务器连接// tcpServer 会自动触发 newConnection()connect(tcpServer, &QTcpServer::newConnection, [=](){// 取出建立好连接的套接字tcpSocket = tcpServer->nextPendingConnection();// 获取对方的ip和端口QString ip = tcpSocket->peerAddress().toString();quint16 port = tcpSocket->peerPort();// qDebug() << port;QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);ui->textEdit->setText(temp);  // 显示到编辑区// 成功建立连接后,才可以按钮 选择文件ui->pushButton->setEnabled(true);connect(tcpSocket, &QTcpSocket::readyRead, [=](){// 取客户端的信息QByteArray buf = tcpSocket->readAll();if(QString(buf) == "file done") // 文件接收完毕{ui->textEdit->append("客户端反馈:文件发送完毕!!");file.close();tcpSocket->disconnectFromHost();tcpSocket->close();}});});connect(&timer,&QTimer::timeout,[=](){// 关闭定时器timer.stop();// 发送文件sendData();});}Widget::~Widget()
{delete ui;
}void Widget::sendData()
{qint64  len = 0;do{// 每次发送数据的大小char buf[4*1024] = {0};len  = 0;// 往文件中读数据len = file.read(buf, sizeof(buf));//发送数据,读多少,发多少len = tcpSocket->write(buf,len);// 发送的数据需要累加sendSize += len;}while (len > 0) ;// 是否发送文件完毕if(sendSize == fileSize){ui->textEdit->append("文件已发送");file.close();// 把客户端断开// tcpSocket->disconnectFromHost();// tcpSocket->close();ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(false);}
}// 选择文件按钮
void Widget::on_pushButton_clicked()
{QString filePath = QFileDialog::getOpenFileName(this, "open", "../");if(false == filePath.isEmpty())   // 如果选择文件路径有效{fileName.clear();fileSize = 0;// 获取文件信息QFileInfo info(filePath);fileName = info.fileName(); // 获取文件名字fileSize = info.size(); // 获取文件大小sendSize = 0; // 发送文件的大小// 只读方式打开文件// 指定文件的名字file.setFileName(filePath);// 打开文件bool isOK = file.open(QIODevice::ReadOnly);if(false == isOK){qDebug() << "只读方式打开文件失败";}// 提示打开文件的路径ui->textEdit->append(filePath);ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(true);}else{qDebug() << "选择文件路径出错";}
}// 发送文件按钮
void Widget::on_pushButton_2_clicked()
{// 先发送文件头信息  文件名##文件大小QString head = QString("%1##%2").arg(fileName).arg(fileSize);// 发送头部信息qint64  len = tcpSocket->write( head.toUtf8() );if(len > 0) {   // 头部信息发送成功// 发送真正的文件信息// 防止TCP黏包问题 需要通过定时器延时 20mstimer.start(20);}else {qDebug() << "头部信息发送失败";file.close();ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);}
}

clientwidget.ui

在这里插入图片描述

widget.ui

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713251.shtml

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

相关文章

selenium进阶设置

1、无头浏览设置和规避爬虫检测 问题一&#xff1a;有界面时可以展示的元素&#xff0c;无头模式报错element not interactable 解决方法&#xff1a;通过错误截图发现&#xff0c;页面上有该元素&#xff0c;但是页面不够大&#xff0c;没有显示想定位的元素。 from seleni…

centos7 安装 docker-compose

1、直接参考官方&#xff1a; Install Compose standalone | Docker Docs 1、安装命令 curl -SL https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 2、修改 docker-compose 执行权限 不修改执行权…

升级pycharm之后,jupyter无法识别新安装的包

import sys print(sys.executable)在jupyter中运行&#xff0c;检测一下当前jupyter内核运行在哪个环境中-再pycharm的setting里面设置jupyter环境并没有什么用。需要重新在想要使用的环境中重新安装jupyter内核&#xff0c;并且重启。

c# cad2016系统变量解释说明

一、cad系统变量设置和获取 /// <summary> /// 设置CAD系统变量 /// </summary> /// <param name"name">变量名</param> /// <param name"value">变量值</param> public static void SetSystemVariable(string name,…

Sora背后的技术原理:深度探索Video Compression Network与语言理解在视频生成中的应用

Sora背后的技术原理&#xff1a;深度探索Video Compression Network与语言理解在视频生成中的应用 摘要&#xff1a; 随着人工智能技术的飞速发展&#xff0c;视频生成技术逐渐成为研究热点。Sora作为一种先进的视频生成技术&#xff0c;其背后的技术原理值得深入研究。本文详…

物联网平台如何实现SaaS化

物联网平台实现SaaS化是一个复杂的过程&#xff0c;涉及到多个关键步骤和要素。以下是实现物联网平台SaaS化的主要步骤和要点&#xff0c;以及如何确保成功实施。 一、平台架构设计是实现SaaS化的基础 一个分布式、模块化的架构设计对于支持多租户、高并发、高可扩展性等特性…

【Django】执行查询—F()表达式

F() F()可以实现将模型字段值与同一模型中的另一字段做比较。举个例子看一下&#xff1a; class Entry(models.Model):...number_of_comments models.IntegerField(default0)number_of_pingbacks models.IntegerField(default0)...找到所有 number_of_pingbacks 大于 numbe…

大数据权限认证 Kerberos 部署

文章目录 1、什么是 Kerberos2、Kerberos 术语和原理2.1、Kerberos 术语2.1、Kerberos 原理 3、Kerberos 服务部署3.1、前置条件3.2、安装依赖3.3、配置 krb5.conf3.4、配置 kdc.conf3.5、配置 kadm5.acl3.6、安装 KDC 数据库3.7、启动服务3.8、创建 Kerberos 管理员3.9、创建普…

idea 手动打 jar 包

1.在 File 中找到并点击 Project Structure 2.按图中高亮的部分依次点击 3.在 Main Class 处设置要打包的类&#xff0c;记得在 Directory for ... 处设置目录为根目录&#xff0c;设置好以后点击两次 OK 回到首页 4.在页面上方找到 Build &#xff0c;点击 Build Artifacts...…

【Linux】在 Ubuntu 系统下使用 Screen 运行 Python 脚本

在 Ubuntu 系统下使用 Screen 运行 Python 脚本的优点 在 Ubuntu 操作系统中&#xff0c;Screen 是一种非常有用的工具&#xff0c;特别是在需要长时间运行的任务或者需要在后台运行的任务中。结合 Python 脚本&#xff0c;Screen 提供了一种灵活且高效的方式来管理和执行任务…

ECOVADIS评估-自2024年1月1日起发布的记分卡的资格标准说明

EcoVadis评分&#xff08;0-100分&#xff09;反映了进行评估时公司的企业社会责任管理体系的质量。EcoVadis奖牌和奖章计划旨在表彰按EcoVadis评估方法中所述&#xff0c;已完成EcoVadis评估流程并展示出相对强大的管理系统来解决企业社会责任标准的合格公司。奖牌和奖章的资格…

docker常用操作命令

常用的命令&#xff0c;详细的命令下方有具体介绍 docker ps 查看正在运行的容器 docker ps -a 查看全部容器 docker images 查看本地镜像 docker search [镜像名称] 查询镜像 docker run --name mynginx -d nginx:latest&#xff1a; 使用docker镜像nginx:latest以后台模…

在Windows系统上安装Docker和SteamCMD容器的详细指南有哪些?

在Windows系统上安装Docker和SteamCMD容器的详细指南有哪些&#xff1f; 安装Docker&#xff1a; 首先&#xff0c;需要在Windows操作系统上激活WSL2功能。这是因为Docker作为一个容器工具&#xff0c;依赖于已存在并运行的Linux内核环境。可以通过使用winget来安装Docker。具体…

排序(2)——希尔排序

希尔排序&#xff08;缩小增量排序&#xff09; 基本思想 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&…

Linux - 基本背景

1、linux发展史 1.1、UNIX发展历史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。1969&#xff0d;1970年&#xff0c;AT&T的贝尔实验室研究…

[SD] 安装使用stable diffusion webui

1.下载基础版本并解压&#xff1a; https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/download/v1.0.0-pre/sd.webui.zip 2.运行update.bat 这步的目的是升级到最新版本&#xff0c;并下载相应的依赖库。 这步可能会提示某些git仓库无法clone到本地&#…

[工具探索]-Gitlab的CI/CD操作

在 GitLab 中&#xff0c;CI&#xff08;持续集成&#xff09;是一项强大的功能&#xff0c;它允许你自动化构建、测试和部署你的代码。 在 GitLab CI/CD 中&#xff0c;.gitlab-ci.yml 文件是用于定义构建和部署流程的配置文件。它使用一种基于 YAML 的语法。 下面是一个简单…

dp——路径距离

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 01 62. 不同路径02 63. 不同路径 II03 64. 最小路径和04 72. 编辑距离05 120. 三角形最小路径和06 124. 二叉树中的最大路径和07 174. 地下城游戏08 514. 自由之路09 576. 出界的路径数10 931. 下降路径最小和11 13…

AcWing 1229. 日期问题 解题思路及代码

先贴个题目&#xff1a; 以及原题链接&#xff1a;1229. 日期问题 - AcWing题库https://www.acwing.com/problem/content/1231/ 这题其实和之前的回文日期相似&#xff0c;可以直接暴力枚举&#xff0c;然后得解&#xff0c;放个小片段&#xff1a; for (int date 19600101; …

UI自动化-(web端下拉选择框弹出框滚动条操作-实操入门)

1、下拉选择框操作 在 UI 自动化中,操作下拉选择框可以通过以下步骤进行: 定位下拉选择框元素:通过适当的元素定位方法,找到下拉选择框的元素。打开下拉框:例如通过点击(.click)来操作下拉框元素打开下拉框。选择选项:可以通过以下几种方式选择下拉框中的选项:根据索…