QT基于TCP实现文件传输系统
作者:Jason~shen
这篇文章主要为大家详细介绍了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 <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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。