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

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

一、设计目标

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

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

二、效果展示

QT基于TCP实现文件传输系统_第1张图片

三、实现过程

Qt文件传输发送端

1. 连接服务器

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

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

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

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

UI布局

QT基于TCP实现文件传输系统_第2张图片

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 
#include 
#include 
 
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<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 
#include 
#include 
#include 
 
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 
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(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();
    }
}

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

你可能感兴趣的:(QT基于TCP实现文件传输系统)