流媒體視頻點播系統(tǒng)畢業(yè)論文_第1頁
流媒體視頻點播系統(tǒng)畢業(yè)論文_第2頁
流媒體視頻點播系統(tǒng)畢業(yè)論文_第3頁
流媒體視頻點播系統(tǒng)畢業(yè)論文_第4頁
流媒體視頻點播系統(tǒng)畢業(yè)論文_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

PAGE學(xué)校代碼:學(xué)號:學(xué)校代碼:學(xué)號:本科畢業(yè)設(shè)計說明書(題題目:流媒體點播系統(tǒng)學(xué)生姓名:學(xué)院:系別:專業(yè):班級:指導(dǎo)教師:二〇一四年六月內(nèi)蒙古工業(yè)大學(xué)本科畢業(yè)設(shè)計說明書摘要隨著生活水平的提高,互聯(lián)網(wǎng)越發(fā)成為人們生活的重要組成部分。上網(wǎng)看電影和玩游戲是主要的網(wǎng)絡(luò)娛樂的重要分支,數(shù)據(jù)表明該類需求比重在未來將長時間持續(xù)增長。在當今多媒體時代,以往電視機模式(運營商方主動播放,客戶被動接收)已經(jīng)不再能夠滿足用戶的需求,用戶希望能根據(jù)自身喜歡,選擇性對視頻內(nèi)容進行觀看。寬帶VOD視頻點播技術(shù)因良好的人機交互性和流媒體傳輸技術(shù)倍受教育、娛樂等行業(yè)青睞。隨著互聯(lián)網(wǎng)的迅速崛起,C/S結(jié)構(gòu)的系統(tǒng)可以在任何一臺的計算機上使用,系統(tǒng)的部署和維護只是在服務(wù)器上進行,這樣的模式既能減少管理的成本,更重要的是它能很方便的實現(xiàn)用戶與系統(tǒng)的交互,更快地響應(yīng)用戶信息交互請求。本文從視頻點播系統(tǒng)的基本概念和流媒體技術(shù),實時網(wǎng)絡(luò)傳輸協(xié)議等方面講述了視頻點播系統(tǒng)的設(shè)計原理、軟件結(jié)構(gòu)和設(shè)計實現(xiàn),采用C/S模式開發(fā)一個方便易用的視頻點播系統(tǒng)。本視頻點播系統(tǒng)基于MFC編程思想,在微軟VisualC++6.0的開發(fā)平臺上設(shè)計,實現(xiàn)了點播服務(wù)器端和客戶端的相關(guān)功能。在服務(wù)器端實現(xiàn)用戶視頻文件的添加、刪除、修改、顯示等功能。客戶端主要實現(xiàn)服務(wù)器端視頻的查找、下載、播放等功能。采用基本的Access數(shù)據(jù)庫,易于實現(xiàn),方便對數(shù)據(jù)庫進行管理。關(guān)鍵字:流媒體;視頻點播;C/S模式AbstractWiththeimprovementoflivingstandards,theInternetincreasinglybecomeanimportantpartofpeople'slife.Watchingmoviesandplayingonlinegamesisanimportantbranchofthemainonlineentertainment,datashowthatthiskindofdemandwillbesustainedgrowthforalongtimeinthefuture.Intoday'smultimediaera,pasttheTVmodel(operatorsideplayactively,passivereceivingcustomer)arenolongerabletomeettheneedsofusers,usershopetobeabletoaccordingtotheirownlikes,selectivitytowatchthevideocontent.WiththerapidriseoftheInternet,theC/Sstructureofthesystemcanbeusedonanyofthecomputer,deploymentandmaintenanceofsystemwasdoneontheserver,thismodelcannotonlyreducethecostofmanagement,moreimportantisthatitcanbeveryconvenientforuserinteractionwiththesystem,fasterresponsetoauserinteractiveinformationrequest.Thisarticlefromthebasicconceptofvideoondemandsystemandstreamingmediatechnology,real-timenetworktransmissionprotocolaspectsaboutthedesignofvideoondemandsystemprinciple,softwarestructureanddesign,usingC/Smodetodevelopaconvenientandeasytousevideoondemandsystem.Thisvideoondemandsystemmainlyimplementstheclientandserverrelatedfunctions.Clientimplementationmainservervideosearch,download,play,etc.Becausethissystemisasmallsystem,weadoptthebasicAccessdatabase,easytoimplement,easytomanagedatabase.Keywords:Streamingmedia;Videoondemand.C/Smode目錄TOC\o"1-3"\h\z\u引言 1第一章系統(tǒng)簡介 21.1流媒體相關(guān)概念 21.2流媒體傳輸相關(guān)原理 21.3VOD視頻點播概念 31.4VOD視頻點播系統(tǒng)構(gòu)成 3第二章開發(fā)環(huán)境及工具介紹 52.1VisualC++6.0 52.1.1VisualC++6.0 52.1.2MFC編程框架介紹 52.2數(shù)據(jù)庫平臺 52.3系統(tǒng)運行環(huán)境 6第三章系統(tǒng)分析與設(shè)計 73.1系統(tǒng)核心角色與功能 83.2系統(tǒng)界面 93.3軟件的基本架構(gòu) 103.4軟件的系統(tǒng)架構(gòu) 103.5系統(tǒng)數(shù)據(jù)庫設(shè)計 11第四章系統(tǒng)實現(xiàn) 134.1服務(wù)端界面實現(xiàn) 134.1.1DataGrid控件 174.1.2DataGrid控件的使用 174.2客戶端界面實現(xiàn) 184.3數(shù)據(jù)庫的訪問和操作 194.4網(wǎng)絡(luò)通信 23第五章系統(tǒng)測試 275.1功能測試 27結(jié)論 28參考文獻 29謝辭 30PAGE30引言隨著人們生活水平的普遍提高,互聯(lián)網(wǎng)在人們的生活中所占的地位也越來越高,所以人們利用網(wǎng)絡(luò)傳輸圖片、語音和視頻信息的需求也越來越大。音視頻文件存儲時所占的體積一般都很龐大。雖然網(wǎng)絡(luò)的傳輸速度在不斷的提高,但是鑒于巨大的需求,網(wǎng)絡(luò)帶寬還是十分有限的,花幾分鐘甚至更長的時間來下載一個音頻或者視頻文件,是一件很讓人痛苦的事。但隨著流媒體技術(shù)的出現(xiàn),在一定的程度上使得網(wǎng)絡(luò)傳輸音視頻信息比較緩慢的情況得到明顯的改善。傳統(tǒng)的音視頻文件的播放需要完全下載后才能播放,要下載一個文件需要花費少則幾分鐘多則數(shù)小時。當時如果采用流媒體傳輸技術(shù),就可實現(xiàn)數(shù)據(jù)的流式傳輸。使用流媒體技術(shù),服務(wù)器端將聲音、影像或者動畫連續(xù)且不間斷的傳送給客戶端,因此用戶想要觀看就不必等到整個文件都下載完成,而只需經(jīng)過幾秒鐘或幾十秒鐘的啟動緩沖就可以進行觀看,文件的剩余部分還會繼續(xù)從服務(wù)器端繼續(xù)下載。因此,本文從流媒體點播系統(tǒng)的基本概念和流媒體技術(shù)特點、實時網(wǎng)絡(luò)傳輸協(xié)議等方面講述了該視頻點播系統(tǒng)的設(shè)計原理、軟件結(jié)構(gòu)和設(shè)計實現(xiàn)等過程,開發(fā)實現(xiàn)了一個基于方便易用服務(wù)端/客戶端模式的流媒體點播系統(tǒng)。第一章系統(tǒng)簡介本文中主要論述的是流媒體視頻點播系統(tǒng),所以在本章對VOD流媒體視頻點播相關(guān)概念簡單介紹以便于理解本文的后續(xù)內(nèi)容。1.1流媒體概念簡介流媒體(StreamingMedia)指在數(shù)據(jù)網(wǎng)絡(luò)上按時間先后次序傳輸和播放的連續(xù)音/視頻數(shù)據(jù)流。流媒體技術(shù)是一種專門用于網(wǎng)絡(luò)多媒體信息傳播和處理的新技術(shù),該技術(shù)能夠在網(wǎng)絡(luò)上實現(xiàn)傳播和播放同時進行的實時工作模式,相對于其他的一些音、視頻網(wǎng)絡(luò)傳輸和處理技術(shù),流媒體比較成熟和使用,目前已經(jīng)成為網(wǎng)上音、視頻(特別是實時音視頻)傳輸?shù)闹饕鉀Q方案。流媒體與常規(guī)視頻媒體之間的不同在于,流媒體可以邊下載邊播放。“流”的重要作用體現(xiàn)在可以明顯的節(jié)省時間,由于常規(guī)視頻媒體文件比較大,并且只能下載下來后才能播放,因此下載需要很長的時間,妨礙了信息的流通。流媒體的應(yīng)用是近幾年來Internet發(fā)展的產(chǎn)物,廣泛應(yīng)用于:視頻廣播、視頻點播(VOD)、視頻監(jiān)視、遠程教學(xué)、交互式游戲、視頻會議等。總之,目前基于流媒體的應(yīng)用形式很多,并且發(fā)展也非常快。1.2流媒體傳輸相關(guān)原理如果將音視頻文件的傳輸看作是一次接水的過程,那么過去的傳輸方式必須要等到一桶水接滿了才能使用它,但是這個等待的時間受到水流量的大小和桶的大小的影響。然而流式傳輸則是,把水頭龍打開,等待一小會,水就會源源不斷地流出來,并且可以做到隨接隨用。從這個意義上看,用流媒體這個詞是還是非常形象的。順序流式傳輸和實時流式傳輸是流媒體技術(shù)的主要特征。順序流式傳輸是順序下載,在下載文件的同時用戶可觀看再線媒體,在給定時刻,用戶只能觀看已下載的那部分,而不能跳到還未下載的前頭部分,順序流式傳輸不象實時流式傳輸在傳輸期間根據(jù)用戶連接的速度做調(diào)整。這就意味著用戶在觀看媒體文件前,必須經(jīng)過延遲,對較慢的連接更是如此。它也不支持現(xiàn)場廣播,從某種意義上說,它是一種點播技術(shù)。實時流式傳輸指保證媒體信號帶寬與網(wǎng)絡(luò)連接配匹,使媒體可被實時觀看到。實時流需要專用的流媒體服務(wù)器與傳輸協(xié)議與HTTP流式傳輸不同。實時流式傳輸總是實時傳送,特別適合現(xiàn)場事件,也支持隨機訪問,用戶可快進或后退以觀看前面或后面的內(nèi)容。視頻點播概念VOD(Video

On

Demand)即視頻點播的意思,它是一種可以按用戶需要點播節(jié)目的交互式視頻系統(tǒng)。視頻點播是一個用戶控制的視頻分配業(yè)務(wù),它允許每個用戶可以交互地訪問存儲在遠程服務(wù)器上的媒體信息。隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,交互電視技術(shù)(ITV)、網(wǎng)絡(luò)視頻點播技術(shù)(VOD)等多媒體技術(shù)在網(wǎng)絡(luò)系統(tǒng)中或Internet/Intranet中的應(yīng)用進入了一個新的里程。網(wǎng)絡(luò)多媒體技術(shù)的核心概念就是流(streaming)。1.4VOD視頻點播系統(tǒng)構(gòu)成VOD視頻點播系統(tǒng)一般是由視頻服務(wù)器和客戶端和瀏覽器端組成的。它們之間通過網(wǎng)絡(luò)通信系統(tǒng)建立連接。結(jié)構(gòu)圖如下:

