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

这篇文章主要为大家详细介绍了QT基于TCP实现文件传输系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

以上就是QT基于TCP实现文件传输系统的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言