广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >QT基于TCP实现文件传输系统
  • 597
分享到

QT基于TCP实现文件传输系统

QTTCP文件传输QT文件传输系统QT传输系统 2022-11-13 14:11:28 597人浏览 八月长安
摘要

本文实例为大家分享了Qt基于tcp实现文件传输系统的具体代码,供大家参考,具体内容如下 一、设计目标 1、发送端选择要传输的文件,进度条显示传输的进度,手动输入要传输的ip地址和端口

本文实例为大家分享了Qt基于tcp实现文件传输系统的具体代码,供大家参考,具体内容如下

一、设计目标

1、发送端选择要传输的文件,进度条显示传输的进度,手动输入要传输的ip地址和端口号

2、接收到数据后显示接收进度,接收完毕后进度条自动消失

二、效果展示

三、实现过程

Qt文件传输发送端

1. 连接服务器

2. 当连接成功后会发送connected信号

3. 在槽函数中发送文件头信息

4. 当数据发送成功后会发送bytesWritten

5. 在槽函数中发送文件内容

UI布局

filesend.h

class FileSend : public QWidget
{
    Q_OBJECT
 
public:
    explicit FileSend(QWidget *parent = nullptr);
    ~FileSend();
private slots:
    void on_selectBt_clicked();
    void on_sendBt_clicked();
    void send_file_head();
    void send_file_text();
private:
    Ui::FileSend *ui;
    QTcpSocket msocket;
    QFile file;
    QString filename;
    quint64 filesize;
    quint64 sendsize;
};

filesend.cpp

#include "filesend.h"
#include "ui_filesend.h"
#include <QFileDialog>
#include <QFileInfo>
#include <QDataStream>
 
FileSend::FileSend(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FileSend)
{
    ui->setupUi(this);
    //当客户端连接成功会发送connected信号, 当客户端掉线会发送disconnected信号
    connect(&msocket, &QTcpSocket::connected, this, &FileSend::send_file_head);
 
    //当套接字发送完毕会发送一个信号bytesWritten
    connect(&msocket, &QTcpSocket::bytesWritten, this, &FileSend::send_file_text);
 
}
 
FileSend::~FileSend()
{
    delete ui;
}
 
void FileSend::on_selectBt_clicked()
{
    //通过文件对话框获取文件路径
    QString filepath = QFileDialog::getOpenFileName(this);
    ui->fileEdit->setText(filepath);
}
 
void FileSend::on_sendBt_clicked()
{
    //连接服务器
    msocket.connectToHost(ui->ipedit->text(), ui->portedit->text().toUShort());
 
    //发送文件信息
    qDebug()<<"connect";
 
    //初始化
    filesize = 0;
    sendsize = 0;
}
 
//发送文件头信息
void FileSend::send_file_head()
{
    //发送文件名,文件大小
    QFileInfo info(ui->fileEdit->text());//文件信息对象
    filename = info.fileName();
    filesize = info.size();
 
    QByteArray array; //空间
    //把array与数据流绑定
    QDataStream stream(&array, QioDevice::WriteOnly);
    stream<<filesize<<filename;
 
    //设置进度条最大值
    ui->progressBar->setMaximum(filesize);
 
    //打开文件准备读取数据发送
    file.setFileName(ui->fileEdit->text());
    file.open(QIODevice::ReadOnly);
 
    //发送
    msocket.write(array);
}
 
void FileSend::send_file_text()
{
    if(sendsize < filesize)
    {
        QByteArray array = file.read(1024*10);//读取一段内容
        msocket.write(array);//发送一段内容
        sendsize += array.size();
        //设置进度条
        ui->progressBar->setValue(sendsize);
    }
    if(sendsize == filesize)
    {
        file.close();//关闭文件
    }
}

Qt文件传输接收端

1.创建服务器, 监听,当有客户端连接的时候发送newConnection信号,

2.在槽函数中创建与客户端通信的套接字QTcpSocket

3.当客户端发送数据是QTcpSocket对象会发送readyRead信号

4.在槽函数中读取数据

根据文件大小判断是否是第一次读取数据filesize==0

UI布局

filerecv.h