服務(wù)端服務(wù)端客戶端網(wǎng)絡(luò)通信圖1-1VOD視頻點播系統(tǒng)結(jié)構(gòu)圖 該視頻點播系統(tǒng)的工作流程為:用戶用客戶端通過互聯(lián)網(wǎng),向服務(wù)器發(fā)出需求連接請求。如果客戶端的請求能夠到服務(wù)器并被服務(wù)器接收。一旦通過請求驗證后,服務(wù)器會把服務(wù)器數(shù)據(jù)庫上的節(jié)目單返回給客戶端。用戶客戶端播放器上會顯示可點播節(jié)目,用戶選擇需要的節(jié)目后,服務(wù)器就從媒體數(shù)據(jù)庫服務(wù)器中取出相應(yīng)的媒體內(nèi)容數(shù)據(jù)流。最后通過網(wǎng)絡(luò)把數(shù)據(jù)流傳送給客戶端,客戶端用播放器播放。1、視頻點播服務(wù)器(Server)

視頻點播服務(wù)器是為視頻需求客戶提供持續(xù)且穩(wěn)定的音視頻數(shù)據(jù)流的設(shè)備。音視頻文件存儲在視頻服務(wù)器的存儲空間中,服務(wù)器端配置的硬盤大小決定了存儲的節(jié)目的量,例如以MPEG-2(1.5Mbps)格式存放150個小時的節(jié)目,需要80G左右的硬盤空間。

