過程如下:
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...