欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)

 更新時間:2022年08月04日 13:36:55   作者:Jason~shen  
這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下

一、設(shè)計目標(biāo)

1、發(fā)送端選擇要傳輸?shù)奈募?,進(jìn)度條顯示傳輸?shù)倪M(jìn)度,手動輸入要傳輸?shù)膇p地址和端口號

2、接收到數(shù)據(jù)后顯示接收進(jìn)度,接收完畢后進(jìn)度條自動消失

二、效果展示

三、實(shí)現(xiàn)過程

Qt文件傳輸發(fā)送端

1. 連接服務(wù)器

2. 當(dāng)連接成功后會發(fā)送connected信號

3. 在槽函數(shù)中發(fā)送文件頭信息

4. 當(dāng)數(shù)據(jù)發(fā)送成功后會發(fā)送bytesWritten

5. 在槽函數(shù)中發(fā)送文件內(nèi)容

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);
? ? //當(dāng)客戶端連接成功會發(fā)送connected信號, 當(dāng)客戶端掉線會發(fā)送disconnected信號
? ? connect(&msocket, &QTcpSocket::connected, this, &FileSend::send_file_head);
?
? ? //當(dāng)套接字發(fā)送完畢會發(fā)送一個信號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()
{
? ? //連接服務(wù)器
? ? msocket.connectToHost(ui->ipedit->text(), ui->portedit->text().toUShort());
?
? ? //發(fā)送文件信息
? ? qDebug()<<"connect";
?
? ? //初始化
? ? filesize = 0;
? ? sendsize = 0;
}
?
//發(fā)送文件頭信息
void FileSend::send_file_head()
{
? ? //發(fā)送文件名,文件大小
? ? QFileInfo info(ui->fileEdit->text());//文件信息對象
? ? filename = info.fileName();
? ? filesize = info.size();
?
? ? QByteArray array; //空間
? ? //把a(bǔ)rray與數(shù)據(jù)流綁定
? ? QDataStream stream(&array, QIODevice::WriteOnly);
? ? stream<<filesize<<filename;
?
? ? //設(shè)置進(jìn)度條最大值
? ? ui->progressBar->setMaximum(filesize);
?
? ? //打開文件準(zhǔn)備讀取數(shù)據(jù)發(fā)送
? ? file.setFileName(ui->fileEdit->text());
? ? file.open(QIODevice::ReadOnly);
?
? ? //發(fā)送
? ? msocket.write(array);
}
?
void FileSend::send_file_text()
{
? ? if(sendsize < filesize)
? ? {
? ? ? ? QByteArray array = file.read(1024*10);//讀取一段內(nèi)容
? ? ? ? msocket.write(array);//發(fā)送一段內(nèi)容
? ? ? ? sendsize += array.size();
? ? ? ? //設(shè)置進(jìn)度條
? ? ? ? ui->progressBar->setValue(sendsize);
? ? }
? ? if(sendsize == filesize)
? ? {
? ? ? ? file.close();//關(guān)閉文件
? ? }
}

Qt文件傳輸接收端

1.創(chuàng)建服務(wù)器, 監(jiān)聽,當(dāng)有客戶端連接的時候發(fā)送newConnection信號,

2.在槽函數(shù)中創(chuàng)建與客戶端通信的套接字QTcpSocket

3.當(dāng)客戶端發(fā)送數(shù)據(jù)是QTcpSocket對象會發(fā)送readyRead信號

4.在槽函數(shù)中讀取數(shù)據(jù)

根據(jù)文件大小判斷是否是第一次讀取數(shù)據(jù)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);
? ? //關(guān)聯(lián)客戶端連接信號
? ? connect(&mserver, &QTcpServer::newConnection, this, &FileRecv::new_client);
? ? //啟動服務(wù)器
? ? mserver.listen(QHostAddress::Any,8080);
}
?
FileRecv::~FileRecv()
{
? ? delete ui;
}
void FileRecv::new_client()
{
? ? //創(chuàng)建與客戶端通信的套接字
? ? QTcpSocket *msocket = mserver.nextPendingConnection();
? ? //關(guān)聯(lián)讀數(shù)據(jù)信號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) //表達(dá)第一次讀取數(shù)據(jù)--讀文件信息
? ? {
? ? ? ? QByteArray array = msocket->readAll();
? ? ? ? QDataStream stream(&array, QIODevice::ReadOnly);//把套接字與數(shù)據(jù)流綁定
? ? ? ? stream>>filesize>>filename;//獲取文件大小, 文件名
?
? ? ? ? //設(shè)置進(jìn)度條最大值
? ? ? ? ui->progressBar->setMaximum(filesize);
?
? ? ? ? //打開文件
? ? ? ? file.setFileName(filename);
? ? ? ? file.open(QIODevice::WriteOnly);
?
? ? ? ? //顯示進(jìn)度條
? ? ? ? this->show();
? ? }
?
? ? //讀文件內(nèi)容
? ? if(recvsize < ?filesize)
? ? {
? ? ? ? //讀取一段寫一段
? ? ? ? QByteArray array = msocket->readAll();
? ? ? ? file.write(array);
? ? ? ? recvsize += array.size();
? ? ? ? //更新進(jìn)度條
? ? ? ? ui->progressBar->setValue(recvsize);
? ? }
?
? ? if(recvsize == filesize)
? ? {
? ? ? ? //讀完,關(guān)閉文件
? ? ? ? file.close();
? ? ? ? //關(guān)閉套接字
? ? ? ? msocket->disconnectFromHost();
? ? ? ? //隱藏進(jìn)度條
? ? ? ? this->hide();
? ? }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序

    QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序

    這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例

    C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例

    字符串不僅可以轉(zhuǎn)換為整數(shù),也可以轉(zhuǎn)換為浮點(diǎn)數(shù),本文主要介紹了C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例,具有一定的參考價值,感興趣的可以了解一下
    2022-02-02
  • C++指針與數(shù)組:指針詳解

    C++指針與數(shù)組:指針詳解

    本文從初學(xué)者的角度,深入淺出地講解C++中的指針、數(shù)組指針,對最?;煜囊脗鬟f、值傳遞和指針傳遞做了區(qū)處,需要的朋友可以參考下
    2021-09-09
  • Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例

    Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例

    這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例,本文代碼中包含大量注釋來講解CCControlColourPicker控件類的使用,需要的朋友可以參考下
    2014-09-09
  • 基于C語言實(shí)現(xiàn)簡易的掃雷游戲

    基于C語言實(shí)現(xiàn)簡易的掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)簡易的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言實(shí)現(xiàn)輸出各種三角形

    C語言實(shí)現(xiàn)輸出各種三角形

    這篇文章主要介紹了C語言實(shí)現(xiàn)輸出各種三角形方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++應(yīng)用實(shí)現(xiàn)簡易五子棋游戲

    C++應(yīng)用實(shí)現(xiàn)簡易五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++應(yīng)用實(shí)現(xiàn)簡易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++實(shí)現(xiàn)井字棋游戲

    C++實(shí)現(xiàn)井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • QT+OpenCV實(shí)現(xiàn)錄屏功能

    QT+OpenCV實(shí)現(xiàn)錄屏功能

    這篇文章主要為大家詳細(xì)介紹了QT+OpenCV實(shí)現(xiàn)錄屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 電腦開機(jī)時間的計算代碼

    電腦開機(jī)時間的計算代碼

    這幾天我琢磨著一件事,那就是怎么計算我的PC從開機(jī)到現(xiàn)在的總時間。終于,看看這個函數(shù):GetTickCount();
    2013-05-05

最新評論