2、客戶端系統(tǒng)(Player)

客戶端是用戶與服務(wù)器之間建立連接并能夠進行交互操作的平臺。客戶播放器位于客戶端,是用戶根據(jù)自己需求點播節(jié)目的系統(tǒng)。它負責(zé)向服務(wù)器發(fā)送通信請求,獲得節(jié)目的相關(guān)信息,服務(wù)器能夠?qū)⒐?jié)目單顯示給客戶,由客戶來選擇和播放、所點播的節(jié)目。當有很多客戶端同時收看同一節(jié)目卻不引起網(wǎng)絡(luò)擁塞,也不會降低音、視頻傳輸質(zhì)量。播放器的優(yōu)點有:便于操作,界面友好。第二章開發(fā)工具及系統(tǒng)運行環(huán)境介紹軟件開發(fā)的語言有很多,但程序的開發(fā)只有找一個功能強大,易于掌握易用且適合自己的就可以了。本系統(tǒng)通過多種語言優(yōu)缺點的對比,我采用了VisualC++6.0的MFC應(yīng)用程序框架作為本系統(tǒng)開發(fā)語言,以Access數(shù)據(jù)庫作后臺數(shù)據(jù)支持。本章將中主要論述的是開發(fā)VOD流媒體視頻點播系統(tǒng)所使用的開發(fā)環(huán)境及開發(fā)工具,通過對開發(fā)環(huán)境及工具的介紹便于讀者深入了解本系統(tǒng)。VisualC++6.0簡介2.1.1本系統(tǒng)采用VisualC++6.0作為后臺開發(fā)工具。VisualC++6.0是由美國的微軟公司推出的一個極其強大的Windows應(yīng)用程序開發(fā)平臺。VisualC++6.0不僅是一個C++的編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrateddevelopmentenvironment,IDE)。VisualC++6.0是由許多組件組成的,其中包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lassWizard等開發(fā)工具。這些組件通過一個名為DeveloperStudio的組件集成為一個優(yōu)秀的開發(fā)環(huán)境。2.1.2本系統(tǒng)的編寫使用了在VisualC++6.0平臺下的MFC編程框架。MFC全稱是MicrosoFoundationClasssLibrary我們稱之為微軟基礎(chǔ)類庫,程序框架,封裝了絕大多數(shù)Win32API函數(shù),另外還分裝C++語法中的數(shù)據(jù)結(jié)構(gòu)。它是一種ApplicationFramework,隨著微軟VisualC++開發(fā)工具發(fā)布。基于框架編程,能夠提高工作效率,減少開發(fā)周期,節(jié)約開發(fā)成本,減少了軟件開發(fā)人員開發(fā)的工作量。該類庫提供了一組通用的并且可以重用的類庫供開發(fā)人員使用。大部分類均從CObject類直接或間接的派生,只有少部分類例外。MFC應(yīng)用程序的總體結(jié)構(gòu)通常由開發(fā)人員從MFC類派生的幾個類和一個CWinApp類對象(應(yīng)用程序?qū)ο螅┙M成。MFC提供了MFCAppWizard它能自動的生成框架。數(shù)據(jù)庫平臺MFC程序能支持的數(shù)據(jù)庫有很多,因此我們得根據(jù)實際需求使用比較合理的數(shù)據(jù)庫。MicrosoftOfficeAccess是由微軟發(fā)布的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),在很多地方得到廣泛使用,例如小型企業(yè),大公司的部門。Access有強大的統(tǒng)計分析能力、數(shù)據(jù)處理,可以方便的進行各類統(tǒng)計。并可以靈活設(shè)置統(tǒng)計的條件。Access用來開發(fā)軟件,其最大的優(yōu)點是:易學(xué)!非計算機專業(yè)的人員,也能夠很容易的學(xué)會。管理低成本滿足了那些從事企業(yè)管理工作的人員的對數(shù)據(jù)管理需要,通過軟件來規(guī)范同事、下屬的行為,推行其管理思想。本系統(tǒng)的數(shù)據(jù)庫方面,選用的是Access,原因是Access數(shù)據(jù)庫的學(xué)習(xí)極其簡單,而且作為一個流媒體的視頻點播系統(tǒng),它不會像其它系統(tǒng)一樣需要很多表聯(lián)查的環(huán)境和條件那么多,大多數(shù)情況下都只是單表查詢,本系統(tǒng)將采用Access數(shù)據(jù)庫為系統(tǒng)提供數(shù)據(jù)管理。系統(tǒng)運行環(huán)境系統(tǒng)的運行環(huán)境要求為:1.硬件環(huán)境

目前,我們所開發(fā)的系統(tǒng)主要是一個演示系統(tǒng),因此,配置一般的計算機硬件就可以滿足系統(tǒng)需求。如果考慮到現(xiàn)實生活中的應(yīng)用和硬件價格的普遍降低,可以為本系統(tǒng)配置在較優(yōu)秀的服務(wù)器硬件,就能夠充分發(fā)揮本系統(tǒng)性能。

處理器:

IntelCOREi3

或更高

內(nèi)存:

4G(推薦)

硬盤空間:50GB

顯卡:

SVGA顯示適配器

2.軟件環(huán)境

