企業(yè)QQ通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)設(shè)計(jì)說明_第1頁
企業(yè)QQ通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)設(shè)計(jì)說明_第2頁
企業(yè)QQ通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)設(shè)計(jì)說明_第3頁
企業(yè)QQ通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)設(shè)計(jì)說明_第4頁
企業(yè)QQ通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)設(shè)計(jì)說明_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

26/29職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)企業(yè)通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)系部____________________專業(yè)名稱__________班級___________________姓名_____________學(xué)號__________指導(dǎo)教師__________2013年09月28日企業(yè)通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)摘要企業(yè)通信系統(tǒng)可作為企業(yè)部的交流工具使用,雖然通信的安全性不是很高,但是要求信息的響應(yīng)速度要較快,能讓企業(yè)部員工充分享受到網(wǎng)絡(luò)即時(shí)消息的方便和快捷,從而提高工作質(zhì)量和效率。本設(shè)計(jì)采用VisualC++6.0程序,使用C++編程語言進(jìn)行軟件的開發(fā)。主要實(shí)現(xiàn)了用戶注冊、用戶登錄、用戶之間文字聊天、文件傳輸、語音聊天、視頻聊天功能,構(gòu)成一個(gè)實(shí)用的、功能完善的聊天軟件,達(dá)到預(yù)期目標(biāo);通過運(yùn)行、測試與分析說明,該多功能聊天軟件運(yùn)行穩(wěn)定、可靠,具有一定的實(shí)用價(jià)值。關(guān)鍵詞:系統(tǒng);企業(yè)通信;VisualC++6.0;C++;數(shù)據(jù)庫目錄1引言11.1課題背景11.2國外主要聊天工具的發(fā)展?fàn)顩r11.3本課題研究的意義32系統(tǒng)需求分析42.1系統(tǒng)的功能需求分析42.2系統(tǒng)的可行性分析42.2.1可行性要求、目標(biāo)42.2.2技術(shù)可行性分析52.2.3經(jīng)濟(jì)可行性分析53系統(tǒng)設(shè)計(jì)63.1系統(tǒng)拓?fù)浣Y(jié)構(gòu)圖63.2系統(tǒng)功能結(jié)構(gòu)圖63.3網(wǎng)絡(luò)通信原理分析73.4開發(fā)環(huán)境83.5數(shù)據(jù)庫設(shè)計(jì)94服務(wù)器端設(shè)計(jì)104.1服務(wù)器端主窗體模塊104.1.1服務(wù)器端主窗體概述104.1.2窗口設(shè)計(jì)104.1.3關(guān)鍵代碼分析114.2服務(wù)器端賬戶管理模塊154.2.1服務(wù)器端賬戶管理概述154.2.2窗口設(shè)計(jì)154.2.3關(guān)鍵代碼分析164.3服務(wù)器端系統(tǒng)組織結(jié)構(gòu)管理模塊194.3.1服務(wù)器端系統(tǒng)組織結(jié)構(gòu)概述194.3.2窗口設(shè)計(jì)194.3.3關(guān)鍵代碼205客戶端關(guān)鍵技術(shù)215.1客戶端概述215.2客戶端的關(guān)鍵技術(shù)216系統(tǒng)測試246.1軟件測試基礎(chǔ)理論246.2系統(tǒng)測試246.3測試結(jié)果26結(jié)束語27致28參考文獻(xiàn)29企業(yè)通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)1引言1.1課題背景21世紀(jì)將是網(wǎng)絡(luò)化、信息化的世紀(jì),信息的融合已經(jīng)成為社會(huì)發(fā)展的主流方向。簡易版企業(yè)聊天系統(tǒng)將不斷與信息交流領(lǐng)域的系統(tǒng)相互集成和滲透,擴(kuò)展其自己的功能和應(yīng)用圍,滿足未來話音,數(shù)據(jù)和視頻的多媒體應(yīng)用需要,使即時(shí)消息以更豐富的接入方法,更高的服務(wù)質(zhì)量,更友好的面貌呈現(xiàn)在世人的面前。從功能角度來看,簡易版企業(yè)聊天系統(tǒng)向支持全媒體方向發(fā)展,隨著多媒體技術(shù)在網(wǎng)絡(luò)應(yīng)用中的發(fā)展,簡易版企業(yè)聊天系統(tǒng)承載的媒體,不再局限于原來的文字、語音和文件的信息交換,信息載體擴(kuò)展到圖形、圖像和流媒體等多媒體業(yè)務(wù)上。目前ICQ和預(yù)設(shè)了部分簡單的表情圖像,通過傳輸圖像代碼來傳遞表情圖像,可以被視為即時(shí)消息開發(fā)商開發(fā)支持圖形、圖像為載體的即時(shí)消息軟件的開端。從應(yīng)用圍角度來看,簡易版企業(yè)聊天系統(tǒng)集中在Internet個(gè)人用戶之間的信息交流應(yīng)用,隨著網(wǎng)絡(luò)技術(shù)應(yīng)用的發(fā)展,簡易版企業(yè)聊天系統(tǒng)應(yīng)用圍向園區(qū)化、集團(tuán)化拓展,應(yīng)用領(lǐng)域突破個(gè)人,而用于遠(yuǎn)程教學(xué)、遠(yuǎn)程醫(yī)療、遠(yuǎn)程演示、網(wǎng)絡(luò)會(huì)議等領(lǐng)域。1.2國外主要聊天工具的發(fā)展?fàn)顩r中國的大部分網(wǎng)絡(luò)用戶都擁有自己的。騰訊計(jì)算機(jī)系統(tǒng)成立于1998年11月。1999年2月,騰訊自主開發(fā)了基于Internet的即時(shí)通信網(wǎng)絡(luò)工具——騰訊即時(shí)通信TencentInstantMessenger,簡稱TIM或騰訊。騰訊經(jīng)過三年時(shí)間的發(fā)展,到2002年,其用戶群成為中國最大的互聯(lián)網(wǎng)注冊用戶群,注冊用戶達(dá)到1億6000萬,其中活躍用戶總數(shù)超過5000萬。自此騰訊成為中國最大的即時(shí)通信服務(wù)提供商。騰訊公司是中國最早也是目前中國市場上最大的本土互聯(lián)網(wǎng)即時(shí)通信軟件開發(fā)商。公司成立10多年以來,一直以追求卓越的技術(shù)為導(dǎo)向,始終處于穩(wěn)健、高速發(fā)展的狀態(tài)。騰訊超過6億的注冊用戶群體現(xiàn)了網(wǎng)絡(luò)用戶對騰訊這一聊天工具的廣泛應(yīng)用。在當(dāng)今市場經(jīng)濟(jì)高速發(fā)展的前提下,騰訊也在不斷自我完善,漸漸地演變?yōu)橐粋€(gè)人性化、市場化的多功能的聊天工具軟件,它可以給網(wǎng)絡(luò)聊天用戶帶來越來越多的人性化服務(wù):從原來單一的文字聊天過渡到集語音、視頻、文件傳輸?shù)榷喙δ苡谝簧淼牧奶燔浖CQ和MSN是在國外比較盛行的即時(shí)聊天工具,騰訊的開發(fā)對MSN和ICQ都進(jìn)行了借鑒。ICQ是ISeekYou(我找你)的縮寫,最初是一家以色列公司開發(fā)出來的免費(fèi)軟件,中文名稱目前可以稱之為“網(wǎng)絡(luò)呼叫器”,它在全球擁有超過4000萬的用戶。事實(shí)上這種軟件最主要的功能就是讓用戶知道網(wǎng)絡(luò)上的朋友現(xiàn)在有沒有上線(前提是對方也有安裝ICQ),然后可以互送Messages(消息)交談或是交換檔案等等,比電子更具即時(shí)性。正如一位ICQ軟件的最初程序設(shè)計(jì)員所說:“當(dāng)你登錄因特網(wǎng)之后,你周圍都是些自己熟悉的人,而且,你還可以和他們分享這種體驗(yàn),這的確是一件令人激動(dòng)的事情。”MSN是微軟推出的聊天軟件,是一套類似ICQ的網(wǎng)上即時(shí)通訊軟件,它以最簡單的方式為用戶提供強(qiáng)有力的即時(shí)消息支持,同時(shí)能使MicrosoftOutlookExpress(R)和MSNHotmail(R)變得更簡單易用。MSNMessengerService還可使用戶間的聯(lián)機(jī)交談變得更加輕松愉快,了解誰在聯(lián)機(jī)以與查看用戶何時(shí)聯(lián)機(jī)并與其交換即時(shí)消息。用戶間可以進(jìn)行單獨(dú)的聊天,或者在同一個(gè)對話窗口中與多達(dá)四個(gè)的聯(lián)系人進(jìn)行聊天。自動(dòng)的輸入指示器可讓用戶知道何時(shí)聯(lián)系人正在輸入答復(fù),還可以進(jìn)行全球呼叫——以非常低的費(fèi)用呼叫世界的任何地方。用戶可以選擇所要使用的服務(wù)提供商,從服務(wù)提供商的列表中選擇最適合的提供商。用交談取代鍵盤輸入,使用計(jì)算機(jī)上的話筒和揚(yáng)聲器就可以和位于世界各地的朋友進(jìn)行交談,甚至可以呼叫聯(lián)系人將文本消息發(fā)送到聯(lián)系人的移動(dòng)和傳呼機(jī)上(注:此特性僅適用于美國和加拿大),而進(jìn)入“聊天室”結(jié)識新朋友,或加入與名人聊天,此特性在所有地區(qū)都適用。用戶可以使用MSNMessenger與朋友交換照片、喜愛的音樂或任何其他文件,也可以監(jiān)視新的電子并查看用戶有多少新的電子。MSNMessenger能在收到新的Hotmail時(shí)通知用戶,還能邀請聯(lián)系人進(jìn)行聯(lián)機(jī)DirectPlay兼容游戲。1.3本課題研究的意義此次開發(fā)的企業(yè)通信系統(tǒng)可作為個(gè)人的交流工具使用,通信的安全性不是很高,但要求信息的響應(yīng)速度要較快,讓用戶充分享受到網(wǎng)絡(luò)即時(shí)消息的方便和快捷。本聊天工具由服務(wù)器端程序和客戶端程序兩部分組成,整體采用VisualC++6.0平臺開發(fā),并使用Access2003管理數(shù)據(jù)庫數(shù)據(jù)。服務(wù)器是可以監(jiān)聽和查看用戶的基本操作;客戶端程序面向?qū)嶋H用戶,它有必要的界面的按鈕,向用戶提供網(wǎng)絡(luò)即時(shí)消息的功能。2系統(tǒng)需求分析2.1系統(tǒng)的功能需求分析本系統(tǒng)的設(shè)計(jì)目標(biāo)是實(shí)現(xiàn)一個(gè)企業(yè)部局域網(wǎng)通信系統(tǒng),企業(yè)部職工可以方便的進(jìn)行交流,可以大大的提高職工的工作效率。根據(jù)企業(yè)對局域網(wǎng)通信的需求,本系統(tǒng)主要包括信息通信、系統(tǒng)設(shè)置、搜索用戶、訪問公共資源、訪問對方主機(jī)五大功能。各功能概述:信息通信:信息通信是企業(yè)部通信系統(tǒng)的核心功能,它用于不同職工之間的通信,這種通信方式能夠?qū)崿F(xiàn)多個(gè)職工之間的通信,而不存在類似占線的問題,增加了任務(wù)分配的新方式,從而提高企業(yè)的工作效率。系統(tǒng)設(shè)置:系統(tǒng)設(shè)置用于設(shè)置用戶界面、公共路徑、公告欄等的功能。用戶搜索:用戶搜索用于搜索企業(yè)局域網(wǎng)的其他用戶,系統(tǒng)會(huì)根據(jù)用戶所設(shè)置的IP搜索圍搜索所有計(jì)算機(jī)上的用戶。訪問公共資源:本功能用于實(shí)現(xiàn)企業(yè)部公共服務(wù)器上資源訪問的功能。訪問對方主機(jī):本功能用于兩人聊天情況下對對方主機(jī)的訪問和控制的功能。第一次使用系統(tǒng)的用戶通過填寫個(gè)人信息來注冊,服務(wù)器返回一個(gè)注冊ID號給注冊用戶,用來登錄。已經(jīng)注冊的用戶在登錄界面填寫完相關(guān)登錄信息,通過服務(wù)器的驗(yàn)證后就可以進(jìn)入客戶端界面。在線用戶在添加好友時(shí)可以查看所要添加用戶的列表信息。當(dāng)對要添加的好友發(fā)送請求添加的信息后,由該好友驗(yàn)證是否通過請求,同意后會(huì)向請求方發(fā)送同意添加的消息。當(dāng)請求方添加完成后,服務(wù)器端會(huì)把相關(guān)信息存入到好友表的數(shù)據(jù)庫中。完成以上操作以后,兩人即可進(jìn)行在線聊天。2.2系統(tǒng)的可行性分析2.2.1可行性要求、目標(biāo)企業(yè)部通信系統(tǒng)必須提供網(wǎng)絡(luò)通信功能,在通信過程中禁止使用聊天表情、文件傳送等功能,避免資料外泄,或因發(fā)送錯(cuò)誤而導(dǎo)致上機(jī)資料的丟失以與其他損失。最重要的是必須適應(yīng)任何操作系統(tǒng),也就是實(shí)現(xiàn)跨平臺技術(shù),因?yàn)槠髽I(yè)部的工作需要,工作環(huán)境中使用了多個(gè)操作系統(tǒng)來完成不同的工作。另外,系統(tǒng)不需要使用服務(wù)器中轉(zhuǎn)和記錄通信容,可以獨(dú)立完成通信任務(wù),排除職工對領(lǐng)導(dǎo)監(jiān)視工作進(jìn)度等行為的逆反心理。企業(yè)部通信系統(tǒng)的目標(biāo)是實(shí)現(xiàn)企業(yè)的信息化通信,提高企業(yè)通信能力,提高任務(wù)理解和執(zhí)行能力,減少?zèng)]有必要的人員流動(dòng)和資金損耗,以最快的速度提升企業(yè)的市場競爭力。2.2.2技術(shù)可行性分析局域網(wǎng)通信系統(tǒng)的技術(shù)已經(jīng)非常成熟,首先,從硬件上講,計(jì)算機(jī)硬件速度現(xiàn)在已經(jīng)不是問題,高速便捷的網(wǎng)絡(luò)已經(jīng)十分普遍,這些為本系統(tǒng)的運(yùn)行打下堅(jiān)實(shí)的基礎(chǔ)。從軟件的角度上講,數(shù)據(jù)庫技術(shù)已經(jīng)相當(dāng)成熟(目前用得比較多的有SQLServer,VisualC++6.0等),并且處理能力也非常強(qiáng),這為海量數(shù)據(jù)的存儲(chǔ)和處理打下了堅(jiān)實(shí)的基礎(chǔ),同時(shí),使用VisualC++6.0開發(fā)程序也相當(dāng)普遍。有了這些技術(shù)的支持,我們成功開發(fā)一個(gè)局域網(wǎng)通信系統(tǒng)沒有任何技術(shù)風(fēng)險(xiǎn)。2.2.3經(jīng)濟(jì)可行性分析經(jīng)濟(jì)可行性主要是對項(xiàng)目的經(jīng)濟(jì)效益進(jìn)行評價(jià)。本系統(tǒng)開發(fā)完成后可縮減工作時(shí)間,提高工作效率,而且簡單易操作,不需對使用人員進(jìn)行培訓(xùn),不管是在資金上還是效率上都能達(dá)到預(yù)期的效果。本系統(tǒng)開發(fā)經(jīng)費(fèi)對于企業(yè)在經(jīng)濟(jì)上是可以接受的,并且本系統(tǒng)實(shí)施后可以顯著提高工作效率,有助于企業(yè)的信息化管理,所以該企業(yè)部通信系統(tǒng)在經(jīng)濟(jì)上是可行的。3系統(tǒng)設(shè)計(jì)3.1系統(tǒng)拓?fù)浣Y(jié)構(gòu)圖企業(yè)通信系統(tǒng)分為客戶端和服務(wù)器端,并且多個(gè)客戶端可以連接同一個(gè)服務(wù)器端,通信系統(tǒng)的拓?fù)浣Y(jié)構(gòu)如圖3.1所示。圖3.1企業(yè)通信系統(tǒng)拓?fù)浣Y(jié)構(gòu)圖3.2系統(tǒng)功能結(jié)構(gòu)圖企業(yè)通信系統(tǒng)分為客戶端和服務(wù)器端兩個(gè)項(xiàng)目。其中服務(wù)器端不但提供接收客戶端的,還能夠?qū)~戶進(jìn)行管理。服務(wù)器端的主要模塊如圖3.2所示。客戶端只要實(shí)現(xiàn)相互之間的消息和文件傳遞,客戶端的主要模塊如圖3.3所示。圖3.2服務(wù)器端圖3.3客戶端3.3網(wǎng)絡(luò)通信原理分析企業(yè)通信系統(tǒng)使用TCP和UDP兩種連接方式進(jìn)行連接??蛻舳耸褂肨CP連接服務(wù)器,服務(wù)器端是使用UDP進(jìn)行通信,系統(tǒng)連接模式如圖3.4所示。圖3.4連接模式服務(wù)器端和客戶端使用Socket建立通信連接的過程如下:(1)服務(wù)器端建立m_SvrSock和m_OrgSock兩個(gè)套接字句柄。m_OrgSock和OnOrgMsg函數(shù)建立異步通信,端口1201,接收客戶端發(fā)送的連接請求(FD_ACCEPT)。在OnOrgMsg函數(shù)將org.xml文件發(fā)送到客戶端。m_SvrSock和OnNetEvent函數(shù)建立異步通信,端口1200,接收客戶端發(fā)送的連接請求,接收到客戶端的心跳測試和登錄請求(登錄后將端口1201的信息發(fā)送過去,并判斷是否已經(jīng)登錄),定時(shí)向客戶端發(fā)送心跳包,每隔10s發(fā)送一次,如果5次沒有心跳回復(fù),則認(rèn)為掉線。(2)客戶端建立m_ClientSock和m_UdpSock兩個(gè)套接句柄,m_ClientSock連接方式為TCP,m_UdpSock連接方式為UDP,端口都是隨機(jī)獲取的。m_ClientSock和OnNetEvent函數(shù)建立異步通信。m_UdpSock和OnOrgMsg函數(shù)建立異步通信??蛻舳耸紫仁褂胢_ClientSock建立連接,連接服務(wù)器的IP地址和端口。首先發(fā)送PT_LOGINREQUEST和本機(jī)UDP端口(m_nUdpPort)到服務(wù)器,如果用戶名和密碼正確,則得到PT_LOGINACCEPT和1201端口,此時(shí)服務(wù)器會(huì)向每個(gè)客戶端發(fā)送剛登錄客戶端的IP地址和UDP端口(PT_USERINFO)??蛻舳私邮盏絇T_LOGINACCEPT后,創(chuàng)建m_OrgSock套接字,本地端口隨機(jī),連接到服務(wù)器端的1201端口,準(zhǔn)備獲取org.xml文件??蛻舳税l(fā)送消息首先會(huì)創(chuàng)建taskSock套接字(客戶端為A),因?yàn)橛脩粼陔p擊要發(fā)送消息的用戶時(shí)(OnDblclkOrgtree),會(huì)獲得它的UDP端口和IP地址,然后發(fā)送PT_REQUESTUDPPORT到客戶端B,B新生成的UDP連接端口號后,返回PT_RETURNUDPPORT消息給A。每次創(chuàng)建taskSock套接字都會(huì)啟動(dòng)一個(gè)接收數(shù)據(jù)的線程(SendTaskProc),此時(shí)客戶端A和B都啟動(dòng)了接收數(shù)據(jù)的線程。A接收到PT_RETURNUDPPORT后,返回PT_STREAM與相應(yīng)的數(shù)據(jù)。發(fā)送文件和發(fā)送消息流程一樣,創(chuàng)建taskSock套接字后啟動(dòng)的是SendFile進(jìn)程,A接收到PT_RETURNUDPPORT后,返回PT_FILE。3.4開發(fā)環(huán)境企業(yè)通信系統(tǒng)的開發(fā)環(huán)境如下:系統(tǒng)開發(fā)平臺:VisualC++6.0。系統(tǒng)開發(fā)語言:C++。數(shù)據(jù)庫管理系統(tǒng)軟件:Access2003。運(yùn)行平臺:WindowsXP(SP2)/Windows2000(SP4)/WindowsServer2003(SP1)。分辨率:最佳效果1024×768像素。3.5數(shù)據(jù)庫設(shè)計(jì)服務(wù)器端使用Access2003作為后臺數(shù)據(jù)庫,用來儲(chǔ)存組織結(jié)構(gòu)與賬戶信息,數(shù)據(jù)庫命名為SvrInfo,其中包含2數(shù)據(jù)表。tb_Account表:tb_Account表儲(chǔ)存的是賬戶信息。賬戶信息如表3.1所示。表3.1賬戶信息表字段名數(shù)據(jù)類型長度描述字段名數(shù)據(jù)類型長度描述AccountID數(shù)字4賬戶HeaderShip文本20職務(wù)Username文本12OfficePhone文本22辦公Password文本18密碼Handset文本22手機(jī)Sex文本2性別E-mail文本32電子Age數(shù)字4年齡Address文本50OrgID數(shù)字4部門Picture文本20圖片,以賬戶命名OrgName文本50部門名稱tb_OrgInfo表:tb_OrgInfo表用于儲(chǔ)存組織信息。組織信息如表3.2所示。表3.2組織信息表字段名數(shù)據(jù)類型長度描述OrgID數(shù)字4組織編號OrgName文本20組織ParentID數(shù)字4上一級編號4服務(wù)器端設(shè)計(jì)4.1服務(wù)器端主窗體模塊4.1.1服務(wù)器端主窗體概述服務(wù)器端可以對組織結(jié)構(gòu)與賬戶進(jìn)行管理,并且提供通信服務(wù),負(fù)責(zé)將組織結(jié)構(gòu)信息和賬戶信息發(fā)送給各個(gè)客戶端、提供通信服務(wù),負(fù)責(zé)將組織結(jié)構(gòu)信息和賬戶信息發(fā)送給各個(gè)客戶端、驗(yàn)證賬戶的登錄權(quán)限、檢查客戶端是否保持在線??蛻舳酥鞔绑w模塊主要負(fù)責(zé)通信服務(wù),并且可以調(diào)用組織信息管理模塊和賬戶信息管理模塊。服務(wù)器端主界面效果如圖4.1所示。圖4.1服務(wù)器端主界面4.1.2窗口設(shè)計(jì)創(chuàng)建一個(gè)對話框,向?qū)υ捒蛑刑砑觾蓚€(gè)按鈕控件。設(shè)置控件屬性如表4.1所示。表4.1控件屬性控件類型資源值對應(yīng)類成員名稱屬性設(shè)置ButtonIDC_ORGMANAGEOnOrgmanage組織信息管理默認(rèn)ButtonIDC_ACCOUNTMANAGEOnAccountManage賬戶信息管理默認(rèn)4.1.3關(guān)鍵代碼分析在對話框初始化函數(shù)中,對數(shù)據(jù)庫進(jìn)行初始化,創(chuàng)建套接字并綁定本機(jī)IP地址和一個(gè)端口,然后開始監(jiān)聽,并將網(wǎng)絡(luò)設(shè)置為異步通信。為什么要使用異步通信?異步通信有什么好處?可以通過OnInitDialog()函數(shù)的應(yīng)用來了解。部分代碼如下:BOOLCServerDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) {……//監(jiān)聽套接字 listen(m_SvrSock,5); listen(m_OrgSock,5); WSAAsyncSelect(m_SvrSock,m_hWnd,WM_NETMSG,FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT); WSAAsyncSelect(m_OrgSock,m_hWnd,WM_ORGMSG,FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT); //設(shè)置異步IO模式 unsignedlongulValue=0; ioctlsocket(m_OrgSock,FIONBIO,&ulValue); SetTimer(1,10000,NULL); //開始一個(gè)計(jì)時(shí)器,每隔10s向客戶端發(fā)送心跳包 SetTimer(2,10000,NULL); //判斷客戶端是否掉線 returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}OnNetEvent()函數(shù)對應(yīng)一個(gè)消息,當(dāng)應(yīng)用程序接收到消息后調(diào)用該函數(shù)執(zhí)行。使用WSAAsyncSelect函數(shù)可以設(shè)置事件類型。例如,F(xiàn)D_ACCEPT類型是當(dāng)客戶端發(fā)送連接請求時(shí)服務(wù)器端如何進(jìn)行應(yīng)答的類型,F(xiàn)D_READ是讀取客戶端發(fā)送過來的數(shù)據(jù)事件,F(xiàn)D_CLOSE關(guān)閉連接事件。LRESULTCServerDlg::OnNetEvent(WPARAMwParam,LPARAMlParam){ WORDnEvent=WSAGETSELECTEVENT(lParam); //獲取網(wǎng)絡(luò)事件 WORDnError=WSAGETSELECTERROR(lParam); //獲取錯(cuò)誤代碼 switch(nEvent) { caseFD_ACCEPT: //有客戶端發(fā)出連接請求,接受連接 { sockaddr_inAddr; Addr.sin_family=AF_INET; intnAddrSize=sizeof(sockaddr_in); //接受客戶端連接 CClient*client=newCClient(); client->m_Sock=accept(m_SvrSock,(sockaddr*)&Addr,&nAddrSize); if(client->m_Sock==INVALID_SOCKET) //接受連接失敗 {…… catch(...)//修改密碼失敗 { CPackagePackage; Package.m_Type=PT_PT_UPDATEPASSFAILD; send(wParam,(char*)&Package,sizeof(CPackage),0); } } delete[]pBuffer; break; } } returnS_OK;}服務(wù)器端創(chuàng)建兩個(gè)端口,并使用TCP進(jìn)行數(shù)據(jù)傳輸,TCP是傳輸控制協(xié)議,是一種提供可靠數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議。它在網(wǎng)際協(xié)議模塊和TCP模塊之間的傳輸,該協(xié)議允許兩個(gè)應(yīng)用程序建立一個(gè)連接,并在全雙工方向上發(fā)送數(shù)據(jù),然后終止連接,每一個(gè)TCP連接可靠地建立并完善地終止,在終止發(fā)生前,所有數(shù)據(jù)都會(huì)被可靠地傳輸。TCP通過3次握手建立可靠的連接,所謂3次握手指通信雙方彼此交換3次信息。3次握手是在存在數(shù)據(jù)報(bào)丟失、重復(fù)和延遲的情況下,確保通信雙方信息交換確定性的充分必要條件。使用TCP協(xié)議建立通信的步驟如圖4.2所示。圖4.2TCP通信連接過程在應(yīng)用程序是指定時(shí)器用來做什么,從OnTimer的實(shí)現(xiàn)代碼中可以看出。判斷用戶是否在線需要使用定時(shí)器,每隔一段時(shí)間就向客戶端發(fā)送一個(gè)消息,如果客戶端能夠回復(fù)消息,說明客戶端在線,否則認(rèn)為客戶端已經(jīng)掉線。將服務(wù)器端發(fā)送給客戶端的這條信息稱為心跳包,消息類型PT_TEST就代表該包是心跳包。服務(wù)器端保存有在線客戶的列表,如果客戶端掉線了,就在列表中將客戶端刪除。voidCServerDlg::OnTimer(UINTnIDEvent){ switch(nIDEvent) { case1: //向客戶端發(fā)送心跳包 { POSITIONpos=m_ClientSockList.GetHeadPosition();…… m_ClientSockList.GetNext(pos); } break; } } CDialog::OnTimer(nIDEvent);驗(yàn)證用戶名和密碼,通過SQL語句檢查數(shù)據(jù)庫中是否有相應(yīng)的用戶名和密碼。BOOLCServerDlg::VerifyUser(intnID,char*szPassword){ CStringszSQL; szSQL.Format("selectAccountIDfromtb_AccountwhereAccountID=%dandPassword='%s'",nID,szPassword); _RecordsetPtrpRecord=m_DataManage.m_pConnect->Execute((_bstr_t)szSQL,0,adCmdText); if(!pRecord->ADOEOF) //判斷用戶是否存在 { returnTRUE; } returnFALSE;}OnOrgMsg函數(shù)同OnNetEvent函數(shù)一樣,都是消息的處理函數(shù),同樣可以處理FD_ACCEPT事件。在OnOrgMsg函數(shù)中當(dāng)有客戶端發(fā)送請求時(shí),服務(wù)器端會(huì)將org.xml文件發(fā)送到客戶端,org.xml文件中存放的是組織結(jié)構(gòu)信息,也就是含有在線用戶列表,每個(gè)客戶端都會(huì)在登錄時(shí)獲得該列表。如果組織結(jié)構(gòu)和用戶比較多時(shí),文件會(huì)比較大,所以如果文件超出一定圍后,就將文件分成多份進(jìn)行發(fā)送。LRESULTCServerDlg::OnOrgMsg(WPARAMwParam,LPARAMlParam){ WORDnEvent=WSAGETSELECTEVENT(lParam); //獲取網(wǎng)絡(luò)事件 WORDnError=WSAGETSELECTERROR(lParam); //獲取錯(cuò)誤代碼…… DWORDdwRead=file.ReadHuge(pTmp,dwMsg-sizeof(CPackage)); intnlen= send(sock,pData,dwMsg,0);…… closesocket(sock);// delete[]pBuffer; } break; } } returnS_OK;}UserIsLogined()函數(shù)主要用來判斷客戶端是否已經(jīng)在線了,和FindClient函數(shù)類似,同樣需要遍歷整個(gè)列表,同樣如果列表中有一樣的IP和ID,說明客戶端存在,否則客戶端不存在。BOOLCServerDlg::UserIsLogined(intnID,SOCKETsock){ //獲取套接字IP sockaddr_inAddr; Addr.sin_family=AF_INET; intnAddrlen=sizeof(sockaddr_in); intnRet=getsockname(sock,(sockaddr*)&Addr,&nAddrlen); if(nRet==0)…… &&strcmp(pClient->m_szClientIP,szIP)!=0) { returnTRUE; } } m_ClientSockList.GetNext(pos); } } returnFALSE;}4.2服務(wù)器端賬戶管理模塊4.2.1服務(wù)器端賬戶管理概述賬戶管理模塊主要完成向已建好的部門中添加部門成員,“賬戶管理”模塊如圖4.3所示。圖4.3“賬戶管理”模塊4.2.2窗口設(shè)計(jì)創(chuàng)建一個(gè)對話框,向?qū)υ捒蛑刑砑訕淇丶?、按鈕、編輯框、組合框等控件。設(shè)置窗體中的各種控件屬性,如表4.2所示表4.2控件屬性控件類型資源值對應(yīng)類成員名稱或含義屬性設(shè)置ButtonIDC_BTADDOnBtadd添加默認(rèn)ButtonIDC_BT_DELETEOnBtDelete刪除默認(rèn)TreeControlIDC_ORGLISTm_Orglist組織結(jié)構(gòu)HasbuttonHaslineComboBoxIDC_SEXm_Sex性別DroplistDataEditBoxIDC_ACCOUNTIDm_AccoutID賬戶IDnumberEditBoxIDC_ACNAMEm_AccountName默認(rèn)EditBoxIDC_ACPASSWORDm_Password密碼passwordEditBoxIDC_DEPARTm_OrgName部門ReadOnlyEditBoxIDC_DEPAPTIDm_OrgID部門IDReadOnlyNumberEditBoxIDC_HANDERSHIPm_HanderShip職務(wù)默認(rèn)EditBoxIDC_USERIDm_UserID用戶IDReadOnlyEditBoxIDC_CURUSERm_User賬戶ReadOnly4.2.3關(guān)鍵代碼分析LoadOrgInfo()函數(shù)從數(shù)據(jù)庫中讀取信息,將數(shù)據(jù)添加到屬性結(jié)構(gòu)中,并生成xml文件,將數(shù)據(jù)庫中的容生成XML文件。voidCAccountManage::LoadOrgInfo(){ if(m_InitSucess) //已連接數(shù)據(jù)庫 { m_OrgList.DeleteAllItems(); //刪除所有節(jié)點(diǎn) CStringsql="select*fromtb_OrgInfowhereParentID=0"; CStringszOrgName; HTREEITEMhRoot,hParent; m_DataManage.m_pRecord=m_DataManage.m_pConnect->Execute("select*fromtb_OrgInfowhereParentID=0",0,adCmdText); hRoot=m_OrgList.InsertItem("部門組織",0,0); //添加根節(jié)點(diǎn)…… m_pXMLDoc->save((unsignedshort*)(_bstr_t)szFileName); m_OrgList.Expand(hRoot,TVE_EXPAND); m_pXMLDoc.Release(); }}在程序讀寫XML文件需要借助微軟提供的接口,如果使用Windows2000操作系統(tǒng),還需要到微軟的官方下載關(guān)于XML解析的動(dòng)態(tài)庫。使用微軟提供的XML接口步驟。打開數(shù)據(jù)可讀取數(shù)據(jù),將讀取的子節(jié)點(diǎn)數(shù)據(jù)顯示到樹形結(jié)構(gòu)中,并將數(shù)據(jù)寫入XML文件,代碼如下:voidCAccountManage::LoadAccountInfo(){ CStringszSQL,szName,szOrgName,szSex; intnOrgID,nAccountID; szSQL.Format("select*fromtb_Account"); _RecordsetPtrpRecord=m_DataManage.m_pConnect->Execute((_bstr_t)szSQL,0,adCmdText);…… if(hInsert!=NULL) { DWORDdwData=MAKELRESULT(0,nAccountID); m_OrgList.SetItemData(hInsert,dwData); } m_pXMLDoc->save((unsignedshort*)(_bstr_t)szFileName); pRecord->MoveNext(); } m_pXMLDoc.Release();}FindNode()是遞歸調(diào)用函數(shù),從數(shù)據(jù)庫讀取子節(jié)點(diǎn)數(shù)據(jù)并保存到XML文件中。while(!pRecord->ADOEOF) { OrgName=(TCHAR*)(_bstr_t)pRecord->GetFields()->GetItem("OrgName")->Value; intnID=pRecord->GetFields()->GetItem("OrgID")->Value.iVal; hTemp=m_OrgList.InsertItem(OrgName,0,0,hParent);…… FindNode(hTemp,nID,pTmp); pRecord->MoveNext(); }}查找樹形結(jié)構(gòu)中節(jié)點(diǎn)是否存在,并遞歸調(diào)用返回子節(jié)點(diǎn),代碼如下:HTREEITEMCAccountManage::GetOrgItem(intnOrgID,HTREEITEMhCurrent){ HTREEITEMhRet=NULL; if(hCurrent!=NULL) { DWORDdwData=m_OrgList.GetItemData(hCurrent); intnID=LOWORD(dwData); if(nID!=0&&nID==nOrgID)…… while(hFind!=NULL) { hFind=m_OrgList.GetNextItem(hFind,TVGN_NEXT); hRet=GetOrgItem(nOrgID,hFind); if(hRet!=NULL) returnhRet; } returnhRet;}進(jìn)行添加操作,首先獲取用戶的輸入信息,對輸入信息進(jìn)行判斷,然后將合法的用戶的賬戶數(shù)據(jù)保存到數(shù)據(jù)庫,代碼如下:if(szAcID.IsEmpty()||szAcName.IsEmpty()||szSex.IsEmpty()||szOrgName.IsEmpty() ||szOrgID.IsEmpty()||szPassword.IsEmpty()||szHanderShip.IsEmpty()) { MessageBox("信息不能為空!","提示"); return; } if(atoi(szAcID)>300000) {…… catch(__error&e) { MessageBox("操作失敗!","提示"); }}4.3服務(wù)器端系統(tǒng)組織結(jié)構(gòu)管理模塊4.3.1服務(wù)器端系統(tǒng)組織結(jié)構(gòu)概述系統(tǒng)組織結(jié)構(gòu)管理模塊主要完成組織結(jié)構(gòu)的建立,程序運(yùn)行結(jié)果如圖4.4所示。圖4.4“系統(tǒng)組織結(jié)構(gòu)管理”模塊4.3.2窗口設(shè)計(jì)創(chuàng)建一個(gè)對話框,向?qū)υ捒蛑刑砑訕淇丶⑽谋究蚩丶?、靜態(tài)文本控件和按鈕控件,設(shè)置窗口中的各種控件屬性如表4.3所示。表4.3控件屬性控件類型資源值對應(yīng)類成員名稱默認(rèn)屬性ButtonIDC_BT_ADDOnBtAdd添加默認(rèn)ButtonIDC_BT_DELOnBtDel刪除默認(rèn)TreeControlIDC_ORGLISTm_OrgList組織結(jié)構(gòu)HasbuttonHaslineEdieBoxIDC_CURRENTNODEm_CurNode當(dāng)前節(jié)點(diǎn)ReadOnlyEdieBoxIDC_ORGNAMEm_OrgName組織名稱默認(rèn)4.3.3關(guān)鍵代碼LoadOrgInfo()從數(shù)據(jù)庫的tb_OrgInfo表中讀取組織結(jié)構(gòu)信息,將組織機(jī)構(gòu)信息添加到樹形結(jié)構(gòu)中,通過FindNode函數(shù)查詢出子節(jié)點(diǎn)數(shù)據(jù),代碼如下: if(m_InitSucess) //數(shù)據(jù)庫已連接 { m_OrgList.DeleteAllItems(); //刪除所有節(jié)點(diǎn) CStringsql="select*fromtb_OrgInfowhereParentID=0"; CStringOrgName;……FindNode(hParent,nID); m_DataManage.m_pRecord->MoveNext(); } m_OrgList.Expand(hRoot,TVE_EXPAND); } }FindNode()函數(shù)查詢指定的ID節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)據(jù),函數(shù)使用遞歸算法獲取指定節(jié)點(diǎn)的所有子節(jié)點(diǎn),代碼如下:voidCOrgManage::FindNode(HTREEITEMhParent,intParentID){ _ConnectionPtrpCon; //定義連接對象 _RecordsetPtrpRecord; //定義記錄集對象……dwData=MAKELPARAM(nID,ParentID); m_OrgList.SetItemData(hTemp,dwData); FindNode(hTemp,nID); pRecord->MoveNext(); }}5客戶端關(guān)鍵技術(shù)5.1客戶端概述用戶使用客戶端登錄服務(wù)器,然后可以和其他登錄的用戶進(jìn)行通信??蛻舳酥鞔绑w模塊是用戶有登陸權(quán)限登錄服務(wù)器后的界面,在主窗體界面中,主要有一個(gè)樹形列表,樹形列表中顯示了所有的組織結(jié)構(gòu)與結(jié)構(gòu)下的成員。并且在主窗體上可以調(diào)用系統(tǒng)設(shè)置和修改密碼等其他模塊??蛻舳酥鹘缑嫒鐖D6.1所示。5.2客戶端的關(guān)鍵技術(shù)ThreadProc是向服務(wù)器端發(fā)送連接請求的線程,CS_CONNECTING,然后設(shè)置超時(shí)時(shí)間,如果超時(shí)需要重新連接,連接時(shí)將用戶名和密碼都會(huì)發(fā)送到服務(wù)器端。發(fā)送請求時(shí)消息包的類型設(shè)置為PT_LOGINREQUEST,服務(wù)器端會(huì)根據(jù)這個(gè)類型進(jìn)行相應(yīng)的處理。在LoginSrv()函數(shù)中調(diào)用InitSocket初始化網(wǎng)絡(luò)套接字,然后啟動(dòng)ThreadProc線程向服務(wù)器發(fā)送登錄請求。OnTimer是定時(shí)器,其可以判斷CS_CONNECT、CS_UNCONNECT、CS_CONNECTING這3種狀態(tài);通過計(jì)數(shù)標(biāo)量m_mCount判斷是否連接中斷,根據(jù)連接狀態(tài)改變系統(tǒng)托盤圖標(biāo)的樣式。初始化m_ClientSock和m_UdpSock套接字,將IP地址都綁定為本機(jī)IP地址,然后隨機(jī)選用端口,隨機(jī)選用端口使用goto語句形成了一個(gè)循環(huán),直到能正確獲得端口后循環(huán)停止,并且將套接字都設(shè)置為異步通信。在OnNetEvent中主要處理分包,以與對消息類型為PT_TEST、PT_USERINFO、PT_DISCOUNT、PT_LOGINACCEPT、PT_LOGINDENY、PT_LINEACCEPT、PT_UPDATEPASSSUCCESS、PT_PT_UPDATEPASSFAILD數(shù)據(jù)包進(jìn)行處理,主要消息類型如圖5.1所示。如果接收到PT_TEST的數(shù)據(jù)包,需要向服務(wù)器回復(fù)心跳測試。如果是PT_USERINFO的消息包,需要播放聲音提示并在主窗體的樹形列表改變新登錄用戶的圖標(biāo)。圖5.1消息類型在OnOrgMsg中主要接收組織結(jié)構(gòu)信息,如果組織機(jī)構(gòu)信息比較大,一次只能接收固定大小的容,所以設(shè)計(jì)了分包處理機(jī)制,當(dāng)數(shù)據(jù)接收完整后,通過HandleOrgData函數(shù)進(jìn)行處理。OnOrgMsg處理分包的流程如圖5.2所示。圖5.2處理分包流程如果是第一次處理讀取的數(shù)據(jù),可以分為包結(jié)構(gòu)是否完整兩種情況。將實(shí)現(xiàn)對讀取的數(shù)據(jù)進(jìn)行分析和處理。讀取部分?jǐn)?shù)據(jù)包結(jié)構(gòu)后,需要繼續(xù)判斷數(shù)據(jù)包結(jié)構(gòu)是否完整。其中OnOrgMsg()函數(shù)中關(guān)于數(shù)據(jù)包結(jié)構(gòu)是否完整的處理過程。獲取完整的數(shù)據(jù)結(jié)構(gòu)后,就需要判斷數(shù)據(jù)包是否已經(jīng)接收完畢,OnOrgMsg()函數(shù)中關(guān)于數(shù)據(jù)包是否完整的處理過程。RecTaskProc是接收消息并處理的線程。處理流程如圖5.3所示。圖5.3接收消息并處理的處理流程判斷是否為第一個(gè)接收的數(shù)據(jù)包,如果是第一個(gè)接收的數(shù)據(jù)包,需要播放聲音提示,并找到對話框進(jìn)行交互。如果不是第一個(gè)接收的數(shù)據(jù)包,那么就進(jìn)行分包處理。OnUdpMsg用來接收UDP消息并處理。函數(shù)中使用recvfrom接收消息,如果接收到PT_REQUESTUDPPORT,就創(chuàng)建新套接字,然后將端口信息發(fā)送過去。如果有PT_TEXT類型的數(shù)據(jù),就直接進(jìn)行顯示。6系統(tǒng)測試6.1軟件測試基礎(chǔ)理論軟件測試是根據(jù)軟件開發(fā)各階段的規(guī)格說明和程序的部結(jié)構(gòu)而精心設(shè)計(jì)的一批測試用例,并利用這些測試用例運(yùn)行程序以與發(fā)現(xiàn)錯(cuò)誤的過程,即執(zhí)行測試步驟。軟件測試就是在軟件投入運(yùn)行前,對軟件需求分析、設(shè)計(jì)規(guī)格說明和編碼實(shí)現(xiàn)的最終審查,它是軟件質(zhì)量保證的關(guān)鍵步驟。測試的含義:所謂測試,首先是一項(xiàng)活動(dòng),在這項(xiàng)活動(dòng)中某個(gè)系統(tǒng)或組成的部分將在特定的條件下運(yùn)行,結(jié)果將被觀察和記錄,并對系統(tǒng)或組成部分進(jìn)行評價(jià)。測試活動(dòng)有兩種結(jié)果:找出缺陷和故障,或顯示軟件執(zhí)行正確。測試是一個(gè)或多個(gè)測試用例的集合。測試的意義:系統(tǒng)測試是管理信息系統(tǒng)的開發(fā)周期中的一個(gè)十分重要環(huán)節(jié)。盡管在系統(tǒng)開發(fā)周期的各個(gè)階段均采取了嚴(yán)格的技術(shù)審查,但依然難免會(huì)留下錯(cuò)誤,如果沒有在投入運(yùn)

溫馨提示

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

評論

0/150

提交評論