應用需求:
且這三種傳輸資料方式是可配的,能夠通過不同的介面呼叫。相比這三種方式。基於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()傳送原生命令返回後的槽函式:
面臨的問題以及興許須要優化的地方:1. 字元編碼問題。即當須要上傳的檔名稱是中文名稱時,須要對其進行轉碼。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()
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...