文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-11-13 14:16

关注

本文实例为大家分享了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();
    }
}

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