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

2022-08-04 14:42:39

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

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

一、设计目标

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

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

二、效果展示

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

三、实现过程

Qt文件传输发送端

1. 连接服务器

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

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

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

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

UI布局

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

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布局

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

filerecv.h

#ifndef FILEREVQjDpCV_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, QIODevihttp://www.cppcns.comce::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();
  }
}

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