#ifndef FILERECV_H
#define FILERECV_H
 
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>
 
namespace Ui {
class FileRecv;
}
 
class FileRecv : public QWidget
{
    Q_OBJECT
 
public:
    explicit FileRecv(QWidget *parent = nullptr);
    ~FileRecv();
protected slots:
    void read_data();
    void new_client();
private:
    Ui::FileRecv *ui;
    QTcpServer mserver;
    QFile file;
    QString filename;
    quint64 filesize;
    quint64 recvsize;
};
 
#endif // FILERECV_H
#include "filerecv.h"
#include "ui_filerecv.h"
#include <QDataStream>
FileRecv::FileRecv(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FileRecv)
{
    ui->setupUi(this);
    //关联客户端连接信号
    connect(&mserver, &QTcpServer::newConnection, this, &FileRecv::new_client);
    //启动服务器
    mserver.listen(QHostAddress::Any,8080);
}
 
FileRecv::~FileRecv()
{
    delete ui;
}
void FileRecv::new_client()
{
    //创建与客户端通信的套接字
    QTcpSocket *msocket = mserver.nextPendinGConnection();
    //关联读数据信号readyRead
    connect(msocket, &QTcpSocket::readyRead, this, &FileRecv::read_data);
    filesize = 0;
    recvsize = 0;
}
 
