Qt笔记(七十一)之QWebSocket传输多文件 进度条显示

104 篇文章 125 订阅

一.前言
楼主在之前的文章中讲述了传输文件的思路,但那只是单个文件的思路,实际使用中,会有传输多文件的需求,楼主就此做个记录分享

以往文章:
Qt笔记(七十)之QWebSocket传输文件 进度条显示

二.实现过程
1.思路:选择多个文件 记录文件个数 循环传输文件,需要注意的是,传输完一个文件后,可能需要给服务器一个缓冲时间去保存为上传的文件
2.代码实现,客户端代码,服务端不用动

void ClientWidget::on_pushButton_1_clicked()
{
    qDebug()<<"开始新连接";
    ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":开始连接");
    QString urlStr = QString("ws://%1").arg(ui->lineEdit->text());
    webSocket.open(QUrl(urlStr));
}

void ClientWidget::on_pushButton_2_clicked()
{
    webSocket.close();
}

void ClientWidget::on_pushButton_3_clicked()
{
    ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":给服务端发消息:"+ui->textEdit_1->toPlainText());
    QString msg = ui->textEdit_1->document()->toPlainText();
    webSocket.sendTextMessage(msg);
}

void ClientWidget::onConnected()
{
    ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":正确连接上了服务端");
}

void ClientWidget::onDisconnected()
{
    ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":断开连接");
}

void ClientWidget::onTextMessageReceived(QString msg)
{
    qDebug()<<msg;
    ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":服务端发来消息:"+msg);
}

void ClientWidget::on_pushButton_4_clicked()
{
    sendMutliFile();
    return;

    qDebug()<<"选择文件,并发送";
    QString sendFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择发送文件"),"C://","TEXT(*.txt)");
    if(sendFile.isEmpty())
        return;

    // 先发送文件名,可以先裁剪剩下文件名,楼主为了方便,直接发送文件路径
    webSocket.sendTextMessage("send_file_name:"+sendFile);

    // 开始读取文件内容
    QFile file(sendFile);
    if(!file.open(QIODevice::ReadOnly))
        return;


    // 发送文件传输开始标志
    webSocket.sendTextMessage("send_start");

    // 读取文件
    QByteArray data = file.readAll();

    // 设置进度条属性
    int MAX_BYTE=20;   // 定义一次传输最大字节
    ui->progressBar->setMinimum(0);
    ui->progressBar->setMaximum(data.length()%MAX_BYTE==0?data.length()/MAX_BYTE:data.length()/MAX_BYTE+1);
    ui->progressBar->setValue(0);
    int idx=0;

    for(int i=0;i<data.length();i+=MAX_BYTE)
    {
        webSocket.sendBinaryMessage(data.mid(i,MAX_BYTE));
        idx++;

        // 更新进度条
        ui->progressBar->setValue(idx);

        mySleep(500);  // y延迟500ms 凸显进度条效果
    }
    // webSocket.sendBinaryMessage(data);

    file.close();

    // 发送文件传输结束标志
    webSocket.sendTextMessage("send_end");
}

void ClientWidget::sendMutliFile()
{
    // 复位进度条
    ui->progressBar->setValue(0);
    ui->progressBar_1->setValue(0);


    // 选择多选文件
    QStringList sendFileList = QFileDialog::getOpenFileNames(this,"选择发送文件(支持多选)","C:","Text(*.txt)");
    if(sendFileList.length()==0)
        return;
    qDebug()<<sendFileList;

    // 设置总进度条属性
    ui->progressBar_1->setMinimum(0);
    ui->progressBar_1->setMaximum(sendFileList.length());
    ui->progressBar_1->setValue(0);

    // 开始执行发送多文件
    int idx1=0;
    for(int num =0;num<sendFileList.count();num++)
    {
        QString filePath = sendFileList[num];
        QFile file(filePath);

        if(file.open(QIODevice::ReadOnly))
        {
            QByteArray ba = file.readAll();

            int MAX_BYTE=20;   // 定义一次传输最大字节
            ui->progressBar->setMinimum(0);
            ui->progressBar->setMaximum(ba.length()%MAX_BYTE==0?ba.length()/MAX_BYTE:ba.length()/MAX_BYTE+1);
            ui->progressBar->setValue(0);

            webSocket.sendTextMessage("send_start");

            int idx=0;
            for(int dataNum=0;dataNum<ba.length();dataNum+=MAX_BYTE)
            {
                webSocket.sendBinaryMessage(ba.mid(dataNum,MAX_BYTE));
                idx++;

                // 更新进度条
                ui->progressBar->setValue(idx);

                mySleep(500);  // 延迟500ms 凸显进度条效果
            }
            file.close();

            webSocket.sendTextMessage("send_end");
        }
        else
        {
            qDebug()<<"发送失败文件:"<<filePath;
            continue;
        }

        idx1++;
        ui->progressBar_1->setValue(idx1);

        // 给服务器一个缓冲时间
        mySleep(500);
    }
}

