《Visual_C++網(wǎng)絡(luò)編程技術(shù)-03》由會員分享,可在線閱讀,更多相關(guān)《Visual_C++網(wǎng)絡(luò)編程技術(shù)-03(26頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,單擊此處編輯母版標(biāo)題樣式,網(wǎng)絡(luò)編程技術(shù),文件傳輸,授課教師:,網(wǎng)絡(luò)編程,導(dǎo)入,在電子教室軟件系統(tǒng)中,教師經(jīng)常需要通過教師機(jī)向所有學(xué)生下發(fā)文件,傳遞授課資料,有時(shí)也需要學(xué)生將完成的作業(yè)上傳到教師機(jī),這就涉及到一個(gè)文件傳輸?shù)膯栴},本章我們就通過一個(gè)簡單的文件傳輸程序。,本章要點(diǎn),文件傳輸功能分析設(shè)計(jì),文件操作編程技術(shù),多線程編程技術(shù),文件下發(fā)程序?qū)崿F(xiàn),功能需求分析,包含兩個(gè)程序,一個(gè)發(fā)送端程序,一個(gè)接收端程序。,發(fā)送端程序可以由用戶選擇要發(fā)送的文件。,發(fā)送端程序可以指定發(fā)送對象,可以是一個(gè),IP,范圍,也可以是某個(gè),IP,地址。,接收端
2、程序可以由用戶指定接收到的文件的存放地址。,界面設(shè)計(jì),關(guān)鍵技術(shù)分析,文件傳輸?shù)谋举|(zhì)用一句話概括就是:發(fā)送方將文件數(shù)據(jù)讀出來,然后調(diào)用套接字的發(fā)送函數(shù)將數(shù)據(jù)傳輸?shù)浇邮辗?,接收方調(diào)用套接字接收函數(shù)接收數(shù)據(jù),然后重新建立文件并將數(shù)據(jù)寫入文件。,文件傳輸流程,發(fā)送文件功能的實(shí)現(xiàn),接收文件功能的實(shí)現(xiàn)流程,代碼詳解,文件操作,CFile,類:,CFile,類是,MFC,文件類的基類,提供非緩沖方式的二進(jìn)制磁盤輸入、輸出功能;并直接通過派生類來支持文本文件和內(nèi)存文件。提供訪問本地文件內(nèi)容的功能,不支持訪問網(wǎng)絡(luò)文件的功能。,使用,CFile,操作文件的基本過程是:,定義,CFile,對象,打開要操作的文件,對
3、文件,/,寫文件,關(guān)閉文件,文件操作,Open(),函數(shù),該函數(shù)的功能是打開指定文件。,BOOL,CFile:Open(LPCTSTR,lpszFileName,UINT,nOpenFlags,CFileException,*,pException,),參數(shù),lpszFileName,:帶完整路徑的文件名,指定要打開的文件。,參數(shù),nOpenFlags,:指定文件打開方式,可以是多個(gè)標(biāo)志的組合。,文件操作,Read(),函數(shù),該函數(shù)的功能是從文件中讀取文件內(nèi)容。,virtual UINT,CFile:Read,(void*,lpBuf,UINT,nCount,);,參數(shù),lpBuf,:存放讀出
4、的文件內(nèi)容的空間地址。,參數(shù),nCount,:從文件讀出的最大字節(jié)數(shù)。,文件操作,Write(),函數(shù),該函數(shù)的功能是向文件中寫數(shù)據(jù),virtual void Write(const void*,lpBuf,UINT,nCount,);,參數(shù),lpBuf,:存儲要寫入文件的數(shù)據(jù)的空間地址。,參數(shù),nCount,:要寫入文件的數(shù)據(jù)的字節(jié)數(shù)。,文件操作,Close(),函數(shù),功能是關(guān)閉文件句柄。,文件操作完畢必須調(diào)用,Close(),函數(shù)關(guān)閉文件。,第一步程序擴(kuò)展,實(shí)現(xiàn)較大文件的傳輸,上面文件傳輸實(shí)例的功能并不強(qiáng)大,但是它的實(shí)現(xiàn)過程很簡單,說明了文件傳輸?shù)脑怼?它忽略了真實(shí)文件的大小,在上面的代
5、碼中,為了從文件中讀取數(shù)據(jù),首先獲得文件長度,然后開辟一段和文件長度匹配的內(nèi)存作為文件緩沖。但現(xiàn)在很多文件動輒幾百兆字節(jié),往往無法一次開辟如此大的內(nèi)存容納如此多的數(shù)據(jù)。所以對于大文件傳輸,這段代碼顯然不合適。,解決方法:,分段緩沖文件數(shù)據(jù)。,實(shí)現(xiàn)方法詳見代碼,第二步程序擴(kuò)展,同時(shí)向多個(gè)目標(biāo)傳輸文件,教師機(jī)通常需要控制整個(gè)教室所有的學(xué)生機(jī),需要進(jìn)行一對多的文件傳輸,需要用戶在界面上指出需要發(fā)送文件的對象(例如學(xué)生機(jī)的,IP,地址范圍),考慮傳輸效率,,,需要采用多線程技術(shù)。,什么是多線程技術(shù)?,多線程是為了同步完成多項(xiàng)任務(wù),多線程不是為了提高運(yùn)行效率,而是為了通過提高資源使用效率來提高系統(tǒng)的效率
6、。,線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行,也可以把它理解為代碼運(yùn)行的上下文。,線程負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。,實(shí)現(xiàn)發(fā)送文件功能的主線程流程,多線程實(shí)現(xiàn)代碼,在本程序中,多線程編程涉及三處代碼,第一處是創(chuàng)建一個(gè)新線程,使用,CreateThread,函數(shù):,CreateThread(NULL,0,SendFileThread,(LPVOID)pMeg,NULL,NULL);,函數(shù),CreateThread,是微軟在,Windows API,中提供的,可用于建立新線程。,CreateThread,將在主線程的基礎(chǔ)上創(chuàng)建一個(gè)新線程
7、。,多線程實(shí)現(xiàn)代碼,第二處是定義線程函數(shù):,ULONG WINAPI,SendFileThread(LPVOID,p);,SendFileThread,是線程的名字,可根據(jù)需要自行定義,應(yīng)該定義在對應(yīng)的頭文件中,且一定要定義為全局的。,多線程實(shí)現(xiàn)代碼,第三處是線程函數(shù)的實(shí)現(xiàn):,ULONG WINAPI,SendFileThread(LPVOID,p),/,此處寫實(shí)現(xiàn)線程具體功能的代碼,線程的參數(shù)傳遞,考慮到在創(chuàng)建每個(gè)新線程時(shí),需要將待發(fā)送文件的地址和發(fā)送對象的,IP,地址傳遞給新線程,因此需要傳遞兩個(gè)字符串參數(shù)給線程,按照創(chuàng)建線程函數(shù)的定義,只能傳遞一個(gè)指向結(jié)構(gòu)的指針,因此需要定義一個(gè)結(jié)構(gòu)體,
8、專門存放需要傳遞給線程的數(shù)據(jù)。結(jié)構(gòu)體定義如下:,typedef,struct,char ip15;/,文件傳遞目的地,IP,char fileAddr50;/,帶路徑的文件名,myMeg,;,線程的參數(shù)傳遞,myMeg,*,pMeg,;/,定義一個(gè)指向,myMeg,結(jié)構(gòu)體的指針,pMeg,=(,myMeg,*),malloc(sizeof(myMeg,);/,給指針分配空間,memcpy(pMeg,-ip,ip,15);/,將,IP,地址放入結(jié)構(gòu)體,memcpy(pMeg,-fileAddr,file,50);/,將文件地址放入結(jié)構(gòu)體,CreateThread(NULL,0,SendFileT
9、hread,(LPVOID)pMeg,NULL,NULL);,/,創(chuàng)建一個(gè)新線程,將結(jié)構(gòu)體指針作為參數(shù)傳遞給線程,線程的參數(shù)傳遞,在新線程中,可以從參數(shù)中取出對應(yīng)的數(shù)據(jù),代碼如下:,ULONG WINAPI,SendFileThread(LPVOID,p),myMeg,*meg=(,myMeg,*)p;,CString,strIP,=meg-,ip,;,CString,fileAddr,=meg-,fileAddr,;,本章技能訓(xùn)練實(shí)例,網(wǎng)絡(luò)考試報(bào)名系統(tǒng)擴(kuò)展,實(shí)驗(yàn)題目:多線程考試報(bào)名系統(tǒng)服務(wù)器的實(shí)現(xiàn),實(shí)驗(yàn)?zāi)康模赫莆斩嗑€程編程技術(shù)和文件操作技術(shù),要求:服務(wù)器端采用多線程技術(shù),在線程中使用循環(huán)接收客戶的報(bào)名信息。,Thank You!,