資源描述:
《大型作業(yè)答辯演講》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、大型作業(yè)答辯考試程序”客戶端/服務(wù)器模式”制作詳解程序組成結(jié)構(gòu)服務(wù)器程序:1.采用了WinSocket32的完成端口模型(I/Ocompletionports)2.WIN32多線程技術(shù)3.ODBCAPIS進(jìn)行數(shù)據(jù)庫(kù)操作客戶端程序:1.用Win32API函數(shù)構(gòu)造主窗體和界面元素服務(wù)器程序詳解完成端口模型(I/Ocomplrtionports)是迄今為止最為復(fù)雜的一種I/O模型,假如一個(gè)程序需要管理為數(shù)眾多的套接字,那么采用這種模型往往可以達(dá)到最佳的系統(tǒng)性能,不幸的是該模型只適用與WIN2000和WINNT操作系統(tǒng),因其設(shè)計(jì)的復(fù)雜性,只有在你的應(yīng)用程序需要
2、同時(shí)管理數(shù)百乃至上千個(gè)套接字的時(shí)候,而且希望隨著系統(tǒng)內(nèi)安裝的CPU的數(shù)量增多,應(yīng)用程序的性能也可以線性的提升,才考慮采用”完成端口模型”(WEB服務(wù)器便是這方面的典型例子.),I/Ocomplrtionports是唯一適用于高負(fù)載服務(wù)器的一個(gè)技術(shù),它利用一些線程幫助平衡”I/O請(qǐng)求”所引起的負(fù)載,這樣的構(gòu)架特別適合應(yīng)用在SMP系統(tǒng)中產(chǎn)生所謂的”Scalable”服務(wù)器.(Scalable是指能夠籍著增加RAM或磁盤空間,CPU個(gè)數(shù)而提升應(yīng)用程序效能的一種系統(tǒng)).服務(wù)器程序詳解2完全端口模型的具體實(shí)現(xiàn)為了使用”完成端口模型”,我產(chǎn)生了一堆線程在端口上等待
3、,線程數(shù)量=CPU個(gè)數(shù)x2+2,我將每個(gè)客戶端產(chǎn)生的文件句柄與I/Ocompletionports端口相關(guān)聯(lián),建立了這種關(guān)系之后,任何客戶端發(fā)出操作請(qǐng)求,便會(huì)導(dǎo)致I/Ocompletionpacket被送到”完成端口”去,這個(gè)步驟是操作系統(tǒng)完成的,為了回應(yīng)I/Ocompletionpacket,我讓I/Ocompletion釋放一個(gè)等待中的線程,如果目前沒(méi)有線程正在等待,它不會(huì)為這個(gè)客戶端N產(chǎn)生新的線程,當(dāng)作用中的線程處理完畢相應(yīng)客戶端的”overlappedI/O”后,將返回I/Ocompletion端口進(jìn)行等待.客戶端N這時(shí)才能夠被處理,這樣就保證
4、了我的Workers線程總是保持一個(gè)穩(wěn)定的數(shù)量(CPU個(gè)數(shù)x2+2).服務(wù)器程序詳解4數(shù)據(jù)庫(kù)的操作實(shí)現(xiàn):這部分功能主要是通過(guò)WinSocket32API和ODBCAPI結(jié)合使用來(lái)實(shí)現(xiàn)的,服務(wù)端進(jìn)入監(jiān)聽(tīng)狀態(tài)后,為每個(gè)客戶端提供相應(yīng)線程處理發(fā)過(guò)來(lái)的指令,通過(guò)分析指令,作出以下相應(yīng)的操作客戶端發(fā)送的指令(自定義的):login:登陸校驗(yàn)參數(shù):用戶名,科目,密碼Srecv:ScanTm:檢查服務(wù)器時(shí)間校對(duì)試卷修改試卷狀態(tài),拋出計(jì)數(shù)值Srecv:GetSta:獲取試卷狀態(tài)Srecv:GetRlt:獲取上次做答Srecv:GetNum:獲得試卷相關(guān)信息(總題數(shù),開(kāi)
5、考時(shí)間,結(jié)束時(shí)間)Srecv:GetQue:獲取試卷題目?jī)?nèi)容.Srecv:SaveDt:保存試卷Srecv:ChanST:修改試卷狀態(tài).服務(wù)器程序總結(jié)數(shù)據(jù)庫(kù)被單獨(dú)存放在一個(gè)服務(wù)器中可以保證數(shù)據(jù)安全性程序會(huì)將客戶端的一切操作顯示在窗口中,用戶可以通過(guò)觀察窗口,知道所有客戶端的動(dòng)作.這個(gè)程序采用”完成端口”模型,可以滿足大規(guī)模的考試需求.客戶端程序詳解1窗口完全采用Win32API函數(shù)生成主要包含一下標(biāo)準(zhǔn)控件static控件Edit控件Button控件Scroll控件窗口元素全部采用計(jì)算后的相對(duì)坐標(biāo)定位,所以800X600和1024X768下均能正常顯示.
6、客戶端程序詳解2試卷的初始化考慮到每張?jiān)嚲淼念}目數(shù)量都不同,為了節(jié)約內(nèi)存空間,所以我在堆中動(dòng)態(tài)生成了一個(gè)試卷結(jié)構(gòu)體,通過(guò)向服務(wù)器程序發(fā)送GetNum:指令來(lái)獲得試卷總題數(shù)QuestionNum,然后使用TestPaper=newTestRubric[QuestionNum]/*結(jié)構(gòu)體定義*///試卷每道題的結(jié)構(gòu)structQuestions{BOOLstate;charText[512];};structSelectObject{BOOLstate;charText[256];};structTestRubric{structQuestionsTile
7、;structSelectObjectchoose[4];};由于TextOut函數(shù)不支持自動(dòng)換行,所以換行操作必須由我自己完成.因此我用同樣的方法在堆中創(chuàng)建了一個(gè)Screen用作屏幕顯示的結(jié)構(gòu)體Screen=newLines[LINES]structLines{intearmark;//用來(lái)存儲(chǔ)Button的IDBOOLcolor1;//置顏色標(biāo)志BOOLcolor2;//置顏色標(biāo)志charLine[512];};LINES=掃描TestPaper中超過(guò)屏幕寬度的行數(shù)+QuestionNum*5+QuestionNum*3屏幕寬度=客戶區(qū)的寬/每個(gè)文
8、字的寬度/2*2屏幕高度=客戶區(qū)的高/每個(gè)文字的高度為每一體產(chǎn)生4個(gè)互斥的按鈕按鈕總數(shù)=Que