void FileRecv::read_data()
{
    QTcpSocket *msocket = dynamic_cast<QTcpSocket*>(sender());
    if(filesize == 0) //表达第一次读取数据--读文件信息
    {
        QByteArray array = msocket->readAll();
        QDataStream stream(&array, QIODevice::ReadOnly);//把套接字与数据流绑定
        stream>>filesize>>filename;//获取文件大小, 文件名
 
        //设置进度条最大值
        ui->progressBar->setMaximum(filesize);
 
        //打开文件
        file.setFileName(filename);
        file.open(QIODevice::WriteOnly);
 
        //显示进度条
        this->show();
    }
 
    //读文件内容
    if(recvsize <  filesize)
    {
        //读取一段写一段
        QByteArray array = msocket->readAll();
        file.write(array);
        recvsize += array.size();
        //更新进度条
        ui->progressBar->setValue(recvsize);
    }
 
    if(recvsize == filesize)
    {
        //读完,关闭文件
        file.close();
        //关闭套接字
        msocket->disconnectFromHost();
        //隐藏进度条
        this->hide();
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: QT基于TCP实现文件传输系统

本文链接: https://www.lsjlt.com/news/171784.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • QT基于TCP实现文件传输系统
    本文实例为大家分享了QT基于TCP实现文件传输系统的具体代码,供大家参考,具体内容如下 一、设计目标 1、发送端选择要传输的文件,进度条显示传输的进度,手动输入要传输的ip地址和端口...
    99+
    2022-11-13
    QT TCP文件传输 QT文件传输系统 QT传输系统
  • 基于QT制作一个简易的传输文件小工具
    最近因为一个事情很恼火,因为办公需要用到企业微信,但是企业微信只能在一个电脑上登陆,所以当别人发文件给你的时候,你只能一个电脑接收,创建共享文件夹也很麻烦,每次都需要去访问,很麻烦。...
    99+
    2022-11-12
  • python用tcp实现局域网内文件传输
    功能: 可以利用python创建的TCP客户端从我们自己搭建的TCP服务器上下载文件. 实现需求: 安装socket模块 简单了解sokcet模块用法 服务器代码如下: import socket def file_d...
    99+
    2023-01-31
    文件传输 网内 python
  • Python 基于TCP 传输协议的网络通信实现方法
    目录1、基础概念1.1 协议1.2 IP 地址1.3 端口2、TCP 网络编程实现2.1 服务器端编程2.2 客户端编程3 总结1、基础概念 什么是网络编程? 指在网络环境中,如何实...
    99+
    2022-11-13
  • 基于Python实现文件大小输出
    在数据库中存储时,使用 Bytes 更精确,可扩展性和灵活性都很高。 输出时,需要做一些适配。 1. 注意事项与测试代码 1.需要考虑 sizeInBytes 为 None 的场景。 2.除以 1024...
    99+
    2022-06-04
    文件大小 Python
  • 基于Spring实现文件上传功能
    本小节你将建立一个可以接受HTTP multi-part 文件的服务。你将建立一个后台服务来接收文件以及前台页面来上传文件。要利用servlet容器上传文件,你要注册一个MultipartConfigElement类,以往需要在web.xm...
    99+
    2023-05-31
    spring 文件上传 实现文件
  • Java基于BIO实现文件上传功能
    本文实例为大家分享了Java基于BIO实现文件上传功能的具体代码,供大家参考,具体内容如下 客户端 package com.qst.file; import java.io.B...
    99+
    2022-11-12
  • Android基于OkHttp实现文件上传功能
    本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下 一、相关概述 Android请求访问服务端大多数情况下依旧是使用http协议,故而...
    99+
    2022-11-13
  • 基于标准http实现Android多文件上传
    实现多文件的上传,基于标准的http来实现。 1.多文件上传MyUploader类的实现: public class MyUploader { private sta...
    99+
    2022-06-06
    HTTP 文件上传 Android
  • 基于ajax的html如何实现文件上传
    这篇文章主要介绍基于ajax的html如何实现文件上传,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 怎样自定义样式?1)、只管按照自己喜欢看到的样式去定义即可,如<a h...
    99+
    2022-10-19
  • 基于Vue3文件拖拽上传功能实现
    文件上成功能在我们的身边经常遇到,下面小编通过实例代码给大家分享实现方法,效果图如下所示: <template> <div :class="['drag'...
    99+
    2022-11-13
    vue3拖拽上传 vue文件拖拽上传
  • 基于SpringBoot上传任意文件功能的实现
    一、pom文件依赖的添加<dependencies> <dependency> <groupId>org.springframework.boot</groupId> ...
    99+
    2023-05-31
    springboot 上传 任意文件
  • 基于nodejs+express(4.x+)实现文件上传功能
    Nodejs是一个年轻的编程框架,充满了活力和无限激情,一直都在保持着快速更新。基于Nodejs的官方Web开发库Express也在同步发展着,每年升级一个大版本,甚至对框架底层都做了大手术。在Expres...
    99+
    2022-06-04
    文件上传 功能 nodejs
  • Java基于BIO怎么实现文件上传功能
    这篇文章给大家介绍Java基于BIO怎么实现文件上传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。客户端package com.qst.file;import java.io.BufferedI...
    99+
    2023-06-21
  • 基于服务端怎么实现OSS文件直传
    这篇文章主要介绍“基于服务端怎么实现OSS文件直传”,在日常操作中,相信很多人在基于服务端怎么实现OSS文件直传问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于服务端怎么实现OSS文件直传”的疑惑有所帮助!...
    99+
    2023-07-02
  • 基于Qt实现驾校科目考试系统的示例代码
    目录1.设置登录界面  2.登录功能实现2.1验证邮箱地址2.2账号密码登录 2.3密码隐藏 3.考试界面开发 3.1考试用时3.2题目布局&...
    99+
    2022-11-13
  • 基于HTML5+js+Java实现单文件文件上传到服务器功能
    上传单文件到服务器                  &nb...
    99+
    2023-05-31
    js java 上传
  • 基于HTML5 Ajax文件上传进度条的实现方法
    这篇文章主要介绍“基于HTML5 Ajax文件上传进度条的实现方法”,在日常操作中,相信很多人在基于HTML5 Ajax文件上传进度条的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-10-19
  • 基于gitee如何实现上传下载文件的功能
    本文小编为大家详细介绍“基于gitee如何实现上传下载文件的功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于gitee如何实现上传下载文件的功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方案的选择文件...
    99+
    2023-07-05
  • 如何使用Go语言开发基于Websocket的实时数据传输系统
    如何使用Go语言开发基于Websocket的实时数据传输系统,需要具体代码示例Websocket是一种全双工协议,它可以在不刷新页面的情况下实现实时数据传输。在现代Web应用程序中,实时数据传输是至关重要的一部分。本文将介绍如何使用Go语言...
    99+
    2023-12-18
    Go语言 websocket 实时数据传输
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作