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.pswp.cn/news/713251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713251.shtml
英文地址,請注明出處:http://en.pswp.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)來操作下拉框元素打開下拉框。選擇選項:可以通過以下幾種方式選擇下拉框中的選項:根據索…