1. 效果
先看看效果图
- 这是传输文件完成的界面
- 客户端
- 服务端
2. 知识准备
其实文件传输和聊天室十分相似,只不过一个传输的是文字,一个传输的是文件,而这方面的知识,我已经在前面的博客写过了,不了解的同学可以去看一下
还有多线程相关的知识
2.1 关于多线程
这次是用多线程实现的文件传输系统,其中对客户端来说,子线程负责连接服务器,发送文件,主线程负责修改进度条,对服务端来说,也是用子线程来处理客户端的请求
2.2 关于文件传输
文件传输采用的是,对客户端,首先是发送出整个文件的大小,需要用到QFileInfo这个类,然后再发送文件
对服务端,先接收文件的大小,然后判断,当接收的文件大小等于第一次接收的文件大小时,停止接收,断开连接
3. 源代码
我在代码里面都有非常详细的注释,所以就直接放上代码啦
3.1 客户端
头文件 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void startConnect(unsigned short,QString);
// 发送文件信号
void sendFile(QString path);
private slots:
void on_connectServer_clicked();
void on_selFile_clicked();
void on_sendFile_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
源文件 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QThread>
#include "sendfile.h"
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设置IP和端口
ui->ip->setText("127.0.0.1");
ui->port->setText("8989");
// 设置进度条
ui->progressBar->setRange(0,100);
ui->progressBar->setValue(0);
// 客户端在子线程中连接服务器
// 创建线程对象
QThread* t = new QThread;
// 创建任务对象
SendFile* worker = new SendFile;
// 将worker移动到子线程t中
worker->moveToThread(t);
// 当发送sendFile信号,让worker的sendFile函数处理(子线程)
connect(this,&MainWindow::sendFile,worker,&SendFile::sendFile);
// 通过信号&#x