3.效果预览
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一个跨平台的应用程序开发框架,可以方便地实现一对多文件传输功能。 首先,为了实现文件传输,我们需要建立一个服务器端和多个客户端。服务器端负责接收和转发文件,而客户端负责和服务器通信,发送文件服务器。 在服务器端,我们可以创建一个TCP服务器,监听特定的端口。一旦有客户端连接到服务器服务器就会创建一个新的线程来处理与该客户端的通信服务器可以使用QTcpServer类来实现TCP服务器的功能,使用QTcpSocket类来处理与客户端的通信。当客户端连接到服务器时,服务器会为每个客户端创建一个新的QTcpSocket进行通信。 在客户端,我们可以使用QTcpSocket类来连接服务器,并发送文件服务器。客户端可以选择在文件传输之前先向服务器发送文件信息,例如文件名、文件大小等。然后,客户端可以根据文件大小分块读取文件内容,并将每个文件块通过QTcpSocket发送给服务器服务器端接收到数据后,可以将数据写入文件。客户端和服务器可以约定一个特定的方式来表示文件传输的结束,例如发送一个特定的标志来表示文件传输完成。 为了实现一对多文件传输,我们可以在服务器端使用线程池来处理客户端的连接,每个线程负责与一个客户端进行通信文件传输。这样,服务器可以同时处理多个客户端的请求。客户端可以选择连接到服务器,并将文件发送给服务器。 总之,借助QT的网络模块和多线程功能,我们可以方便地实现一对多文件传输功能。在服务器端,通过创建一个TCP服务器来监听客户端的连接,并使用线程池来处理每个客户端的请求。在客户端,通过QTcpSocket连接服务器,并发送文件服务器。通过这样的方式,我们可以实现一对多的文件传输。 ### 回答2: Qt是一款跨平台的C++开发框架,可以用于实现一对多文件传输。以下是一种可能的实现方案: 首先,需要创建一个服务器端和多个客户端。服务器端负责接收文件并将其传输给所有客户端,而每个客户端则负责接收服务器发送的文件。 在服务器端,可以使用QtQTcpServer类来创建一个TCP服务器。当有客户端连接到服务器时,可以使用QTcpSocket类与之通信服务器可以开启多线程来处理多个客户端的连接。 在客户端,可以使用QTcpSocket类连接到服务器,并通过socket发送文件请求。一旦服务器接收到请求,它可以将所需的文件通过socket发送给客户端。客户端可以使用QTcpSocket的readyRead信号来接收文件数据。 为了实现一对多文件传输服务器端需要维护一个与每个客户端连接的socket列表。每当服务器收到一个文件,它需要遍历所有的客户端socket,并将文件数据发送给每个客户端。 为了保证文件传输的完整性,可以使用文件头部信息来包含文件名和大小等元数据。在接收方,可以首先接收文件头部信息以获取文件的大小和名称,然后根据文件大小循环接收文件数据。 此外,在发送和接收文件时,可以使用Qt的QFile类将文件内容读取到内存中,并使用QTcpSocket的write和read方法来发送和接收文件数据。 综上所述,使用Qt可以很方便地实现一对多文件传输。通过使用QTcpServer和QTcpSocket类,可以轻松地创建一个服务器和多个客户端,并通过socket来传输文件数据。 ### 回答3: Qt是一个跨平台的C++ GUI应用程序开发框架,可以用于实现一对多文件传输的功能。 首先,需要创建一个服务器端来接收文件,使用QtQTcpServer类可以轻松实现。服务器端需要做以下几个步骤: 1. 创建QTcpServer对象,并监听某个特定的端口。 2. 在客户端连接时,使用QTcpServer的newConnection信号来获取连接的套接字。 3. 通过套接字的read和write函数来接收和发送文件数据。 其次,需要建立一个或者多个客户端来发送文件。客户端也使用QtQTcpSocket类来实现。客户端需要做以下几个步骤: 1. 创建QTcpSocket对象,并连接服务器。 2. 使用套接字的write函数向服务器发送文件数据。 3. 使用套接字的read函数读取服务器响应。 为了实现一对多的文件传输,可以采用多线程来处理多个客户端连接。可以使用QtQThread类来创建线程,并在其中创建客户端对象。每个线程负责一个客户端的文件传输任务。 在服务器端,可以使用线程池管理多个线程,接收多个客户端的连接请求。每当有新的客户端连接时,从线程池中取出一个线程进行处理。每个线程负责一个客户端的文件传输任务,可以使用信号槽机制将传输的数据与UI界面进行交互。 总结起来,Qt可以通过使用QTcpServer和QTcpSocket类来实现一对多的文件传输功能。通过多线程和线程池,可以同时处理多个客户端的连接和文件传输任务。这样可以使文件传输更高效和稳定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值