傳輸檔案時,簡單的文字檔案可以以字串的形式傳輸。一般的無格式檔案則以二進位制格式傳輸。
編寫程式涉及的buffer類有
qfile qbytearray qstring qtcpsocket 如果用其他套接字的話還會用到 char陣列。當傳輸檔案時不可避免取得資料操作,儲存資料型別轉換,寫入資料操作。
在文字方式中:
首先需要考慮字元編碼,有中文字元時,得轉為utf-8在通過套接字傳送,另一端接收到後在轉回來(qstring的toutf8()和fromutf8()操作)。
考慮傳送方式,是一行一行的讀取和傳送還是其他方式(簡單的文字檔案一般一行一行的傳輸,但是檔案稍大就傳輸慢了)。
傳送:
voids5bsendclient::sendtextmodefile(qfile&file)
; strcpy(linebuf,utf8line);
send(linebuf,len);
sendedsize+=len;
qdebug()《接收:
voids5brecvclient::recvtextfiledata(); recv(buffer,recvlen);
inthasrecv=recvlen;
qbytearrayrecvdata=qbytearray::fromrawdata(buffer,recvlen);
qstringrecvstr=qstring::fromutf8(recvdata);
qdebug()《在二進位制方式中:
不需要考慮編碼,但是無法一行一行的傳輸,可以以塊作單位傳輸。
傳送:voids5bsendclient::senddatamodefile(qfile&file)
if(file.isopen())
sendfiledone();
}voids5bsendclient::sendmax4mdata(qbytearraymax4m)
接收:voids5brecvclient::recvdatafiledata()
; recv(buffer,recvlen);
inthasrecv=recvlen;
//把接收的資料放到檔案中
m_precvfile->write(buffer,hasrecv);
qdebug()recvsize+=hasrecv;
qdebug()《兩種方式傳輸在qt的套接字程式設計時都得考慮傳送和接收資料大小的協商。
也就是說傳送資料前添上資料的長度,後跟該資料長度大小的資料。
接收時,先接收特定位元組大小的長度值,在接收該值所表示的資料位元組數。
voids5brecvclient::recvfiledatalen()
; recv(buffer,recvlen);
if(!islittleendian())
else
qdebug()《完整的**示例
Gloox檔案傳輸小記
使用版本 1.1.10 今天弄了一下gloox中自帶的收發檔案例子,收發檔案的例子都是好使的,只不過,在除錯過程中需要注意一些問題,下面將我遇到的問題做個記錄 例子中以in band bytestreams方式收發 1 傳送檔案過程中遇到404錯誤 iq type error id uid 8509...
在QT實現檔案傳輸
過程如下 1 伺服器端設定監聽套接字,開始監聽 2 客戶端在連線成功時開始傳送檔案,有connected 訊號連線send 槽,send 傳送檔案頭資訊,包括檔名 檔案總大小和檔名大小等 3 傳送完檔案頭資訊時開始傳送檔案內容,有byteswritten qint64 訊號連線到goonsend q...
QT檔案傳輸(簡單版)
qt檔案傳輸 簡單版 這是用qt寫的一篇簡單的檔案傳輸,只是考慮了黏包問題,並沒有考慮進度條和執行緒問題 pro中加network 標頭檔案 qtcpsocket通訊套接字 qtcpserver監聽套接字 qfile 檔案操作 qtimer定時器 防止黏包 函式 fileserver 建構函式 fi...