系統(tǒng)體系:C/S(客戶端/服務(wù)器)

操作系統(tǒng):Windows2000/XP、Win7、Win8開發(fā)軟件:MicrosoftVisualC++6.0編程框架:MFC數(shù)據(jù)庫:MSAccess數(shù)據(jù)庫系統(tǒng)分析為了能夠?qū)崿F(xiàn)本系統(tǒng)的各種功能,我們必須對整個系統(tǒng)的所有功能進行詳細的分析。一個好的系統(tǒng)必須要有好的分析,因此本章我們將對本VOD流媒體視頻點播系統(tǒng)做出具體的分析。3.1系統(tǒng)核心角色與功能流媒體點播系統(tǒng)是一個電影等流媒體的網(wǎng)上下載和播放的系統(tǒng)。VOD流媒體視頻點播系統(tǒng)的服務(wù)器端需要實現(xiàn)的功能包括管理員登陸、處理客戶端請求以及音視頻媒體信息的管理等功能。具體來說,它包含系統(tǒng)管理中常見的登錄操作,視頻信息的顯示、插入、刪除,更新操作等。查看用戶信息查看用戶信息Admin增加媒體修改媒體信息刪除媒體瀏覽媒體信息重置用戶密碼用戶資費調(diào)整圖3-1服務(wù)端功能圖CustomCustom客戶登陸客戶自助服務(wù)下載播放查找流媒體 圖3-2客戶端功能圖系統(tǒng)界面登陸界面對話框包括:用戶名稱標簽、密碼標簽、用戶名稱輸入框、密碼輸入框、登陸按鈕、取消按鈕。圖3-3登陸界面圖服務(wù)器端界面:自定義的工具欄按鈕(類型導(dǎo)航、視頻編輯、服務(wù)啟動、服務(wù)停止)、樹控件,DataGrid控件、DlgVideo對話框(新建按鈕、插入按鈕、刪除按鈕、所屬類型組合框、視頻名稱輸入框、視頻描述輸入框等)。 圖3-4服務(wù)器端界面圖客戶端界面包括:WindowsMediaPlayer控件、樹控件。圖3-5客戶端端界面圖3.3軟件的基本架構(gòu) 1.媒體服務(wù)器——存放媒體Media數(shù)據(jù)。現(xiàn)實生活中每個音視頻媒體數(shù)據(jù)所占的內(nèi)存都很大,所以必須要有專門的媒體服務(wù)器來存放這些信息。媒體服務(wù)器必須有很大的內(nèi)存空間,其中全部存放按類型劃分的媒體數(shù)據(jù)。 2.數(shù)據(jù)庫服務(wù)器——存放媒體清單、用戶數(shù)據(jù)。要管理媒體服務(wù)其中的大量數(shù)據(jù),我們需要數(shù)據(jù)庫服務(wù)器來幫助我們管理這些數(shù)據(jù)。數(shù)據(jù)庫中存放媒體的詳細信息和用戶的信息,方便用戶和管理員操作和查詢。3.VOD服務(wù)器管理——后臺管理功能、包括媒體管理、用戶管理等。本系統(tǒng)采用的是C/S架構(gòu),我們的服務(wù)器軟件。服務(wù)器對CPU的要求配置將比較高,因為我們的一臺服務(wù)器,要對應(yīng)成千上萬的客戶端訪問。4.VOD客戶端——登陸媒體服務(wù)器,可以下載數(shù)據(jù)和信息,也可以對媒體數(shù)據(jù)進行播放。3.4軟件的系統(tǒng)架構(gòu)VOD服務(wù)器就是Server端,它是在本地維護各種媒體信息,也提供客戶端訪問處理客戶端的各種請求。它可以訪問VOD數(shù)據(jù)庫服務(wù)器,為了確保數(shù)據(jù)庫安全,通產(chǎn)客戶端不可以訪問VOD數(shù)據(jù)庫服務(wù)器。涉及到訪問數(shù)據(jù)庫的操作,客戶端都需要向服務(wù)器端發(fā)送請求,這樣數(shù)據(jù)庫安全就得到了一定保證。客戶端播放器可以從網(wǎng)站上下載安裝,用戶安裝后供給用戶根據(jù)進行視頻點播。VOD服務(wù)器VOD服務(wù)器VOD數(shù)據(jù)庫服務(wù)器客戶端1客戶端2客戶端3播放器1播放器2播放器3圖3-6系統(tǒng)架構(gòu)圖3.5系統(tǒng)數(shù)據(jù)庫設(shè)計本系統(tǒng)數(shù)據(jù)庫結(jié)構(gòu)的設(shè)計是在完成了系統(tǒng)描述各種數(shù)據(jù)之間的相互依賴關(guān)系和信息已經(jīng)分類的情況下,然后將各種信息轉(zhuǎn)換成對應(yīng)的數(shù)據(jù)項定義表。數(shù)據(jù)項定義表的作用就是定義每個表的表名、表中字段的名稱、數(shù)據(jù)類型的長度和是否允許空,但是在不同的數(shù)據(jù)庫中,數(shù)據(jù)類型的表示符號和長度是有所差別。本系統(tǒng)的數(shù)據(jù)庫中需要建的表詳見如下:1、在數(shù)據(jù)庫中建立用戶表,用戶表包括了用戶的編號、角色類別編號、用戶名、性別、密碼、郵件地址等信息,詳見表3-1用戶表。表3-1用戶信息表列名數(shù)據(jù)類型可否為空說明IdintNotnull自動編號UserNamenvarchar(16)Null用戶名Pwdnvarchar(64)Notnull密碼2、在數(shù)據(jù)庫里建立一個媒體類型表,其中包括類型ID、類型名稱、類型描述。媒體類型表詳見表3-2評論表。表3-2評論表列名數(shù)據(jù)類型可否為空說明IdintNOTNULL自動編號typeNamenvarchar(128)NULL媒體類型typedespnvarchar(128)NULL媒體類型描述3、在數(shù)據(jù)庫里建立一個媒體信息表,其中字段包括編號、媒體信息名、媒體信息描述、媒體路徑、類型ID等基本信息,詳見表4-3視頻信息表。表3-3視頻信息表列名數(shù)據(jù)類型可否為空說明IdintNOTNULL自動編號VideoNamenvarchar(64)NULL媒體名稱VideoDespnvarchar(128)NOTNULL媒體描述VideoPathnvarchar(64)NULL媒體類型TypeIdnvarchar(50)NULL類型ID系統(tǒng)實現(xiàn)系統(tǒng)實現(xiàn)是在系統(tǒng)分析、系統(tǒng)設(shè)計的基礎(chǔ)上,將系統(tǒng)設(shè)計的每一個細節(jié),用計算機語言(或開發(fā)工具)完整地表達出來,以便在計算機上實現(xiàn)該系統(tǒng)。新系統(tǒng)是建設(shè)的最終目標,是能在計算機上運行的程序。本章主要介紹系統(tǒng)功能的實現(xiàn)。4.1服務(wù)器端界面實現(xiàn) 服務(wù)器端界面主要實現(xiàn)內(nèi)容:自定義的工具欄按鈕(類型導(dǎo)航、視頻編輯、服務(wù)啟動、服務(wù)停止)、樹控件,DataGrid控件、DlgVideo對話框(新建按鈕、插入按鈕、刪除按鈕、所屬類型組合框、視頻名稱輸入框、視頻描述輸入框等) 服務(wù)器端的實現(xiàn)具體步驟如下:1.服務(wù)器端的創(chuàng)建使用MFC單文檔應(yīng)用程序,文檔視架構(gòu)的支持,其中View繼承自CFormView。2.在工程中,添加類vc界面的工具條。將sizecbar.hsizecbar.cppscbarg.h、scbarg.cpp四個文件復(fù)制到工程thirdpart目錄下。在菜單Project->Addtoproject->Files將四個文件加入工程中,此時在ClassView中將出現(xiàn)了一個稱為CCoolBar的類。在stdafx.h文件中加上浮動時候替換原來TOOLWINDOWS的框架#define_SCB_REPLACE_MINIFRAME#include"thirdpart\sizecbar.h"#include"thirdpart\scbarg.h"為CMainFrame增加成員變量:CCoolBarm_LeftCtrBar;//左面的控制窗口CCoolBarm_BottomCtrBar;//最下面的控制窗口創(chuàng)建和停靠工具欄:if(!m_LeftCtrBar.Create(_T("導(dǎo)航"),this,CSize(230,260),TRUE,123))if(!m_BottomCtrBar.Create(_T編輯"),this,CSize(200,170),TRUE,124))m_LeftCtrBar.EnableDocking(CBRS_ALIGN_ANY);//左面工具條能夠停靠m_BottomCtrBar.EnableDocking(CBRS_ALIGN_ANY);//底部工具條能夠停靠DockControlBar(&m_BottomCtrBar,AFX_IDW_DOCKBAR_BOTTOM);//停靠在底部DockControlBar(&m_LeftCtrBar,AFX_IDW_DOCKBAR_LEFT);//停靠在左邊3.該ControlBar在浮動的時候頂部的把手會消失,變成了普通的ToolWindow類型的標題欄。為了避免這種情況,我們需要在CMainFrame::OnCreate()中,在EnableDocking()后加入:#ifdef_SCB_REPLACE_MINIFRAMEm_pFloatingFrameClass=RUNTIME_CLASS(CSCBMiniDockFrameWnd);#endif//_SCB_REPLACE_MINIFRAME并在stdafx.h中加上#define_SCB_REPLACE_MINIFRAME,在兩個頭文件前面4.設(shè)置工具欄上按鈕的功能和狀態(tài),分別添加兩種消息:voidCMainFrame::OnToolbarNavigate(){ ShowControlBar(&m_LeftCtrBar,!m_LeftCtrBar.IsVisible(),FALSE);}voidCMainFrame::OnToolbarEdit(){ShowControlBar(&m_BottomCtrBar,!m_BottomCtrBar.IsVisible(),FALSE);}5.設(shè)置皮膚(使用動態(tài)庫)拷貝skin目錄到當前的工程中(皮膚文件、h文件、dll文件、lib文件),在項目的頭文件stdafx.h中包含頭文件,引入lib文件#include"./skin/SkinMagicLib.h"http://包含頭文件#pragmacomment(lib,"./skin/SkinMagicTrial.lib")//引入皮膚庫//加載皮膚VERIFY(1==InitSkinMagicLib(AfxGetInstanceHandle(),NULL,NULL));//初始化皮膚庫VERIFY(1==LoadSkinFile(_T("./skin/xpsteel.smf")));//加載皮膚VERIFY(1==SetWindowSkin(m_pMainWnd->m_hWnd,_T("MainFrame")));//將皮膚設(shè)置到窗口上VERIFY(1==SetDialogSkin(_T("Dialog")));//將皮膚設(shè)置到對話框上6.在左邊的控制窗口中添加樹控件:在CMainFrame中添加成員變量m_wndTree,在CMainFrame的OnCreate()中動態(tài)創(chuàng)建樹控件。具體代碼如下: m_wndTree.Create(WS_CHILD,CRect(0,0,0,0),&m_LeftCtrBar,100)) //樹控件的創(chuàng)建 m_wndTree.ModifyStyleEx(0,WS_EX_CLIENTEDGE); //初始化樹控件 InitTypeTreeCtrl();樹控件的初始化,訪問數(shù)據(jù)庫,從數(shù)據(jù)庫中得到控件類型代碼如下:voidCMainFrame::InitTypeTreeCtrl(){CMainFrame*pWnd=(CMainFrame*)AfxGetMainWnd();//定義訪問視頻類型類的對象CTypeManagertypeMgr(&pWnd->m_adoConnection);CList<CType,CType>lstTypes;//獲取視頻類型的信息保存到鏈表listTypes中typeMgr.GetAllType(&lstTypes);CTypetype;//插入樹控件的根節(jié)點HTREEITEMhRoot=m_wndTree.InsertItem(_T("所有類型"));for(inti=0;i<lstTypes.GetCount();i++){ //從鏈表中獲取視頻類型的數(shù)據(jù) type=lstTypes.GetAt(lstTypes.FindIndex(i)); //將視頻名稱作為樹節(jié)點名稱插入到樹控件 HTREEITEMhItem=m_wndTree.InsertItem(type.strTypeName,hRoot); //將視頻類型的ID設(shè)置為節(jié)點的附加數(shù)據(jù) m_wndTree.SetItemData(hItem,type.nTypeID);}/設(shè)置樹節(jié)點高度m_wndTree.SetItemHeight(20);m_wndTree.Expand(hRoot,TVE_EXPAND);//展開樹節(jié)點}7.在底部的控制窗口中添加對話框:添加對話框資源,設(shè)置風(fēng)格style:child;border:none,雙擊資源窗口生成對話框類CDlgVideo,在CMainFrame的OnCreate()中創(chuàng)建和顯示對話框。具體代碼如下://底部的工具條中添加對話框 if(!m_dlgVideo.Create(IDD_DLG_VIDEO,&m_BottomCtrBar)) //對話框的創(chuàng)建 m_dlgVideo.ShowWindow(SW_SHOW);//對話框的顯示m_dlgVideo.InitVideoTypeCtrl();//組合框數(shù)據(jù)初始化8.在CFormView視圖中添加MSDataGrid控件(COM組件)可以通過綁定設(shè)置數(shù)據(jù)、、屬性方便操作。CDataGrid、CColumnsCColunm添加到工程。為控件綁定成員變量m_wndGrid,控件鋪滿窗口的客戶區(qū),給視圖添加WM_SIZE的消息處理。voidCVODServerView::OnSize(UINTnType,intcx,intcy){ CFormView::OnSize(nType,cx,cy); CRectrcClient; GetClientRect(&rcClient);//獲取客戶區(qū)大小 CWnd*pWnd=GetDlgItem(IDC_DATAGRID); //設(shè)置控件的大小 if(pWnd) pWnd->MoveWindow(0,0,rcClient.Width(),rcClient.Height()); if(m_wndGrid.GetSafeHwnd()) //去掉控件的滾動條m_wndGrid.SetScrollBars(0);}4.1.1DataGrid控件簡介DataGrid控件是一個多二維的數(shù)據(jù)網(wǎng)格,用來以表格形式顯示數(shù)據(jù)源數(shù)據(jù)和以列為單位,設(shè)定各列的操作類型。網(wǎng)格中的每一行表示數(shù)據(jù)源中的一個記錄,每一列表示數(shù)據(jù)源中的個字段(列)。從顯示格式和操作控制能力看,DataGrid控件支持選擇、編輯、刪除、分頁顯示和排序等功能。可在設(shè)計時使用“屬性生成器”對話框進行大量的自定義設(shè)置,生成顯示和編輯數(shù)據(jù)的列(包含“編輯”、“更新”、“取消”和“選擇”按鈕的列、自定義按鈕的列以及模板列)。4.1.2DataGrid控件的使用(1)首先通過DataSource屬性指定數(shù)據(jù)源;(2)指定要操作的數(shù)據(jù)表及關(guān)鍵字段;(3)DataGrid控件的外觀顯示布局設(shè)置(包括顏色、字體、字號、邊框、分頁、排序、不同列的顯示與操作類型等);(4)用BindDataGrid()方法綁定數(shù)據(jù);4.2客戶端界面實現(xiàn)客戶端界面主要實現(xiàn)的內(nèi)容:WindowsMediaPlayer控件、樹控件。當用戶通過登錄界面進入客戶端界面時,客戶端會向服務(wù)器端發(fā)送請求,服務(wù)器端查詢數(shù)據(jù)庫,返回給數(shù)據(jù)庫所有類型下的媒體名稱。客戶端再把這些數(shù)據(jù)添加到樹控件上,讓用戶通過點擊獲取媒體信息。服務(wù)端給客戶端傳回數(shù)據(jù)流,客戶端就可以使用自帶的WindowsMediaPlay播放器播放。樹控件創(chuàng)建和添加:樹控件創(chuàng)建代碼如下:if(!m_wndTree.Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,CRect(0,0,0,0),&m_LeftCtrBar,100))m_wndTree.ModifyStyleEx(0,WS_EX_CLIENTEDGE)//樹控件風(fēng)格WindowsMediaPlayerActiveX控件介紹:何為MediaPlaye控件?說白了就是一個精簡版的WindowsMediaPlayer,只不過是不能自行播放而已,它是WindowsMediaPlayer的核心。WindowsMediaPlayer是一個功能強大的多媒體播放器,采用它的核心所制作出來的播放器可以播放除死敵REAL格式外的幾乎所有格式的多媒體文件。使用WindowsMediaPlayer軟件開發(fā)工具包(SDK),您可以擴展獨立Player的功能,并將播放功能嵌入到自己的應(yīng)用程序中。您可以使用其播放功能,并可決定在應(yīng)用程序中是使用Player的現(xiàn)有用戶界面,還是創(chuàng)建自己的用戶界面。本客戶端MediaPlayer控件的使用過程:添加WindowsMediaPlayer控件并為其綁定變量:CWMPPlayer4m_wndPlayer。讓MediaPlayer隨著客戶端大小的改變而改變代碼如下:voidCVODClientView::OnSize(UINTnType,intcx,intcy){CFormView::OnSize(nType,cx,cy);CRectrcClient;GetClientRect(&rcClient);//獲得客戶端矩形的大小if(m_wndPlayer.GetSafeHwnd()){m_wndPlayer.MoveWindow(0,0,rcClient.Width(),rcClient.Height();}//讓MediaPlayer隨著客戶端改變大小}MediaPlayer播放器效果圖如下:圖4-1MediaPlayer播放器效果圖4.3登陸界面實現(xiàn)登陸界面主要處理的是當用戶輸入用戶名和密碼之后點擊登陸按鈕所要做處理。當用戶點擊登陸后,客戶端將會被用戶名和密碼發(fā)送給服務(wù)器端,服務(wù)端查詢數(shù)據(jù)庫,返回結(jié)果給客戶端,如果驗證成功,進入客戶端主界面,否則會提示用戶名稱或密碼錯誤,請重新登錄。登陸驗證的代碼如下:voidCDlgLogin::OnOK(){UpdateData(TRUE);//刷新控件的值到對應(yīng)的變量 if(!m_clientSock.Login(m_strUserName,m_strPwd)) {MessageBox("用戶名稱或密碼錯誤,請重新登錄!"); return; } CDialog::OnOK();}客戶端處理登陸的函數(shù),它向服務(wù)端發(fā)送登陸請求,服務(wù)端驗證用戶名和密碼如果驗證成功,就返回成功,客戶端進入主界面。BOOLCClientSocket::Login(LPCSTRpszName,LPCSTRpszPwd){VODLOGINlogin={0};//登陸數(shù)據(jù)結(jié)構(gòu)體strcpy(login.szUserName,pszName);strcpy(login.szPassword,pszPwd);SendData(VODNETCMD_LOGIN,&login,sizeof(login));//給服務(wù)器發(fā)送要登陸的用戶的用戶名和密碼VODHEADERheader={0};RecvData(&header,sizeof(header));VODLOGINRETloginret={0};RecvData(&loginret,sizeof(loginret)); //接受到服務(wù)器端返回的數(shù)據(jù):登陸驗證是否成功returnloginret.dwSuccess;}4.3數(shù)據(jù)庫的訪問和操作數(shù)據(jù)庫的訪問主要用在VODServer端,基本上它的每一項操作都會涉及到數(shù)據(jù)庫的訪問和操作。在服務(wù)端打開時樹控件初始化、DataGrid控件的初始化、媒體信息的添加刪除更新都會用到數(shù)據(jù)庫的訪問和操作。如果客戶端需要訪問都是通過向服務(wù)器端發(fā)送相應(yīng)的命令,服務(wù)器再訪問,最后返回給客戶端結(jié)果。VODServer對數(shù)據(jù)庫的訪問和操作如下:1.視頻數(shù)據(jù)的顯示,使用DataGrid組件顯示,在CMainFrame類中,添加成員變量CAdoConnectionm_adoConnection。并且在構(gòu)造函數(shù)中,連接數(shù)據(jù)庫m_adoConnection.ConnectAccess("../../DB/VODDB.mdb")。在視圖類View中,添加成員變量CAdoRecordSetm_adoRecordSet。在視圖類的OnInitialUpdate函數(shù)中,添加用于綁定記錄集與datagrid代碼。在視圖類中添加BindDataGrid函數(shù)并實現(xiàn)代碼如下:voidCVODServerView::OnInitialUpdate(){ CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); //數(shù)據(jù)綁定 CMainFrame*pWnd=(CMainFrame*)AfxGetMainWnd(); m_adoRecordSet.SetAdoConnection(&pWnd->m_adoConnection); m_adoRecordSet.SetCursorLocation(); CStringstrSql= "selectvideoInfo.idas編號,videoNameas視頻名稱,videoDespas視頻描述,videoPathas視頻路徑,typeNameas所屬類型fromvideoInfo,TypeInfowherevideoInfo.typeid=TypeInfo.id"; m_adoRecordSet.Open(strSql,adCmdText);//執(zhí)行sql語句 BindDataGrid(&m_adoRecordSet);//綁定DataGrid控件}voidCVODServerView::BindDataGrid(CAdoRecordSet*pSet){//綁定DataGrid控件m_wndGrid.SetRefDataSource((LPUNKNOWN)m_adoRecordSet.GetRecordset());//設(shè)置數(shù)據(jù)源m_wndGrid.Refresh();//刷新}2.在不同的控件中顯示視頻類型信息(樹控件、組合框控件)。樹控件初始化代碼:voidCMainFrame::InitTypeTreeCtrl(){ CMainFrame*pWnd=(CMainFrame*)AfxGetMainWnd();//定義訪問視頻類型類的對象 CTypeManagertypeMgr(&pWnd->m_adoConnection); CList<CType,CType>lstTypes; //獲取視頻類型的信息保存到鏈表listTypes中 typeMgr.GetAllType(&lstTypes); CTypetype; //插入樹控件的根節(jié)點 HTREEITEMhRoot=m_wndTree.InsertItem(_T("所有類型")); for(inti=0;i<lstTypes.GetCount();i++) { //從鏈表中獲取視頻類型的數(shù)據(jù) type=lstTypes.GetAt(lstTypes.FindIndex(i)); //將視頻名稱作為樹節(jié)點名稱插入到樹控件 HTREEITEMhItem=你_wndTree.InsertItem(type.strTypeName,hRoot); //將視頻類型的ID設(shè)置為節(jié)點的附加數(shù)據(jù) m_wndTree.SetItemData(hItem,type.nTypeID); } //設(shè)置樹節(jié)點高度 m_wndTree.SetItemHeight(20); m_wndTree.Expand(hRoot,TVE_EXPAND);}3.實現(xiàn)在對話框中對視頻數(shù)據(jù)的增刪改操作,重新顯示操作后的數(shù)據(jù)。"新建"、"插入"、"刪除"按鈕添加消息處理函數(shù)。A."新建"的實現(xiàn):清空所有控件數(shù)據(jù),修改按鈕的文本。實現(xiàn)代碼如下:voidCDlgVideo::OnNew(){ClearCtrlData(); //按鈕名稱由更新變?yōu)椴迦?m_wndOK.SetWindowText("插入");}B."插入"、"更新"的實現(xiàn):根據(jù)視頻的ID是否為空,判斷是插入還是更新操作,操作完成后調(diào)用BindDataGrid重新顯示數(shù)據(jù)。voidCDlgVideo::OnOk(){ CMainFrame*pWnd=(CMainFrame*)AfxGetMainWnd(); CVideoManagervideoMgr(&pWnd->m_adoConnection);//創(chuàng)建CVideoManager類的對象 UpdateData(TRUE);//更新控件上的值 if(m_strVideoType=="") { MessageBox("請選擇視頻類型!"); return; } CVideov; v.strVideoName=m_strVideoName; v.strVideoDesp=m_strVideoDesp; v.strVideoPath=m_strVideoPath; intnCurSel=m_cboType.GetCurSel(); v.nTypeid=m_cboType.GetItemData(nCurSel); //獲取當前的文本 if(m_strVideoID=="") { //執(zhí)行插入操作videoMgr.InsertVideo(v); //清空原有數(shù)據(jù)ClearCtrlData(); } else { v.nVideoID=atoi(m_strVideoID); //執(zhí)行更新數(shù)據(jù)操作videoMgr.UpdateVideo(v,v.nVideoID); }BindDataGrid(); UpdateData(FALSE);}C."刪除"的實現(xiàn):獲取要刪除視頻數(shù)據(jù)的ID,執(zhí)行刪除操作,操作完成后調(diào)用BindDataGrid重新顯示數(shù)據(jù),清空控件中的數(shù)據(jù)。voidCDlgVideo::OnDel(){ //TODO:Addyourcontrolnotificationhandlercodehere CMainFrame*pWnd=(CMainFrame*)AfxGetMainWnd();CVideoManagervideoMgr(&pWnd->m_adoConnection);intnVideoID=atoi(m_strVideoID); videoMgr.DeleteVideo(nVideoID); //清空原有數(shù)據(jù)ClearCtrlData(); //重新綁定顯示BindDataGrid(); m_wndOK.SetWindowText("插入");}4.5系統(tǒng)網(wǎng)絡(luò)通信本系服務(wù)端和客戶端之間的通信是基于有連接的TCP通信。TCP通信是一種面向連接的、可靠的、基于字節(jié)流的在傳輸層(Transportlayer)通信協(xié)議。TCP網(wǎng)絡(luò)編程主要用套接字來實現(xiàn)網(wǎng)絡(luò)服務(wù)器與客戶端通信,一個標準的套接字是由協(xié)議族,IP地址與端口號組成,它是TCP服務(wù)器與客戶端通信的基礎(chǔ)。編寫網(wǎng)絡(luò)通信基本的步驟:定義用于傳輸?shù)臄?shù)據(jù)包結(jié)構(gòu)(傳輸協(xié)議),定義和實現(xiàn)網(wǎng)絡(luò)通信的封裝類,界面對封裝類的調(diào)用。VODServer關(guān)于網(wǎng)絡(luò)通信的實現(xiàn)步驟:1.socket庫的初始化:在App的InitInstance函數(shù)中:AfxSocketInit()AfxMessageBox("FailedtoInitializeSockets",MB_OK|MB_ICONSTOP)。2.服務(wù)端需要添加兩個相關(guān)類,CNetServer和CNetClient。CNetClient類定義的前面要添加數(shù)據(jù)包結(jié)構(gòu)的定義。CNetServer主要負責(zé)創(chuàng)建服務(wù)端socket,并且啟動服務(wù)端線程等待客戶端連接。CNetClient類主要負責(zé)客戶端socket的創(chuàng)建,網(wǎng)絡(luò)通信的操作都在CNetClient類中實現(xiàn)。CNetClient主要實現(xiàn)的功能有:處理登陸的OnLogin函數(shù)、返回指定類型ID的所有視頻信息OnVideosByTypeID()函數(shù)、處理客戶端請求的視頻文件OnMediaData()函數(shù)、原始的數(shù)據(jù)收發(fā)函數(shù)RecvData()和SendData()函數(shù)。CNetServer和CNetClient的類視圖如下: 圖4-2MediaPlayer播放器效果圖CNetServer相關(guān)代碼:DWORDCNetServer::ServerThread(LPVOIDpParam){CNetServer*pThis=(CNetServer*)pParam; //創(chuàng)建socketpThis->m_hSockServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);sockaddr_inaddr={0};addr.sin_family=AF_INET;//綁定通信地址addr.sin_port=htons(6789);//通信端口addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);bind(pThis->m_hSockServer,(sockaddr*)&addr,sizeof(addr));//綁定socket和通信地址 listen(pThis->m_hSockServer,0);//設(shè)置監(jiān)聽while(1){sockaddraddrclient={0};intnLen=sizeof(addrclient); //接收客戶端連接SOCKETsock=accept(pThis->m_hSockServer,&addrclient,&nLen);CNetClientnetClient;//創(chuàng)建CNETClient類的netClient對象netClient.m_hClientSocket=sock; //數(shù)據(jù)的交互交給CNetClient類netClient.Initialize();}return0;}CNetClient相關(guān)代碼:BOOLCNetClient::Initialize(){DWORDdwThreadID=0;HANDLEhThread=CreateThread(NULL,0,ClientThread,this,0,&dwThreadID);//創(chuàng)建服務(wù)線程,來一個客戶端創(chuàng)建一個線程,同步處理客戶端請求CloseHandle(hThread);/關(guān)閉線程句柄returnTRUE;}線程處理函數(shù)代碼如下:DWORDCNetClient::ClientThread(LPVOIDpParam){CNetClient*pThis=(CNetClient*)pParam;BOOLbRet=TRUE;while(bRet){VODHEADERheader={0};bRet=pThis->RecvData(&header,sizeof(header)); //服務(wù)端收到的客戶端請求命令數(shù)據(jù)switch(header.dwCmd){//根據(jù)不同請求做出不同的操作caseVODNETCMD_LOGIN:bRet=pThis->OnLogin();//登錄break;caseVODNETCMD_MEDIADATA:bRet=pThis->OnMediaData();//獲取媒體數(shù)據(jù)break; caseVODNETCMD_TYPES: bRet=pThis->OnAllVideoTypes();//獲取所有視頻類型信息 break; caseVODNETCMD_GETVIDES: bRet=pThis->OnVideosByTypeID();//獲取媒體信息通過類型IDdefault:break;}}closesocket(pThis->m_hClientSocket);//關(guān)閉socket套接字return0;}第五章系統(tǒng)測試 軟件產(chǎn)品的質(zhì)量是軟件生存和發(fā)展的關(guān)鍵,而軟件測試是保證軟件產(chǎn)品質(zhì)量控制、管理和檢測的最重要手段。隨著軟件功能需求的日益復(fù)雜和軟件規(guī)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論