在QT實現檔案傳輸

2021-08-07 13:00:00 字數 2557 閱讀 1552

過程如下:

1、伺服器端設定監聽套接字,開始監聽;

2、客戶端在連線成功時開始傳送檔案,有connected()訊號連線send()槽,send()傳送檔案頭資訊,包括檔名、檔案總大小和檔名大小等;

3、傳送完檔案頭資訊時開始傳送檔案內容,有byteswritten(qint64)訊號連線到goonsend(qint64)槽,前者是當想套接字寫入資料時會出發的訊號,即當已經想套接字寫入資料,就繼續傳送資料,有send()傳送檔案頭資訊開始觸發,直到檔案傳完為止。

4、在伺服器端,首先接收檔案頭資訊,然後讀取檔名來用新建檔案的方式開啟乙個檔案,然後讀取檔名即檔案等大小資訊,用來更新進度條和繼續接收資料;

5、實現迴圈傳輸,在客戶端,因為第一次send()是由connected()訊號觸發的,之後的每次傳送應該手動呼叫send();在伺服器端,在有新資料到達時,會判斷是否為標頭檔案,因此在每次檔案傳完的時候將bytereceived重置為0,即下一次再接收到資料的時候依據bytereceived判斷的結果就是乙個新檔案了。

客戶端**:

[cpp]view plain

copy

#ifndef widget_h

#define widget_h

#include 

#include 

#include 

#include 

namespace

ui   

class

widget : 

public

qwidget  

;  #endif // widget_h

widget.cpp

[cpp]view plain

copy

#include "widget.h"

#include "ui_widget.h"

#include 

#include 

#include 

widget::widget(qwidget *parent) :  

qwidget(parent),  

ui(new

ui::widget)  

void

widget::send()  

//傳送檔案頭資訊

void

widget::goonsend(qint64 numbytes)  

//開始傳送檔案內容

widget::~widget()  

void

widget::on_openpushbutton_clicked()  

//開啟檔案並獲取檔名(包括路徑)

void

widget::on_sendpushbutton_clicked()  

else

send();  //第一次傳送的時候是由connecttohost出發connect訊號才能呼叫send,第二次之後就需要呼叫send了

ui->sendstatuslabel->settext(tr("正在傳送檔案 %1"

).arg(filename));  

}  

服務端**:

widget.h

[cpp]view plain

copy

#ifndef widget_h

#define widget_h

#include 

#include 

#include 

#include 

#include 

namespace

ui   

class

widget : 

public

qwidget  

;  #endif // widget_h

widget.cpp

[cpp]view plain

copy

#include "widget.h"

#include "ui_widget.h"

#include 

widget::widget(qwidget *parent) :  

qwidget(parent),  

ui(new

ui::widget)  

void

widget::acceptconnection()  

void

widget::readclient()  

else

//正式讀取檔案內容

ui->progresslabel->show();  

ui->receivedprogressbar->setmaximum(totalsize);  

ui->receivedprogressbar->setvalue(bytereceived);  

if(bytereceived == totalsize)  

}  widget::~widget()  

void

widget::on_pushbutton_clicked()  

Qt檔案傳輸小記

傳輸檔案時,簡單的文字檔案可以以字串的形式傳輸。一般的無格式檔案則以二進位制格式傳輸。編寫程式涉及的buffer類有 qfile qbytearray qstring qtcpsocket 如果用其他套接字的話還會用到 char陣列。當傳輸檔案時不可避免取得資料操作,儲存資料型別轉換,寫入資料操作。...

QT中TCP實現檔案傳輸功能

實物圖 客戶端 傳送端 和服務端 接受端 為一體 部分 詳情 注釋詳細 widget.h ifndef widget h define widget h include include include include namespace ui class widget public qwidget ...

QT檔案傳輸(簡單版)

qt檔案傳輸 簡單版 這是用qt寫的一篇簡單的檔案傳輸,只是考慮了黏包問題,並沒有考慮進度條和執行緒問題 pro中加network 標頭檔案 qtcpsocket通訊套接字 qtcpserver監聽套接字 qfile 檔案操作 qtimer定時器 防止黏包 函式 fileserver 建構函式 fi...