freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ftp多線程下載工具畢業(yè)論文-閱讀頁

2024-09-16 17:58本頁面
  

【正文】 數(shù)據(jù)流圖。服務(wù)器響應(yīng)命令并向下載系統(tǒng)發(fā)送應(yīng)答碼和資源數(shù)據(jù)。 圖 6 數(shù)據(jù)流第一層圖 如圖 6 所示為數(shù)據(jù)流第一層圖,下載系統(tǒng)主要分為兩個部分:遠(yuǎn)程連接和下載資源。下載資源主要處理用戶的下載操作。 圖 7 遠(yuǎn)程連接細(xì)分 當(dāng)用戶點擊連接按鈕時,遠(yuǎn)程連接模塊創(chuàng)建套接字與服務(wù)器連接,連接建立后,將需要執(zhí)行的 FTP 命令加入到 FTP 命令管理處, FTP 命令管理處依據(jù) FTP命令添加的順序向服務(wù)器發(fā)送命令請求,接收服務(wù)器的應(yīng)答信息。下載線程將命令添加到FTP 命令管理處。 東華理工大學(xué)畢業(yè)設(shè)計(論文) 系統(tǒng)概要設(shè)計 14 4 系統(tǒng)概要設(shè)計 系統(tǒng)邏輯結(jié)構(gòu) 本文實現(xiàn)的下載系統(tǒng)采用 C/S結(jié)構(gòu),實現(xiàn)了 FTP 的客戶端部分。系統(tǒng)在邏輯上分層,可以降低系統(tǒng)的耦合度,有利于系統(tǒng)的開發(fā)和維護(hù)。負(fù)責(zé)系統(tǒng)界面的管理,控件的初始化;用戶操作的合理性檢驗,將合理的請求下發(fā)給業(yè)務(wù)邏輯層;顯示業(yè)務(wù)邏輯層的處理結(jié)果。主要分為兩個部分,遠(yuǎn)程交互部分和下載部分。遠(yuǎn)程交互部分和下載部分將用戶的請求分解為一系列的FTP 命令并將這些命令發(fā)送給命令執(zhí)行層執(zhí)行,最后將處理的結(jié)果返回給表現(xiàn)層。 系統(tǒng)類圖設(shè)計 程序的主類 UML 圖如圖 9所示。遠(yuǎn)程訪問模塊的主類為 RemoteServer,下載模塊的主類為 DdController, FTP 命令控制模塊的主類為 RequestCore。 當(dāng)用戶進(jìn)行操作時,界面管理類 AppUI 將操作命令發(fā)送給命令分發(fā)類CmdController。 遠(yuǎn)程訪問類 RemoteServer 主要功能是將一系列命令添加到 FTP 命令控制類RequestCore 中。 下載控制類 DdController 接受用戶的新建、刪除、暫停、開始下載任務(wù)等操作,比如當(dāng)用戶新建一個下載任務(wù)時, DdController 將創(chuàng)建一定數(shù)量的 DdThread 下載線程,將下載文件分為 N個數(shù)據(jù)塊,分發(fā)給下載線程下載。 DDScoket 類根據(jù)下載任務(wù),將一些 FTP 命令添加到 FTP 命令控制類 RequestCore 中。它將外界需要調(diào)用的 FTP 命令和命令參數(shù)保存到隊列中,然后以隊列順序依次調(diào)用 FTP 執(zhí)行類執(zhí)行命令。如圖 10 所示,F(xiàn)ormFiles 存儲了程序的窗口 ui文件, HeaderFile 和 Source Files 中存放系統(tǒng)的界面管理類的實現(xiàn)。 Dowload 存放下載相關(guān)的代碼。 Remoteserver 存放系統(tǒng)與服務(wù)器的交互, request存放 FTP 的處理類。 東華理工大學(xué)畢業(yè)設(shè)計(論文) 系統(tǒng)概要設(shè)計 16 圖 10 程序項目結(jié)構(gòu)圖 系統(tǒng)重用設(shè)計 本系統(tǒng)使用 C++面向?qū)ο笳Z言。在設(shè)計系統(tǒng)時,一定要清楚哪些模塊是可以抽離出來反復(fù)使用的。這樣可以提高代碼的內(nèi)聚,提升系統(tǒng)的健壯性。如程序的運行參數(shù)、用戶的操作信息等。如本系東華理工大學(xué)畢業(yè)設(shè)計(論文) 系統(tǒng)概要設(shè)計 17 統(tǒng)中,需要將用戶的連接歷史記錄,程序的配置參數(shù)如:默認(rèn)下載路徑、線程分配額度,下載信息保存到文件中。 AppInfo 類是一個保存程序配置信息的類,因為保存信息的需求分散在程序的不同地方,因此該類使用單例模式。它通過 keyvalue 的形式對信息進(jìn)行存儲,當(dāng)系統(tǒng)運行在在 windows 系統(tǒng)上時,它將信息保存到注冊表中。 關(guān)鍵代碼如下: AppInfo* AppInfo::GetInstance() { static AppInfo appInfo。appInfo。 } QString AppInfo::GetStorageValue(QString key) { return m_pSetvalue(key).toString()。 } ( 2)套接字的復(fù)用 在遠(yuǎn)程訪問和下載資源兩個模塊中,它們的相同點:需要與服務(wù)器建立通信;使用 FTP命令進(jìn)行通信。 結(jié)合遠(yuǎn)程訪問與下載資源的相同點與異同點,可以將它們的相同點抽離出來,WorkSocket類就是這樣的一個類,該類的 UML圖如圖 15所示。 QTcpSocket 是 Qt 提供的一個實現(xiàn) TCP 協(xié)議的套接字類。 WorkSocket 類的定義如下: class WorkSocket : public QTcpSocket { Q_OBJECT public: WorkSocket(QObject *parent = nullptr)。 virtual void clear()。ip, quint16 port)。 //斷開連接 bool isRecvRemoteserverInfo()。 //讀取 FTP的數(shù)據(jù) void _disconnected()。 //無指令時的默認(rèn)處理 //派生類必須實現(xiàn)此函數(shù) virtual RequestCoreBase *GetRequestCore()。 //錯誤處理 virtual void _clearRecvData()。 //發(fā)送接受到的數(shù)據(jù) virtual void _outputResponseLog(const QString amp。 //發(fā)送錯誤日志 virtual void _outputErrorLog(const QString amp。 private: ERESULT _checkRecvStrIntegrity()。 private: bool m_bIsFirstRecv。 ( 3) FTP 命令實現(xiàn)的設(shè)計 下載系統(tǒng)的實現(xiàn)基于 FTP的 RFC959標(biāo)準(zhǔn), RFC959在 1985年 10月發(fā)布,其在 RFC756的基礎(chǔ)上更改了一系列文檔的錯誤,增加了幾個新的命令。 為了符合 FTP 的擴(kuò)展性,下載系統(tǒng)也應(yīng)具有擴(kuò)展性。 PASS命令總是跟在 USER 命令的后面,因此將二者放在同一個執(zhí)行類中。所有的 FTP 命令執(zhí)行類具有統(tǒng)一的接口,但它們并不擁有共同的基類,這樣設(shè)計可以方便以后擴(kuò)展。當(dāng)外界需要執(zhí)行 FTP 命令的時候。然后 FTP 命令控制類在合適的時機(jī)根據(jù) FTP 命令壓入的順序進(jìn)行執(zhí)行。用戶只需將控件拖入窗口中,依靠窗口布局器調(diào)整好控件的位置,點擊保存。 將 ui文件添加到項目中, Qt自動為 ui文件在命名空間 Ui中生成相關(guān)的 ui類。在子類中創(chuàng)建一個 ui類的實例,并在構(gòu)造函數(shù)中調(diào)用 ui類的 setupui函數(shù)關(guān)聯(lián)自己即可。當(dāng)控件被用戶操作時,控件會發(fā)射相關(guān)的信號 ,如控件點擊時將發(fā)送 clicked()信號,在 Qt界面子類中使用 Qt的信號槽機(jī)制關(guān)聯(lián)控件的信號 ,信號發(fā)射時槽函數(shù)將得到調(diào)用。 _init()。 connect(, SIGNAL(clicked()), this, SLOT(_connect()))。 connect(, SIGNAL(clicked()), this, SLOT(_saveas()))。 connect(, SIGNAL(clicked()), this, SLOT(_option()))。 connect(, SIGNAL(doubleClicked(const QModelIndex amp。)))。 } 如圖 12為下載系統(tǒng)的主要界面: 東華理工大學(xué)畢業(yè)設(shè)計(論文) 系統(tǒng)功能的詳細(xì)設(shè)計和實現(xiàn) 21 圖 12 系統(tǒng)主要界面 標(biāo)記為 1的部分,顯示服務(wù)器文件列表信息,一個文件信息包括文件名、文件大小、文件類型、最近修改事件、權(quán)限、所有者信息。標(biāo)記為 3的部分,顯示日志的輸出,輸出三類信息: FTP命令信息、服務(wù)器的應(yīng)答信息、程序的異常信息。除了極少數(shù)的函數(shù)外,如 :clear()。而把 TRUE 和 FALSE 當(dāng)作返回值,無法看到具體的出錯原因 下載系統(tǒng)的返回值類型為 ERESULT,其定義為: typedef qint16 ERESULT。 QTcpSocket 類是 Qt 提供的一個套接字類, QTcpSocket 封裝了 TCP 客戶端的實現(xiàn)。在非阻塞模式下,調(diào)用套接字的相關(guān)函數(shù),線程不等待函數(shù)的返回繼續(xù)往下執(zhí)行。 QTcpSocket 默認(rèn)使用非阻塞套接字,當(dāng)有數(shù)據(jù)需要接收時, QTcpScoket 會發(fā)出 readyRead 信號,需要做的是連接該信號到一個槽上,然后在槽上接收數(shù)據(jù)。 在 WorkSocket 接收槽上,首先檢查接收到的數(shù)據(jù)的完整性,如果當(dāng)前接收到的數(shù)據(jù)不是完整的一條應(yīng)答碼則返回。如果應(yīng)答碼的開頭不為 2表示服務(wù)器當(dāng)前不能處理該用戶的請求。當(dāng)前命令處理成功后,繼續(xù)處理下一條 FTP命令,直至命令為空。 hr = _checkRecvStrIntegrity()。 } return 。239。 return _clearRecvData()。 } while (!GetRequestCore()isEmpty()) //FTP命令控制類的 FTP命令是否為空 {//have cmd hr = GetRequestCore()Execute()。 } else if (hr == E_OK) {//處理完一個命令處理下一個命令 _clearRecvData()。 continue。 } } _cmdProcessingCompleted()。 //沒有命令時接收數(shù)據(jù)的默認(rèn)處理 } FTP 命令的管理與執(zhí)行的技術(shù)實現(xiàn) FTP 命令管理的技術(shù)實現(xiàn) FTP命令由 FTP命令控制類進(jìn)行管理, FTP命令控制類實現(xiàn)了一個 FTP命令的有序數(shù)組。 東華理工大學(xué)畢業(yè)設(shè)計(論文) 系統(tǒng)功能的詳細(xì)設(shè)計和實現(xiàn) 24 列表的參數(shù)為: struct __info { FUNC_PTR ptr。 }。 RequestInfo類保存了當(dāng)前命令需要的參數(shù)信息。 //當(dāng)前發(fā)送 FTP命令的套接字 QByteArray *pRecvData。 //回調(diào)函數(shù) , union { struct _login_In { QString *user。 }login_in。 //CWD命令的參數(shù) }cwd_in。 QString *fileName。 quint64 len。 }param_in。 }pwd_out。 }list_out。 }retr_out。 }。如在 RemoteServer遠(yuǎn)程訪問類中,創(chuàng)建了一個 FTP命令控制類的實例,添加登錄命令的代碼如下: hr = (amp。m_recvStr, NULL, amp。m_userInfopassword))。 RequestCmdLogin用戶登錄密碼,包括 USER 和 PASS 等; RequestCmdPWD 執(zhí)行獲取服務(wù)器當(dāng)前路徑命令;RequestCmdCWD 執(zhí)行改變服務(wù)器路徑命令; RequestCmdCDUP 執(zhí)行返回上一層目錄命令; RequestCmdDDFile 執(zhí)行下載文件命令; RequestCmdPASV 約定數(shù)據(jù)連接的地址與端口號; RequestCmdTYPE 獲取服務(wù)器數(shù)據(jù)類型; RequestCmdLIST 獲取文件列表;除了九個 FTP 命令執(zhí)行類還有 兩個 命令幫助類。 RequestCmdXXX 系列類為模板類,其模版參數(shù)為 OutputLog。如遠(yuǎn)程訪問命令的日志輸出在界面上,而下載命令的日志主要是為了方便調(diào)式,并不顯示。簡潔的接口設(shè)計,提供了外界管理上的方便。只需加入相關(guān)的 RequestCmdXXX 類,然后在 FTP 命令控制類中添加相關(guān)的調(diào)用方式即可。將下載任務(wù)分配給下載線程,由下載線程下載數(shù)據(jù)并返回實時的下載速率信息。 下載控制類與下載線程之間的通信采用 Qt的 QEvent事件機(jī)制。 QEvent是 Qt所有事件的基類,要定義自己的事件,則需要派生自 QEvent。下載系統(tǒng)自定義事件的代碼實現(xiàn)為: class DdEvent : public QEvent { public: enum {Data = QEvent::User + 0x01}。 DdEvent():QEvent((QEvent::Type)Data){} DdRange range。有開始和長度組成 DD_CMD cmd。 //線程指針 }。東華理工大學(xué)畢業(yè)設(shè)計(論文) 系統(tǒng)功能的詳細(xì)設(shè)計和實現(xiàn) 27 控制類接收到事件后則分配任務(wù)給該線程。這里涉及到下載模塊的數(shù)據(jù)結(jié)構(gòu)。 DdInfo是下載線程 DdThread的數(shù)據(jù)結(jié)構(gòu)。 DdInfoEx派生類中存儲了數(shù)據(jù)管理信息。 DdInfoEx采用引用技術(shù)的方式維護(hù)生命周期。簡單的計算方法是,根據(jù)線程分配額度確定 50M的數(shù)據(jù)塊需要多少個線程下載,再根據(jù)文件大小計算出實際的線程數(shù)。 創(chuàng)建下載線程后,線程執(zhí)行初始化過程,初始化完畢后通過 QEvent事件機(jī)制發(fā)送一個 R_IDLE空閑事件給 DdController。找到需要下載的數(shù)據(jù)塊,將數(shù)據(jù)塊的范圍發(fā)送給下載線程下載。 //一個結(jié)構(gòu)體,定義了 start 和 len兩個變量 東華理工大學(xué)畢業(yè)設(shè)計(論文) 系統(tǒng)功能的詳細(xì)設(shè)計和實現(xiàn) 28 if (info()) //如果未下載數(shù)組為空 { = 0。 return range。
點擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1