大話QT之十 實現FTP斷點續傳

2021-09-08 04:42:03 字數 3038 閱讀 3556

應用需求:

且這三種傳輸資料方式是可配的,能夠通過不同的介面呼叫。相比這三種方式。基於udt的大量檔案傳輸是比較值得研究與創新的地方,它在底層是基於udp,在上層實現了可靠性的控制;同一時候它充分考慮到了基於在公網環境下基於tcp進行傳輸時擁塞控制演算法的缺點,實現了自己的擁塞控制演算法,在實際測試中其效能也是明顯高於基於tcp的傳輸。

實現原理:

這裡不用多說,其長處顯而易見。

利用qftp實現斷點續傳:

可是使用它原生提供的put與get方法,無法實現斷點續傳。因此。為了實現斷點續傳我們須要又一次實現檔案傳輸。並在當中加入斷點續傳的控制。事實上ftp檔案傳輸的本質也是使用tcp來實現底層的檔案傳輸。大體思路就是:利用qftp的connecttohost登入ftpserver,使用login登入ftpserver,使用rawcommand傳送ftp原生態的命令,使用qtcpsocket實現檔案資料的傳輸。

首先,使用qtcpsocket實現檔案資料的傳輸,須要設定ftpserver為「pasv」被動接收方式。即ftpserver被動地接收來自client的連線請求。

ftpserver全部能夠傳送的原生命令有:

實現斷點上傳的命令傳送流程:

1、rawcommand("type i");設定資料傳輸的型別:二進位制資料或ascii

2、rawcommand("pasv")。設定server為被動接收方式。傳送pasv命令後。server會返回自己開啟的傳輸資料的port。等待client連線進行傳輸資料。

假設此時改檔案不存在,則server端會建立乙個。

4、完畢上述流程後,就能夠開啟本地檔案進行讀取,並通過tcpsocket鏈路傳送出去(write)。

1、rawcommand("type i");設定資料傳輸的型別:二進位制資料或ascii

2、rawcommand("pasv");設定server為被動接收方式。傳送pasv命令後,server會返回自己開啟的傳輸資料的port,等待client連線進行傳輸資料。

3、rawcommand("rest  size");該命令設定ftpserver從本地檔案的哪個地方開始進行傳輸資料。

4、rawcommand(「retr  remote-file-path」);開始從遠端主機傳輸檔案。

關鍵**:

1. 處理rawcommand()傳送原生命令返回後的槽函式:

void lhtfiletransfer::procrawcommandreply(int nreplycode, qstring strdetail)

else if (currentitem.task_type.compare("download") == 0)

}//! pasv

else if(227 == nreplycode)

m_senddatasocket = new qtcpsocket();

connect(m_senddatasocket, signal(readyread()), this, slot(procreadyread()), qt::uniqueconnection);

connect(m_senddatasocket, signal(readchannelfinished()), this, slot(procreadchannelfinished()), qt::uniqueconnection);

connect(m_senddatasocket, signal(byteswritten(qint64)), this, slot(procbyteswritten(qint64)), qt::uniqueconnection);

qstringlist lstr = backresult.split("(").last().split(")").first().split(",");

int naddress = lstr.at(0).toint()<<24 |

lstr.at(1).toint()<<16 |

lstr.at(2).toint()<<8 |

lstr.at(3).toint();

qhostaddress hostaddress(naddress);

int nport = lstr.at(lstr.length() - 2).toint() * 256 + lstr.last().toint();

m_senddatasocket->connecttohost(hostaddress, nport);

if (op.compare("put") == 0)

else if (op.compare("get") == 0)

}//! 傳送資料

else if (150 == nreplycode)

const qint64 filesize = m_filehandle->size();

m_filehandle->seek(currentitem.uploaded_size);

while(!m_filehandle->atend())

}m_senddatasocket->flush();

m_senddatasocket->close();

m_senddatasocket = null ;

emit datatransferprogress(m_filehandle->pos(), m_filehandle->size());

m_proctask.remove(currentitemfilepath);

m_filehandle->close();

//emit startnexttask();

} else if(op.compare("get") == 0)}}

else if(350 == nreplycode)

}

void lhtfiletransfer::procreadyread()

面臨的問題以及興許須要優化的地方:1. 字元編碼問題。即當須要上傳的檔名稱是中文名稱時,須要對其進行轉碼。

FTP實現斷點續傳

ftp客戶端實現要建立兩個通道,乙個控制命令通道,讓ftp伺服器知道客戶端要幹什麼,乙個資料傳輸通道。所謂的兩個通道只不過是兩個呼叫了connect函式的連線,只是控制命令通道專門用來傳輸一些字串命令資訊,而資料通道則是用來傳輸檔案。控制命令通道一定是由客戶端向伺服器的連線 預設的埠是21,也可以指...

FTP實現斷點續傳

ftp客戶端實現要建立兩個通道 乙個控制命令通道,讓ftp伺服器知道客戶端要幹什麼,乙個是資料傳輸通道。所謂的兩個通道只不過是兩個呼叫了connect函式的連線,只是控制命令通道專門用來傳輸一些字串命令資訊,而資料通道則是用來傳輸檔案。控制命令通道一定是由客戶端向伺服器的連線 預設的埠是21,也可以...

ftp斷點續傳

import open.mis.data.downloadstatus import open.mis.data.uploadstatus import org.apache.commons.net.printcommandlistener import org.apache.commons.net...