本文实例为大家分享了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();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。