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

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

相关文章

结构4a1-13的分类规则汇总

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有6个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A的6张图片中共有3个点&#xff0c;B中有1个点.&#xff0c;测试集为二进制的0-63.收敛误差7e-4&#xff0c;比较分类准确率。 A B 0 0 0 0 0 …

【漏洞复现】某厂商明御WEB应用防火墙任意用户登录漏洞

Nx01 产品简介 安恒明御WEB应用防火墙&#xff08;简称WAF&#xff09;是杭州安恒信息技术股份有限公司自主研发的一款专业应用安全防护产品&#xff0c;专注于为网站、APP等Web业务系统提供安全防护。 Nx02 漏洞描述 安恒明御WEB应用防火墙report.php文件存在硬编码设置的Con…

【three.js】手把手带你理解制作一个3D场景 超级详细

我们主要目的是制作这样一个三维模型: 我们直接上代码,从代码中一点点解释模型是如何一步一步制作的。 // 引入three.js import * as THREE from three; /*** 创建3D场景对象Scene*/ const scene = new THREE.Scene();/*** 创建网格模型*/ //创建一个长方体几何对象Geometry…

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

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

用HTML5的<canvas>元素实现刮刮乐游戏

用HTML5的&#xff1c;canvas&#xff1e;元素实现刮刮乐游戏 用HTML5的<canvas>元素实现刮刮乐&#xff0c;要求&#xff1a;将上面的“图层”的图像可用鼠标刮去&#xff0c;露出下面的“图层”的图像。 示例从简单到复杂。 简单示例 准备两张图像&#xff0c;我这…

浮点数的比较以及abs和fabs的区别

『踩坑记录』浮点数的比较以及abs和fabs的区别 Chapter1 『踩坑记录』浮点数的比较以及abs和fabs的区别abs函数与fabs函数的区别相同点&#xff1a;不同点&#xff1a; Chapter2 浮点数为什么不能用 进行比较浮点数比较方法判定相等拓展&#xff1a; Chapter1 『踩坑记录』浮点…

FreeRtos Queue(四)

本篇主要分析xQueueReceive&#xff0c;从队列中读取消息&#xff0c;读消息也是在死循环里操作的&#xff0c;大致分为两个逻辑&#xff1a; 1、队列不为空的时候的处理 2、队列为空的时候的处理 一、队列不为空 先分析下从队列中读取消息这个函数 prvCopyDataFromQueue 队…

Java进阶-IO(1)

进入java IO部分的学习&#xff0c;首先学习IO基础&#xff0c;内容如下。需要了解流的概念、分类还有其他一些如集合与文件的转换&#xff0c;字符编码问题等&#xff0c;这次先学到字节流的读写数据&#xff0c;剩余下次学完。 一、IO基础 1、背景 1.1 数据存储问题 变量…

Linux 学习笔记(8)

八、 启动引导 1 、 Linux 的启动流程 1) BIOS 自检 2) 启动 GRUB/LILO 3) 运行 Linux kernel 并检测硬件 4) 挂载根文件系统 5) 运行 Linux 系统的第一个进程 init( 其 PID 永远为 1 &#xff0c;是所有其它进程的父进程 ) 6) init 读取系统引导配置文件…

WSL2外部网络设置

1 关闭所有WSL系统 wsl --shutdown 2 打开Hyper-V管理器 3 将“虚拟交换机管理器”-> ”WSL连接类型“设置为“外部网络” 4 启动WSL系统&#xff0c;手动修改WSL网络 将WSL网络IP修改为192.168.1.9 sudo ip addr del $(ip addr show eth0 | grep inet\b | awk {print $2} |…

LeetCode:2368. 受限条件下可到达节点的数目(dfs Java)

目录 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - …

以太网模块问题及优化

在使用以太网发送摄像头数据到PC端时&#xff0c;发现了之前编写以太网发送模块的两个小问题&#xff0c;对实际使用有一定的影响&#xff0c;本文将问题指出来并进行修正。 问题一&#xff1a;为了方便设计&#xff0c;工程直接把以太网发送模块的忙闲指示信号输出作为用户端口…