QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)
本文實(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ò)聊天室程序
這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08C語言實(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-02Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例,本文代碼中包含大量注釋來講解CCControlColourPicker控件類的使用,需要的朋友可以參考下2014-09-09C++應(yīng)用實(shí)現(xiàn)簡易五子棋游戲
這篇文章主要為大家詳細(xì)介紹了C++應(yīng)用實(shí)現(xiàn)簡易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05