Qt实现基于多线程的文件传输(服务端,客户端)

这篇博客展示了如何使用Qt框架通过多线程实现文件的发送和接收,分别阐述了客户端和服务端的实现细节。客户端利用子线程连接服务器并发送文件,主线程更新进度条;服务端则在子线程中接收文件,直至文件大小与预期匹配。文章提供了源代码和详细注释。
摘要由CSDN通过智能技术生成

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
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值