




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程設(shè)計(jì)說(shuō)明書(shū)
此設(shè)計(jì)模板的紅色部分都是你要修改的,小標(biāo)題可以酌情增刪
這句話刪掉
學(xué)生信息
課程設(shè)計(jì)信息
課程名稱計(jì)算機(jī)視覺(jué)課程設(shè)計(jì)
課程設(shè)計(jì)題目智能相冊(cè)
課程設(shè)計(jì)時(shí)間「8周
小組情況一人一組指導(dǎo)教師董帥
批改情況
目錄
1.課程設(shè)計(jì)內(nèi)容.....................................................3
2.課程設(shè)計(jì)目的.....................................................3
3.背景知識(shí).........................................................3
4.工具/準(zhǔn)備工作...................................................3
5.設(shè)計(jì)步驟與方法..................................................4
5.1.步驟1:設(shè)計(jì)客戶端與服務(wù)器端的通信協(xié)議...............................4
5.1.1.步驟1.1:客戶端與服務(wù)器端的交互協(xié)議設(shè)計(jì).............................4
5.1.2.步驟1.2:服務(wù)器端與客戶端數(shù)據(jù)交互協(xié)議................................4
5.2.步驟2:編寫(xiě)服務(wù)器端...................................................4
5.2.1.步驟2.1:設(shè)計(jì)服務(wù)器的多用戶響應(yīng)....................................4
5.2.2.步驟2.2:設(shè)計(jì)服務(wù)器服務(wù)線程.........................................5
5.3.步驟3:客戶端設(shè)計(jì).....................................................7
5.4.步驟3:設(shè)計(jì)程序的界面................................................10
6.軟件測(cè)試截圖....................................................11
7.設(shè)計(jì)結(jié)果及分析.................................................12
8.設(shè)計(jì)結(jié)論........................................................12
9.問(wèn)題及心得體會(huì).................................................12
10.對(duì)本設(shè)計(jì)過(guò)程及方法、手段的改進(jìn)建議.............................12
11.任務(wù)分配........................................錯(cuò)誤!未定義書(shū)簽。
12.參考文獻(xiàn)........................................................12
13.課程設(shè)計(jì)評(píng)價(jià)(教師)..............................................12
如果你修改了下面的標(biāo)題,請(qǐng)更新目錄的域,并刪掉這句話
課程設(shè)計(jì)報(bào)告
1.課程設(shè)計(jì)內(nèi)容
本課程設(shè)計(jì)的內(nèi)容是設(shè)計(jì)一個(gè)基于QT的文件傳輸軟件,支持多用戶以及文
件的斷點(diǎn)續(xù)傳。
2.課程設(shè)計(jì)目的
考察自己對(duì)課程的掌握程度,以及自己實(shí)際的動(dòng)手能力,編程能力。
3.背景知識(shí)
TCP/IP協(xié)議的原理
QT軟件的應(yīng)用
4.工具/準(zhǔn)備工作
硬件:
安裝有VS2012的PC機(jī)一臺(tái)
軟件:
Windows10操作系統(tǒng)
VS2012
Opencv3.1.4
5.設(shè)計(jì)步驟與方法
5.1.步驟1:設(shè)計(jì)客戶端與服務(wù)器端的通信協(xié)議
1、客戶端與服務(wù)器端的請(qǐng)求協(xié)議
2、服務(wù)器端與客戶端數(shù)據(jù)交互協(xié)議
5?1.1.步驟客戶端與服務(wù)器端的交互協(xié)議設(shè)計(jì)
幀總長(zhǎng)|請(qǐng)求類型|參數(shù)…|
說(shuō)明:
請(qǐng)求下載列表
幀總長(zhǎng)I列表Ix|
請(qǐng)求下載文件
幀總長(zhǎng)|文件|文件路徑|文件傳輸起始位|
5.1.2.步驟1.2:服務(wù)器端與客戶端數(shù)據(jù)交互協(xié)議
I幀總長(zhǎng)I列表/文件I數(shù)據(jù)I
52步驟2:編寫(xiě)服務(wù)器端
521.步驟2.1:設(shè)計(jì)服務(wù)器的多用戶響應(yīng)
重寫(xiě)了QTcpServer的虛函數(shù),實(shí)現(xiàn)了每當(dāng)一個(gè)客戶端訪問(wèn)服務(wù)器是,開(kāi)啟一
個(gè)線程響應(yīng)客戶端的請(qǐng)求。
voidDownloadServer::incomingConnection(inthandle)
(
DownloadThread"Thread=newDownloadThread(handle,this);
Thread->start();
1
5.2.2.步驟2.2:設(shè)計(jì)服務(wù)器服務(wù)線程
在這個(gè)函數(shù)中,線程主要負(fù)責(zé)兩件事情,一、完成對(duì)客戶端請(qǐng)求的解析;二、
響應(yīng)客戶端請(qǐng)求。
voidDownloadThread::run()
(
qinl64nexlBlockSize;
QStringReqFileName;
qint64ReqFiIeStartPos,BytesRemaining;
QTcpSocketToClient;
ToClient.setSocketDescriptor(handel);
ToClient.wailForReadyReadO;
nextBlockSize=0;
QByteArrayOutBlock;
QDataStrcamout(&OutBlock,QIODevice::WriteOnly);
out.selVersion(QDataStream::Qt_4_6);
QDataStreamin(&ToClient);
in.setVersion(QDataStream::Qt_4_6);
if(nextBlockSize==0)
{
if(ToClient.bytesAvailable()<sizeof(qint64))
return;
in?nextBlockSize;
}
if(ToClient.bytesAvaiIable()<nextBlockSize)
return;
qint64RcqTypc;
in?ReqType;
switch(ReqType)〃確定客戶端的請(qǐng)求
(
caseReq_Lisl:〃下載列表請(qǐng)求
OutBlock.clear();
out?qint64(0)?qint64(0)?Server_List;
out.device()->seek(0);
out?qint64(OutBlock.sizc()-sizeof(qint64));
ToClient.write(OutBlock);
ToClient.fiush();
ToClient.waitForBytesWritten();
in?qint64(0xFFFFFFFF);
ToClicnt.flush();
ToClient.waitForBytesWrilten();
break;
caseReq_File:〃文件傳輸請(qǐng)求
in?ReqFileName;
in?ReqFileSlartPos;
printf(ReqFileName+":"+QString::number(ReqFileS(artPos)+"\n");
QFile*ReqFile=newQFile(ReqFileName);
ReqFile->open(QIODevice::ReadOnly);
RcqFile->seek(RcqFileStartPos);
BytesRemaining=ReqFile->size();
OutBlock.clear();
out?qint64(0)?qint64(2)?BytesRemaining;
out.dcvicc()->scck(0);
out?qint64(OutBlock.size()-sizeof(qint64));
ToClient.write(OutBlock);
ToClient.waitForBytesWritten();
whilc(!RcqFilc->atEnd())
(
printf(nBytesRemaining:"+QString::number(BytesRemaining)+"\n");
QByteArray_data,filedat;
QDataStreamFileBlock(&_data,QlODevice::WriteOnly);
FileBlock.setVersion(QDataStream::Qt_4_6);
filcdat=RcqFilc->read(FilcBlockSize);
FileBlock?qint64(0)?qint64(1)?filedat;
FileBlock.device()->seek(0);
FileBlock?qint64(_data.size()-sizeof(qint64));
ToClient.writeQdata);
ToClicnt.flush();
ToClient.waitForBytesWritten();
BytesRemaining-=filedat.size();
)
in?qint64(0xFFFFFFFF);
ToClicnt.flush();
ToClient.waitForBytesWrilten();
break;
);
nextBlockSize=0;
ToClient.disconnectFromHost();
ToClient.close();
5.3.步驟3:客戶端設(shè)計(jì)
功能實(shí)現(xiàn):1、向服務(wù)器端發(fā)送請(qǐng)求
2、等待接收服務(wù)器傳來(lái)的數(shù)據(jù)
具體實(shí)現(xiàn)代買如下
向服務(wù)器端發(fā)送請(qǐng)求:
voidMyClicnt::ScndRcquest(shortOpt)
(
ToServer=newQTcpSocket(this);
SocketState=false;
connect(ToServer,SIGNAL(connected()),this,SLOT(isConnectcd()));
connect(ToServer,SIGNAL(readyRead()),this,SLOT(getData()));
connect(ToServer,SIGNAL(disconnected()),ToServer,SLOT(deleleLater()));
ConnectToServer(HostlP);
QByteArrayReqBlock;
QDataStreamout(&ReqBlock,QIODevice::WriteOnly);
out.sctVcrsion(QDataStrcam::Qt_4_6);
switch(Opt)
(
caseDownIoad_List:
out?qint64(0)?qint64(Down!oad_List);
out.dcvicc()->scck(0);
out?qint64(ReqBlock.size()-sizeof(qint64));
break;
caseDownload_File:
out?qint64(0)?qint64(Download_File)?FileName?FileStartPos;
out.device()->seek(0);
out?qint64(ReqBlock.size()-sizeof(qint64));
Target_File=new
QFile(FileName.right(FileName.size()-FileName.lastIndexOf(7,)-l));
Target_File->open(QlODevice::WriteOnly|QlODcvice::Append);
break;
default:
break;
);
ToServer->write(ReqBlock);
)
等待服務(wù)潛傳來(lái)的數(shù)據(jù)
voidMyClicnt::gctData()
{
qint64FrameType;
QDataStreamin(ToServer);
in.setVersion(QDataStream::Qt_4_6);
forever
printf(QString::number(ToServer->bytesAvailable())+"\nn);
if(nextBlockSize==0)
if(ToServer->bytesAvailable()<sizeof(qint64))
(
printfC'breaknn");
break;
}
in?nextBlockSize;
printf(,'size:"+QString::number(nextBlockSize)+',\nM);
)
if(nextBlockSize==qint64(0xFFFFFFFF)i
(
printf(nbreak2\n");
QMcssagcBoxmsgBox;
msgBox.setIcon(QMessageBox::Informalion);
msgBox.setText("Transmisiondone!");
msgBox.exec();
nextBlockSize=0;
break;
)
if(ToServer->bytesAvailable()<nextBlockSize)
{
printf("break3\n");
break;
1
in?FrameType;
printf(',type:"+QString::number(FrameType)+',\nn);
if(Is_List_Itcm==FrameTypc)
(
in?Client_List;
if(Client_List.size()==0)
(
)
else
emitListUpdataed();
)
elseif(Is_File_Data==FrameType)
(
printf("writeData\n");
QByteArrayFileData;
in?FileData;
Target_File->write(FileData);
Target_File_Info->open(QIODevice::WriteOnly);
Target_File_Info->write(QString::number(Target_File->size()));
Target_File_Info->close();
NowFileSize=Target_File->size();
//emitProgressBarUpdata(Target_File->size(),FileSize);
if(Targct_Filc->sizc()==FilcSizc)
(
Target_File_Info->remove();
Target_File->close();
I
1
elseif(Is_File_Size==FrameType)
(
in?FileSize;
TotalFileSize=FileSize;
printf(,,FileSize:,'+QString::number(FileSize)+,,\nH);
}
nextBlockSize=0;
)
)
54步驟3:設(shè)計(jì)程序的界面
1.利用QTCreator為程序設(shè)計(jì)一個(gè)良好的用戶交互界面
客戶端服務(wù)器端
6.軟件測(cè)試截圖
設(shè)置下載列表獲取下載列表下載中
QFileTransport
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 針織橫機(jī)電控產(chǎn)業(yè)分析報(bào)告
- 南瓜收購(gòu)合同范本
- 養(yǎng)殖用電合同范本
- 賣窯洞合同范本
- 一般經(jīng)濟(jì)購(gòu)買合同范本
- 商業(yè)地租地合同范本
- 二手貨購(gòu)銷合同范本
- 三年級(jí)學(xué)生學(xué)習(xí)計(jì)劃
- 三農(nóng)問(wèn)題的調(diào)查報(bào)告
- 個(gè)人現(xiàn)金贈(zèng)與合同范本
- 骶髂關(guān)節(jié)損傷郭倩課件
- 內(nèi)科學(xué)疾病概要-支氣管擴(kuò)張課件
- 2025陜西渭南光明電力集團(tuán)限公司招聘39人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 預(yù)防感冒和流感的方法
- 2024年黑龍江職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2024年南京旅游職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 股指期貨基礎(chǔ)知識(shí)介紹培訓(xùn)課件
- 2024年北京東城社區(qū)工作者招聘筆試真題
- xx學(xué)校培訓(xùn)部工作職責(zé)
- T-GXAR 005-2024 制冷機(jī)房運(yùn)行維護(hù)規(guī)程
- 開(kāi)工第一課安全培訓(xùn)總結(jié)精彩
評(píng)論
0/150
提交評(píng)論