QQ軟件詳細(xì)設(shè)計_第1頁
QQ軟件詳細(xì)設(shè)計_第2頁
QQ軟件詳細(xì)設(shè)計_第3頁
QQ軟件詳細(xì)設(shè)計_第4頁
QQ軟件詳細(xì)設(shè)計_第5頁
已閱讀5頁,還剩270頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章基于VisualBasic的軟件項目設(shè)計

L6軟件文檔

http:〃act.it.sohu.com/book/serialize.php?id=434

軟件開發(fā)越來越復(fù)雜,軟件功能也越來越豐富。而幾乎所有成熟的商業(yè)軟件,都是一個開發(fā)團(tuán)隊齊心協(xié)力的血汗?

1目管理的成敗是控制開發(fā)成本的關(guān)鍵環(huán)節(jié)。這里少不了貫穿其中的重要步驟一一軟件文檔。

C檔可以分為開發(fā)文檔和產(chǎn)品文檔兩大類。

C檔包括以下內(nèi)容。

《功能要求》一一來源于客戶要求和市場調(diào)查,是軟件開發(fā)中最早期的一個環(huán)節(jié)??蛻籼岢鲆粋€模糊的功能概念,§

/一個實際問題,或者參照同類軟件的一個功能。有軟件經(jīng)驗的客戶還會提供比較詳細(xì)的技術(shù)規(guī)范書,把他們的要,

臺寫在文檔中,必要時加以圖表解說。這份文檔是需求分析的基礎(chǔ)。

《需求分析》一一包括產(chǎn)品概述、主要概念、操作流程、功能列表和解說、注意事項、系統(tǒng)環(huán)境等。以《功能要求》

E行詳細(xì)的功能分析(包括客戶提出的要求和根據(jù)開發(fā)經(jīng)驗建議的功能),列出本產(chǎn)品是什么,有什么特殊的概念,1

旨分類,需要具備什么功能,該功能的操作如何,實現(xiàn)的時候該注意什么細(xì)節(jié),客戶有什么要求,系統(tǒng)運行環(huán)境的要

勺功能描述與以后的使用手冊是一致的。

《技術(shù)分析》一一包括技術(shù)選型、技術(shù)比較、開發(fā)人員、關(guān)鍵技術(shù)問題的解決、技術(shù)風(fēng)險、技術(shù)升級方向、技術(shù)方案

寸手技術(shù)分析等。以《需求分析》為基礎(chǔ),進(jìn)行詳細(xì)的技術(shù)分析(產(chǎn)品的性能和實現(xiàn)方法),列出本項目需要使用什/

為什么,有哪些技術(shù)問題要解決,估計開發(fā)期間會碰到什么困難,技術(shù)方案以后如何升級,對本項目的技術(shù)有什/

《系統(tǒng)分析》一一包括功能實現(xiàn)、模塊組成、功能流程圖、函數(shù)接口、數(shù)據(jù)字典、軟件開發(fā)需要考慮的各種問題等。I

亍》為基礎(chǔ),進(jìn)行詳細(xì)的系統(tǒng)分析(產(chǎn)品的開發(fā)和實現(xiàn)方法),估計開發(fā)期間需要把什么問題說明白,程序員根據(jù)0

開始在項目主管的帶領(lǐng)下進(jìn)行編碼。

《界面文檔》一一包括軟件外觀、界面素材、編輯工具、文件名、菜單、按鈕和其他界面部件的要求,這里與軟件5

亍界面是一致的。

項目總結(jié)》一一包括項目簡介、項目參與人員和開發(fā)時間、項目風(fēng)險管理過程、項目功能列表、項目結(jié)構(gòu)特點、

才項目的升級建議、對以后的項目的建議、人員素質(zhì)情況等。

C檔包含以下內(nèi)容。

《產(chǎn)品簡介》一一包括公司背景、產(chǎn)品概念、適用范圍、產(chǎn)品功能、功能特點、運行要求和公司聯(lián)系地址。

《疑問解答》一一列出用戶關(guān)心的問題和處理方法。用于解答軟件的操作功能和解決用戶的疑難問題。

《功能介紹》一一以《需求分析》為書寫基礎(chǔ),包括軟件介紹、軟件結(jié)構(gòu)、功能列表、功能描述和公司聯(lián)系地址。

技術(shù)白皮書》一一以《技術(shù)分析》為書寫基礎(chǔ),包括功能實現(xiàn)、技術(shù)選型、關(guān)鍵技術(shù)問題的解決、技術(shù)方案特點、

亍向等。

《安裝手冊》一一包括系統(tǒng)環(huán)境、運行平臺、產(chǎn)品安裝過程、初始環(huán)境設(shè)置、安裝記錄等。

《使用手冊》一一包括產(chǎn)品簡介、功能列表、功能描述和解釋、功能操作、客戶服務(wù)和聯(lián)系方式等。

《維護(hù)手冊》一一包括產(chǎn)品簡介、初始環(huán)境設(shè)置、系統(tǒng)配置、數(shù)據(jù)管理和備份、技術(shù)問題解答和聯(lián)系方式等。

第2章企業(yè)信使軟件

2.1企業(yè)信使軟件的介紹

R業(yè)都希望盡量增進(jìn)內(nèi)部員工之間的交流,而且希望這種交流能夠省時、方便、充分。

即使是傳統(tǒng)企業(yè),也開始使用計算機管理日常工作,更不用說現(xiàn)在的高科技企業(yè)了,計算機成了工作的必需裝備,

子域網(wǎng)和互聯(lián)網(wǎng)應(yīng)用已經(jīng)普及,為充分利用網(wǎng)絡(luò)這個載體來互相交流提供了條件,如E-mail、公司內(nèi)部論壇等等。

F為企業(yè)員工之間的交流又提供了一個新的手段,它是一個可以自定義的網(wǎng)絡(luò)信息傳遞軟件,能即時發(fā)送信息,當(dāng)又

上信息也不會丟失。除了提供發(fā)送信息的功能外,還提供了用戶分組、表情符號、信息提示等多種輔助功能。

目軟件的設(shè)計、編程、測試前,為了讓讀者對該軟件有個總體的認(rèn)識,首先介紹一下該軟件的特色和功能。

L企業(yè)信使軟件的特色

氮吏軟件是一個即時信息發(fā)送軟件,用于輔助用戶之間完成信息的交流。它具有以下幾個特色。

組機制

三用戶分成兩個組一一“好友”和“黑名單”,對列入“黑名單”的用戶的消息是拒收的。

息的人性化

H業(yè)信使軟件發(fā)送消息時,可以使用如下的表情符號。

)回。②勺??少調(diào)學(xué)學(xué)與,3??單動工10審》旨二三國

上可以發(fā)送圖文并茂的信息。

古意:在一次消息發(fā)送過程中,只能使用一個圖標(biāo),否則就會報告消息過長。

息的安全性

自信息后,如果對方?jīng)]有在線,那么服務(wù)器會保留信息,等到對方上線后會自動發(fā)送給對方,這樣可以防止信息丟:

息的即時提醒

k到信息后,操作系統(tǒng)上的狀態(tài)欄圖標(biāo)就會不停閃爍,提示用戶收到了新的消息。用戶處理完新的消息后,圖標(biāo)就專

2企業(yè)信使軟件的功能

乳更軟件的功能分為兩大類一一客戶端功能和服務(wù)器端功能。

年功能L即時消息收發(fā)功能

F運行過程中,可以給指定的用戶發(fā)送即時消息,如圖2-1所示。

剃攵到其他用戶發(fā)送給自己的消息,操作系統(tǒng)狀態(tài)欄上的圖標(biāo)就會不停地變化以提示用戶,如圖2-2所示。

/欄圖標(biāo)上單擊鼠標(biāo)右鍵,就會彈出一個菜單,如圖2-3所示。

"顯示新消息”菜單項可以顯示用戶收到的新消息,如圖2-4所示。

」企業(yè)信使I

-Rm8:49區(qū)4。8:52

毯野a星期五如星期五

《力2004-6-4(?)2004-5-4

圖2-1發(fā)送即時消

圖2-2

欄圖標(biāo)提示用戶

顯示新消息

顯示歷史消息

發(fā)送消息

退出

圖2-3彈出菜

2-4新收到的消息

友新消息,就會自動將該消息從新消息隊列中刪除,并且添加到歷史消息中。

常功能2:歷史消息查詢功能

」端會保留用戶收到的歷史消息,在狀態(tài)欄的圖標(biāo)上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中單擊“顯示歷史消息、”菜一

也示歷史消息,如圖2-5所示。

圖2-5歷史消息

年功能3:留言功能

土方不在線,用戶同樣可以發(fā)送消息。該消息會保存在服務(wù)器端,對方登錄服務(wù)器后,服務(wù)器會自動發(fā)送消息給對:

年功能4:多用戶功能

一個客戶端上,允許多個用戶同時登錄并使用,由客戶端軟件來協(xié)調(diào)各個用戶之間的數(shù)據(jù)存取。

指功能5:人機界面功能

寺使客戶端的主界面如圖2-6所示。

圖2-6主界面

'菜單”可以啟動如圖2-3所示的菜單;單擊“離線”(或“上線”)按鈕可以切換客戶端是否在線;單擊“黑名單”

1戶設(shè)定的黑名單;單擊“我的好友”可以顯示用戶設(shè)定的好友名單。

乳更在運行的過程中,在操作系統(tǒng)的狀態(tài)欄上會增加一個圖標(biāo),并且該圖標(biāo)在用戶收到新的消息時會不停地變換。

昌端功能1:監(jiān)測用戶狀態(tài)

?器端,不但可以看到所有用戶的注冊信息,還可以實時地看到用戶的在線狀態(tài)(通過Status字段的值),如圖2-7

導(dǎo)端功能2:顯示用戶留言

考個用戶給另外一個不在線的用戶發(fā)消息、,那么就會在服務(wù)器端作為留言記錄下該條信息,如圖2-8所示。

圖2-7服務(wù)器端

圖2-8服務(wù)器端的留言

3企業(yè)信使軟件的客戶定位

上針對下面這樣的客戶群。

外一企業(yè)內(nèi)的辦公人員。

H業(yè)規(guī)模較大或經(jīng)常需要異地辦公的IT人士。

爭望使用自己的聊天軟件的固定交往群體。

工些客戶都具有一些共同點:那就是即時信息對他們都具有非常重要的意義,而且由于使用了獨特的企業(yè)信使軟件,

了以得到更大的保障

第2章企業(yè)信使軟件

2.2系統(tǒng)設(shè)計與選型

『面的介紹,讀者對企業(yè)信使軟件已經(jīng)有了總體上的認(rèn)識,下面開始介紹該軟件的設(shè)計過程和開發(fā)細(xì)節(jié)。

L了解用戶需求

攵件,也許源于公司的需要,也許是受人委托,無論哪種情況,充分了解用戶的需求才能開發(fā)出好用的軟件。

三工作以前,先充分了解用戶的需求才能最終滿足該軟件用戶的需求,這樣才可能避免在軟件開發(fā)過程中進(jìn)行一而I

勺改動,耗時耗力,增加了成倍的工作量。

更多軟件公司不僅自行開發(fā)商業(yè)軟件,還有一個重要的業(yè)務(wù)就是“接項目”一一應(yīng)客戶的需求開發(fā)軟件。項目開發(fā)至

軟件已經(jīng)成形,內(nèi)部測試后就演示給客戶,往往這時候麻煩來了,麻煩產(chǎn)生的原因一般都是在于用戶的需求發(fā)生:

一開始對軟件的功能往往只有初步的認(rèn)定(甚至只是初步的意向),只有具體的東西真正放在面前時,他才可能會關(guān)注

m出流程不是這樣的,應(yīng)當(dāng)還具備什么樣的功能等等,或者報表的形式如何如何。

(遠(yuǎn)是這方面的專家。所以,在進(jìn)行系統(tǒng)設(shè)計前一定要充分與用戶交談,了解用戶的行業(yè)、行業(yè)術(shù)語、日常業(yè)務(wù)、{

E看以往的書面報表等等。尤其要注意的是如果用戶以前也使用計算機管理,一定要研究以前使用的管理軟件,為彳

不好的地方在哪方面,需要保留的好的方面是什么,這樣才能在系統(tǒng)設(shè)計時盡可能提供詳細(xì)的設(shè)計說明書。

1戶需求很可能產(chǎn)生變動,所以增量迭代(incrementalanditerative)的方法確實值得推廣,但是這又涉及到一彳

乏的問題,因為由此會提高對Architect的能力要求,而且需求管理和測試更加要求嚴(yán)格。

k性質(zhì)的軟件,更是要充分調(diào)查潛在消費者的需求,然后確定軟件的功能和風(fēng)格等等,錯誤的市場定位必然導(dǎo)致軟系

攵。由此可見,了解用戶需求是多么重要。

企業(yè)信使軟件,用戶的基本需求如下。

1戶登錄功能:只有注冊過的用戶才能使用該軟件發(fā)送和接受信息。

斤用戶注冊功能:注冊新用戶。

旨夠添加好友,并顯示在好友名單中,

旨夠在好友名單中選擇一個好友,給好友即時發(fā)送信息;

名送的信息中可以帶有表情符號。

4好友不在線時信息存儲在服務(wù)器,也就是可以給其留言。

芻收到信息時要求有提示,避免錯過及時查看信息。

旨夠存儲歷史信息,一邊查看以前的信息。

購多將某些人添加到黑名單,能自動屏蔽黑名單中的人發(fā)送來的信息,避免被騷擾。

力能集中,所以看起來很簡單。即使如此,由于絕大多數(shù)項目沒有足夠的時間或資源實現(xiàn)每個功能,所以需要決定W

公要的,哪些是重要的,這些是需求開發(fā)的主要部分。只能由客戶負(fù)責(zé)設(shè)定需求優(yōu)先級,因為開發(fā)者不可能按照客尸

工需求優(yōu)先級。盡管沒有人愿意看到自己所希望的需求在項目中未被實現(xiàn),但畢竟是要面對現(xiàn)實,業(yè)務(wù)決策有時不?

匕級來縮小項目范圍,或在質(zhì)量上尋求折中。

,信使軟件來看,最重要的需求一般是第1、2、4項。

2軟件工具的選型

考慮可能的解決方案。例如,使用何種開發(fā)工具,信息存儲使用傳統(tǒng)的文件系統(tǒng)還是數(shù)據(jù)庫,使用何種方式進(jìn)行R

I常至少應(yīng)該考慮下述幾類可能的方案。

E成本的解決方案:系統(tǒng)只能完成最必要的工作,不能多做一點額外的工作。

」等成本的解決方案:這樣的系統(tǒng)不僅能夠很好地完成預(yù)定的任務(wù),使用起來很方便,而且可能還具有用戶沒有具f

烏功能和特點。雖然用戶沒有提出這些具體要求,但是系統(tǒng)分析員根據(jù)自己的知識和經(jīng)驗斷定,這些附加的能力在2

目是很有價值的。

于成本的“十全十美”的系統(tǒng):這樣的系統(tǒng)具有用戶可能希望有的所有功能和特點。

》權(quán)衡各種方案的利弊的基礎(chǔ)上,選擇一個較好的系統(tǒng)(最佳方案)。本例企業(yè)信使軟件的主體開發(fā)環(huán)境選擇的是Vi

6.0(SP6),搭配的是ADO技術(shù)調(diào)用Access數(shù)據(jù)庫,選擇的理由如下。

:軟件的技術(shù)難度不是很大,但是需要實現(xiàn)的細(xì)節(jié)功能比較多,所以選擇一個相對比較容易使用的開發(fā)工具有利于*

口在軟件的功能本身,而不是開發(fā)工具的使用,所以選擇VisualBasic6.0(SP6)中文版作為開發(fā)環(huán)境。

E服務(wù)器端需要利用數(shù)據(jù)庫記錄用戶的留言信息,在客戶端需要利用數(shù)據(jù)庫記錄用戶接受到的新消息和歷史消息。i

F構(gòu)成很大的數(shù)據(jù)量,所以不需要采用MSSQLServer等大中型數(shù)據(jù)庫,而采用ADO控件可以非常方便調(diào)用的Acce

到微軟的網(wǎng)站上給VisualBasic安裝補丁SP6后,使得本軟件的開發(fā)工作節(jié)省了不少力氣,否則ImageCombo控聿

Io

3功能分析

打吏軟件的客戶端功能細(xì)分如下。

E狀態(tài)欄的狀態(tài)欄區(qū)上顯示圖標(biāo)。

E主界面中通過菜單調(diào)用新消息處理界面。

E主界面中通過菜單調(diào)用歷史消息處理界面。

I過狀態(tài)欄圖標(biāo)可以調(diào)用菜單,并且以動畫形式醒目地提示用戶收到了新消息。

1ADO控件讀寫包含rtf文檔的數(shù)據(jù)庫。

、在線用戶發(fā)送即時消息。

、不在線用戶發(fā)送留言消息。

芻息中可以包括圖標(biāo)和文本。

丁以設(shè)置消息文本的顏色和字體。

為聯(lián)系人分組。

屏蔽黑名單的信息。

乳更軟件的服務(wù)器端功能細(xì)分如下。

三界面中顯示所有用戶的注冊信息。

三界面中顯示所有用戶的在線狀態(tài)。

也示所有的留言信息。

存時修改用戶的注冊信息。

朋寸修改留言信息。

I模塊分工設(shè)計

支計階段的第二項主要任務(wù)就是設(shè)計軟件的結(jié)構(gòu),也就是確定程序由哪些模塊組成以及模塊間的關(guān)系。通常用層次噲

3繪軟件的結(jié)構(gòu)。

、項目中,包含兩類軟件模塊——窗體模塊和Module模塊,如圖2-9所示。

,塊結(jié)構(gòu)圖,各窗體的分工如下。

客戶端”主窗體:顯示客戶端主界面。

登錄”窗體:已經(jīng)注冊過的用戶直接登錄,或者激活注冊向?qū)А?/p>

"注冊向?qū)?"窗體:已經(jīng)注冊過的用戶仍然可以通過這里直接登錄,沒有注冊過的用戶可以進(jìn)入注冊向?qū)?。

“注冊向?qū)?"窗體:輸入注冊用戶的信息并且連接服務(wù)器獲得用戶ID。

"新消息處理”窗體:顯示用戶接收的新消息,并且在其中可以將新消息轉(zhuǎn)移到歷史消息中。

"歷史消息處理”窗體:顯示用戶接收到的所有消息,并且在其中可以進(jìn)行刪除操作。

"消息發(fā)送”窗體:給指定用戶發(fā)送消息。

支務(wù)器主窗體:顯示服務(wù)器主界面。

lule模塊的分工如下。

三模塊:獲取程序中公用的參數(shù),并且決定啟動“客戶端”主窗體。

D存索引模塊:從配置文件中讀取信息(好友名單和黑名單)到內(nèi)存中、將數(shù)組中存儲的信息存儲到配置文件中。

尺態(tài)欄操作模塊:為狀態(tài)欄添加圖標(biāo)、刪除圖標(biāo)、改變圖標(biāo)等。

本除件S目

圖2-9模塊結(jié)構(gòu)圖

第2章企業(yè)信使軟件

2.3網(wǎng)絡(luò)協(xié)議的設(shè)計⑴

布中服務(wù)器軟件、客戶端軟件之間的協(xié)作完全依賴網(wǎng)絡(luò)通信,通信信息采用ASCH碼明文傳送,這樣對不同類型的類

另一的方式。

古意:本系統(tǒng)中,服務(wù)器的IP地址已經(jīng)固化在客戶端的程序中——192.168.0.1,如果服務(wù)器的IP地址不是192.168.0.1,請在“名

FrmClient的FormLoad事件中修改。

導(dǎo)息總體格式定義如下。

命令號(Integer)命令內(nèi)容(String)

彳固定占有3個字符的空間,內(nèi)容的具體格式與命令有關(guān)。

『紹了定義的一些基本命令,需要時擴充。

1申請新用戶的命令

拿一個新用戶

才令號:001

1容:”用戶昵稱;用戶密碼;用戶的電子郵箱地址”

W接受新用戶的申請

士令號:002

,容:“用戶ID”

W拒絕新用戶的申請

上令號:003

1容:”新用戶申請失敗的原因”

!個命令的處理流程如圖2-10所示。

圖2To001、002、003命令處理流程

2信息處理的命令

,端讀取指定用戶的信息

上令號:101

1容:“用戶ID”

&指定用戶的信息

上令號:102

1容:“用戶ID=用戶昵稱;用戶電子郵箱地址;用戶表情”

M發(fā)送指定用戶的信息

上令號:103

1容:“讀取用戶信息出錯信息”

三個命令的處理流程如圖2-11所示。

?-------------------101(讀取攝定用戶的格息)----------

I---------------

<、AE匏益二>103(柜班發(fā)送報運用戶的信息L客戶端

x__]

1----------------102(發(fā)送抵運用戶的信息)--------1

圖2Tl101、102、103命令處理流程

I設(shè)置好友的命令

導(dǎo)添加一名好友

方令號:121

1容:“客戶ID:好友ID”

々添加好友的申請

上令號:122

1容:“好友ID=好友昵稱;好友電子郵箱地址;好友表情”

自添加好友的申請

上令號:123

1容:“拒絕接受申請的理由”

三個命令的處理流程如圖2-12所示。

I------------------121(由話■添加-名好友)----------

I

既外器7—123(拒絕港加好友的奉詢一*客戶端

Y__I

1-------------------122(極受港加好友的電請)---------1

圖2-12121、122、123命令處理流程

I與登錄相關(guān)的命令

W服務(wù)器

F令號:151

1容:”用戶ID;用戶密碼”

F登錄服務(wù)器

上令號:152

1容:“用戶ID=用戶昵稱;用戶電子郵箱地址;用戶表情”

M登錄服務(wù)器

上令號:153

1容:”拒絕登錄的原因”

三個命令的處理流程如圖2-13所示。

151(登錄展務(wù)部)------------

服務(wù)黔)--------153(拒絕變承展務(wù)格)------客戶選

I________________152(允許登柔服外部)

圖2-13151、152、153命令處理流程

5設(shè)置黑名單的命令

導(dǎo)添加一名黑名單

士令號:161

1容:“客戶ID:黑名單ID”

七添加黑名單的申請

上令號:162

,容:“黑名單ID=黑名單昵稱;黑名單電子郵箱地址;黑名單表情”

£添加黑名單的申請

上令號:163

1容:”拒絕接受申請的理由”

三個命令的處理流程如圖2-14所示。

161(由詩潘加一名取名羊)---------

163(拒絕添加黑名能的由南一客戶端

162(接受添加黑名故的中請)-------

圖2T4161、162、163命令處理流程

5獲取消息的命令

克務(wù)器獲取留言

方令號:200

1容:“”

卜器發(fā)送消息給用戶

方令號:204

1容:”發(fā)送消息的用戶ID①發(fā)送消息的時間②消息內(nèi)容③發(fā)送消息的用戶ID①發(fā)送消息的時間②消息內(nèi)容③…”

囪個命令的處理流程如圖2-15所示。

圖2-15200、204命令處理流程

第2章企業(yè)信使軟件

2.3網(wǎng)絡(luò)協(xié)議的設(shè)計⑵

2.3.7發(fā)送消息的命令

1.發(fā)送消息給服務(wù)器

(1)命令號:201

(2)內(nèi)容:”接收消息的用戶ID=消息內(nèi)容”

2.不能成功地發(fā)送消息給指定用戶

(1)命令號:203

(2)內(nèi)容:“用戶ID=消息內(nèi)容;失敗原因”

以上兩個命令的處理流程如圖2-16所示。其中204命令號在2.3.6節(jié)中已做了

描述。

圖2-16201、203、204命令處理流

第2章企業(yè)信使軟件

2.4數(shù)據(jù)環(huán)境的設(shè)計

首先分析本系統(tǒng)所需要存儲的數(shù)據(jù)。在服務(wù)器端,需要存儲用戶信息,以進(jìn)行用戶登錄、注冊新用戶,為用戶

之間的交流提供平臺。

在服務(wù)器端,由于需要接收客戶端發(fā)送來的消息,并根據(jù)自定義的網(wǎng)絡(luò)協(xié)議解析消息的含義,做出相應(yīng)的處理,

例如,將接收到的消息發(fā)送給指定用戶,所以還需要存儲服務(wù)器工作記錄。

在客戶端,需要存儲接收到的新消息和看過后保存起來的消息。

綜上所述,本系統(tǒng)中需要設(shè)計兩個基于Access的數(shù)據(jù)庫,分別存儲在服務(wù)器端和客戶端應(yīng)用程序路徑下面,

服務(wù)器端的文件名為Users,mdb,客戶端的文件名為Data.mdb。

另外還需要為客戶端設(shè)計一個ini文件,文件保存在客戶端應(yīng)用程序路徑下面,用來記錄好友名單和黑名單,

文件名為Users,inio

2.4.1服務(wù)器端Users,mdb的結(jié)構(gòu)

Users.mdb僅僅用于在服務(wù)器端。

首先用Access創(chuàng)建數(shù)據(jù)庫Users,mdb,并且為該數(shù)據(jù)庫添加一個表Userslnformation,在Userslnformation

表中有6個字段,見表2-L

表2-1UsersInformation表的字段

字段名數(shù)據(jù)類型

UserID數(shù)字

Password文本

NickName文本

Mail文本

Status數(shù)字

UserFace數(shù)字

其中UserID字段用于存儲用戶ID,Password字段用于存儲用戶密碼,NickName字段用于存儲用戶的昵稱,

Mail字段用于存儲用戶的郵箱地址,Status用于存儲用戶的在線狀態(tài)(0為離線,1為在線),UserFace用于

存儲用戶選擇的頭像索引。

然后再為該數(shù)據(jù)庫添加一個表Messages,在Messages表中有4個字段,見表2-2。

表2-2Messages表的字段

字段名數(shù)據(jù)類型

ReceivedID數(shù)字

SentID數(shù)字

Content備注

Time日期/時間

其中ReceivedID字段用于存儲發(fā)送消息的用戶ID,SentID字段用于存儲接收消息的用戶ID,Content字段用

于存儲消息內(nèi)容,Time字段用于存儲服務(wù)器接收到消息的時間。

經(jīng)驗總結(jié):Content字段設(shè)置為備注類型,就可以存儲圖文混排的消息內(nèi)容了。

2.4.2客戶端Data,mdb的結(jié)構(gòu)

Data,mdb僅僅用于在客戶端。

首先用Access創(chuàng)建數(shù)據(jù)庫Data,mdb,并且為該數(shù)據(jù)庫添加兩個表NewMessages和HistoryMessages,在

NewMessages和HistoryMessages表中都有4個字段,并且它們的字段設(shè)置相同,見表2-3。

表2-3NewMessages表和HistoryMessages表的字段

字段名數(shù)據(jù)類型

ReceivedID數(shù)字

SentID數(shù)字

Content備注

Time日期/時間

其中ReceivedID字段用于存儲發(fā)送消息的用戶ID,SentID字段用于存儲接收消息的用戶ID,Content字段用

于存儲消息內(nèi)容,Time字段用于存儲服務(wù)器接收到消息的日期/時間。

2.4.3客戶端Users,iini的結(jié)構(gòu)

Users,ini文件僅僅用于客戶端記錄聯(lián)系人的信息,它是一個文本文件,典型的文件內(nèi)容如下:

[1001_Friends]

Count=2

[1001_Friends_Item0]

UserID=1000

UserNickName=1000

UserMail=0

UserFace=4

[1001_Friends_Iteml]

UserID=1002

UserNickName=haha

UserMail=h

UserFace=5

[1002_Friends]

Count=l

[1002_Friends_Item0]

UserID=1000

UserNickName=1000

UserMail=0

UserFace=4

[1002_Badboys]

Count=l

[1002_Badboys_Item0]

UserID=1001

UserNickName=1001

UserMail=l

UserFace=6

舉例來說:[1001_Friends]下面代表用戶ID為1001的總體好友信息,Count記錄了好友的數(shù)目。

[1001_Friends_Item0]下面存儲了用戶ID為1001的第1個好友的信息,如好友ID、好友昵稱、好友郵箱以

及好友的頭像索引。

[1002_Badboys]下面代表用戶ID為1002的總體黑名單信息,Count記錄了黑名單的數(shù)目。

[1002_Badboys_Item0]下面存儲了用戶ID為1002的第1個黑名單的信息,如黑名單ID、黑名單昵稱、黑名

單郵箱以及黑名單的頭像索引。

經(jīng)驗總結(jié):本軟件中通過ini文件存取數(shù)據(jù)量很小的程序參數(shù),非常方便。通過Access數(shù)據(jù)庫可以存取數(shù)據(jù)量很大的

圖文混排的消息。

第2章企業(yè)信使軟件

2.5各個功能模塊的創(chuàng)建⑴

由于各個功能模塊之間并不是完全獨立的,有父子關(guān)系的,有交互關(guān)系的,所以在這里按照

圖2-17所示的順序介紹各個功能模塊。

圖2-17各個功能模塊的介紹順序

2.5.1服務(wù)器端主窗體frmServer

新建一個工程,將工程的名稱設(shè)置為“服務(wù)器”,工程的文件名為prjNetChatServer.vbp,為

該工程添加一個窗體frmServero

向服務(wù)器端主窗體frmServer上添加兩個Frame控件(Name屬性分別為fraUsers>

fraMessages)>兩個DataGrid控件(Name屬性分別為dgdUsers>dgdMessages)>兩個Adodc

控件(Name屬性分別為adoUsers>adoMessages)>一個RichTextBox控件(Name屬性為

rtfMessage)>一個Winsock控件(Name屬性為wskServer)和一個Timer控件(Name屬性為

tmrOnline)。

設(shè)計完成的服務(wù)器端主窗體如圖2-18所示。

各控件的主要屬性設(shè)置如下。

(1)tmrOnline控件的Interval屬性設(shè)置為lOOOo

(2)wskServer控件的Index屬性設(shè)置為0,Protocol屬性設(shè)置為O-sckTCPProtocol,RemotePort

屬性設(shè)置為50400o

(3)dgdUsers控件的DataSource屬性設(shè)置為adoUserSo

(4)dgdMessages控件的DataSource屬性設(shè)置為adoMessageso

(5)rtfMessage控件的DataSource屬性設(shè)置為adoMessages,DataField屬性設(shè)置為Contento

各控件的作用如下。

(1)fraUsers控件提供了一個框架容器,它包含dgdUsers和adoUsers控件。

(2)adoUsers控件用來讀取Userslnformation表的內(nèi)容。

⑶dgdUsers的DataSource屬性設(shè)置為adoUsers,它用來顯示adoUsers控件讀取到的內(nèi)容,

也就是Userslnformation表的內(nèi)容。

(4)fraMessages控件提供了一個框架容器,它包含adoMessages>dgdMessages控件和

rtfMessage控件。

(5)adoMessages控件用來讀取Users.mdb數(shù)據(jù)庫中Messages表的內(nèi)容。

(6)dgdMessages的DataSource屬性設(shè)置為adoMessages,它用來列表顯示adoMessages控件

讀取到的內(nèi)容,也就是Messages表的內(nèi)容。

⑺rtfMessage控件:顯示在dgdMessages控件中選中行(留言)的具體內(nèi)容。

(8)tmrOnline控件的Interval屬性設(shè)置為1000,也就是每隔1秒鐘就刷新在線用戶數(shù)目。

1.服務(wù)器的初始化

在服務(wù)器工作過程中,首先執(zhí)行Form_Load過程,設(shè)置adoMessages、adoUsers控件的屬性,

使得它們分別讀取Users.mdb數(shù)據(jù)庫中Messages>Userslnformation表的記錄。

讀取Users.mdb數(shù)據(jù)庫中Messages表的記錄:

Me.adoMessages.ConnectionString=z,Provider=Microsoft.Jet.OLEDB.4.0;〃&_

“Per

sistSecurityInfo=False;"&_

〃Dat

aSource="&APPPATH&"Users.mdb〃

Me.adoMessages.CommandType=adCmdTable

Me.adoMessages.RecordSource="Messages”

Me.adoMessages.Refresh

讀取Users.mdb數(shù)據(jù)庫中Userslnformation表的記錄:

Me.adoUsers.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;〃&_

“Persist

SecurityInfo=False;"&_

“Data

Source="&APPPATH&"Users.mdb〃

Me.adoUsers.CommandType二adCmdTable

Me.adoUsers.RecordSource="Userslnformation”

Me.adoUsers.Refresh

adoMessages>adoUsers都為Adodc控件,其ConnectionString屬性設(shè)置要連接的數(shù)據(jù)源(數(shù)

據(jù)庫),需要提供數(shù)據(jù)源的類型、存儲路徑和名稱等。

對于Access2000數(shù)據(jù)庫,Provider應(yīng)為Microsoft.Jet.OLEDB.4.0o

DataSource設(shè)置為"&APP.PATH&“Users.mdb”則數(shù)據(jù)庫的存儲路徑為當(dāng)前應(yīng)用程序目錄,

數(shù)據(jù)庫文件名稱為User.mdbo

adoMessages控件的RecordSource屬性設(shè)置為Messages,則說明adoMessages控件的記錄源

為User.mdb數(shù)據(jù)庫中的Messages表。

服務(wù)器初始化的時候,還需要對窗體上的wskServer控件進(jìn)行初始化。該控件的Index屬性

設(shè)置為0,這也就是說wskServer實際上是一個控件數(shù)組,通過以下語句設(shè)置wskServer數(shù)

組中第1個控件元素的屬性,并且處于Listen狀態(tài),等待客戶端的連接:

IfMe.wskServer(0).State<>0Then

Me.wskServer(0).Close

EndIf

Me.wskServer(0).LocalPort=50400

Me.wskServer(0).Listen

同時設(shè)置LinkCount全局變量的數(shù)目為0,它表示已經(jīng)成功連接到服務(wù)器的客戶端的數(shù)目:

LinkCount=0

由于在服務(wù)器開始運行階段,不可能有客戶端進(jìn)行連接操作,所以設(shè)置所有用戶為離線狀態(tài):

'如果adoUsers.Recordset.EOF和adoUsers.Recordset.BOF都為真

'說明沒有任何用戶所以跳出此過程

IfMe.adoUsers.Recordset.EOFAndMe.adoUsers.Recordset.BOFThenExitSub

'移動記錄指針到最后一條記錄

Me.adoUsers.Recordset.MoveLast

'移動記錄指針到第1條記錄

Me.adoUsers.Recordset.MoveFirst

'從第1條記錄開始遍歷所有記錄并設(shè)置Status字段值為0

WhileNotMe.adoUsers.Recordset.EOF

Me.adoUsers.Recordset.Fields(zzStatusz/).Value=0

Me.adoUsers.Recordset.MoveNext

Wend

2.接受客戶端的連接

如果有客戶端連接到服務(wù)器,那么就會激活wskServer的wskServer_ConnectionRequest事件

過程:

PrivateSubwskServer_ConnectionRequest(IndexAsInteger,ByVairequestIDAs

Long)

'錯誤處理

OnErrorResumeNext

LinkCount=LinkCount+1

LoadwskServer(LinkCount)

wskServer(LinkCount).LocalPort=0

wskServer(LinkCount).AcceptrequestID

EndSub

程序首先將連接到服務(wù)器的客戶端的數(shù)目加1,然后通過Load方法為wskServer控件數(shù)組添

加一個新的Winsock控件元素,并且通過wskServer(LinkCount).AcceptrequestID語句設(shè)置這

個新控件元素專門對應(yīng)這個客戶端的連接。

第2章企業(yè)信使軟件

2.5各個功能模塊的創(chuàng)建(2)

3.服務(wù)器與客戶端的數(shù)據(jù)交互

服務(wù)器與客戶端的數(shù)據(jù)交互是frmServer窗體編程的重點,也是本軟件的重點之一,服務(wù)器端接收到客戶端數(shù)據(jù)后,處理的流

程如下。

(1)接收客戶端發(fā)送的數(shù)據(jù)并存儲在strReceived變量中。

(2)從strReceived變量中分析出客戶端發(fā)送的命令號和命令內(nèi)容,分別存儲在變量intCommandID和strCommandContent中。

(3)根據(jù)intCommandID變量的值,按照不同的規(guī)則分析命令內(nèi)容,并且做出響應(yīng)。

下面介紹實現(xiàn)服務(wù)器與客戶端數(shù)據(jù)交互的主要代碼。如果服務(wù)器接收到數(shù)據(jù),就會激活wskServer_DataArrival過程,首先通

過以下語句接收客戶端發(fā)送的數(shù)據(jù)并存儲在strReceived變量中:

wskServer(Index).GetDatastrReceived

strReceived變量分析出客戶端發(fā)送的命令號和命令內(nèi)容,分別存儲在變量intCommandID和strCommandContent中:

‘存儲命令號

DimintCommandIDAsInteger

intCommandID=Vai(Left(strReceived,3))

‘存儲命令內(nèi)容

DimstrCommandContentAsString

strCommandContent=Mid(strReceived,5)

由于命令號占3個字節(jié),所以使用Left(strReceived,3)獲得strReceived變量的前3個字符即可取得命令號,再使用Vai將取得

的命令號由字符轉(zhuǎn)換為數(shù)字。

然后根據(jù)不同的命令號,按照不同的規(guī)則分析命令內(nèi)容,并且做出響應(yīng):

SelectCaseintCommandID

'申請一個新用戶

'命令號:001

'內(nèi)容:〃用戶昵稱;用戶密碼;用戶的電子郵箱地址〃

Case1:

'取指定用戶的信息

'命令號:101

‘內(nèi)容:"用戶ID”

Case101:

‘申請?zhí)砑右幻糜?/p>

'命令號:121

‘內(nèi)容:"客戶ID:好友ID”

Case121:

'登錄服務(wù)器

'命令號:151

‘內(nèi)容:”用戶ID;用戶密碼”

Case151:

'申請?zhí)砑右幻诿麊?/p>

'命令號:161

‘內(nèi)容:"客戶ID:黑名單ID”

Case161:

’從服務(wù)器獲取留言

'命令號:200

‘內(nèi)容:""

Case200:

'發(fā)送消息給指定用戶的申請

'命令號:201

‘內(nèi)容:"用戶ID=消息內(nèi)容”

Case201:

EndSelect

對于服務(wù)器與客戶端進(jìn)行交互的處理過程已經(jīng)很清楚了,現(xiàn)在就以對注冊新用戶的命令為例,介紹處理數(shù)據(jù)的流程。

申請一個新用戶的命令號為001,命令內(nèi)容為“用戶昵稱;用戶密碼;用戶的電子郵箱地址”,所以,當(dāng)命令號為001時,首先

獲取用戶昵稱并存儲,代碼如下:

DimstrNickNameAsString

intPos=InStr(1,strCommandContent,vbBinaryCompare)

strNickName=Left(strCommandContent,intPos-1)

在代碼中,首先定義變量strNickName用來存儲用戶昵稱,然后獲取命令內(nèi)容中符號第1次出現(xiàn)的位置,根據(jù)符號

第1次出現(xiàn)的位置就可以確定用戶昵稱在命令內(nèi)容中的位置,從而獲得用戶昵稱并保存在strNickName變量中。

獲取用戶密碼的代碼如下:

'從命令內(nèi)容中去掉用戶昵稱部分仍然存儲在strCommandContent變量中

strCommandContent=Mid(strCommandContent,intPos+1)

'獲取用戶密碼

DimstrPasswordAsString

intPos=InStr(1,strCommandContent,〃;〃,vbBinaryCompare)

strPassword二Left(strCommandContent,intPos-1)

在代碼中,首先從命令內(nèi)容中去掉用戶昵稱部分存儲在strCommandContent變量中,此時strCommandContent變量中存儲的命

令內(nèi)容為“用戶密碼;用戶的電子郵箱地址”,然后使用與獲得用戶昵稱同樣的方法,就可以獲得用戶密碼并存儲在strPassword

變量中。

獲取用戶電子郵箱地址的代碼如下:

strCommandContent=Mid(strCommandContent,intPos+1)

'獲取用戶電子郵件

DimstrMailAsString

intPos二InStr(1,strCommandContent,〃:vbBinaryCompare)

strMail=Left(strCommandContent,intPos-1)

strCommandContent=Mid(strCommandContent,intPos+1)

取得新用戶的詳細(xì)信息后,為新用戶的UserID字段準(zhǔn)備值:

DimintUserlDAsInteger

intUserlD=1000+Me.adoUsers.Recordset.RecordCount

添加新用戶:

Me.adoUsers.Recordset.AddNew

Me.adoUsers.Recordset.Fields(,zUserID,z).Value=intUserlD

Me.adoUsers.Recordset.Fields("Password").Value=strPassword

Me.adoUsers.Recordset.Fields(〃NickName〃).Value二strNickName

Me.adoUsers.Recordset.Fields(,/Mail,/).Value=strMail

Me.adoUsers.Recordset.Fields(,zStatusz/).Value=1

Me.adoUsers.Recordset.Fields(〃UserFace〃).Value二strCommandContent

保存并更新:

Me.adoUsers.Recordset.Save

Me.adoUsers.Recordset.Update

發(fā)送申請新用戶成功的消息給客戶端:

wskServer(Index).SendData〃002:〃&CStr(intUserlD)

對其他各個命令的處理方法請參見后面的詳細(xì)代碼

第2章企業(yè)信使軟件

2.5各個功能模塊的創(chuàng)建(3)

4.客戶端斷開連接

如果客戶端斷開與服務(wù)器的連接,那么就會激活wskServer的wskServer_Close事件過程:

PrivateSubwskServer_Close(IndexAsInteger)

OnErrorResumeNext

'向數(shù)據(jù)庫中寫入客戶的狀態(tài)信息

IfwskServer(Index).Tag<>〃〃Then

'移動記錄指針到第1條記錄

Me.adoUsers.Recordset.MoveFirst

’查找斷開連接的用戶

Me.adoUsers.Recordset.Find〃UserID=〃&wskServer(Index).Tag

’將該用戶的Status設(shè)置為0

Me.adoUsers.Recordset.Fields(^Status^).Value=0

EndIf

UnloadwskServer(Index)

EndSub

程序首先向數(shù)據(jù)庫中寫入客戶的狀態(tài)信息一一設(shè)置Status字段的值為0,然后通過Unload

方法從wskServer控件數(shù)組中刪除關(guān)閉的Winsock控件。

5.服務(wù)器斷開同客戶端的連接

當(dāng)服務(wù)器停止運行時,就會主動斷開所有與客戶端的連接:

PrivateSubForm_Unload(CancelAsInteger)

DimwskTempAsWinsock

ForEachwskTempInMe.wskServer

wskTemp.Close

Next

EndSub

本模塊(frmServer.frm)的詳細(xì)代碼如下:

’設(shè)置所有變量必須聲明

OptionExplicit

'定義LinkCount變量用來記錄已經(jīng)成功連接到服務(wù)器的客戶端的數(shù)目

DimLinkCountAsInteger

'定義APP_PATH變量用來存儲應(yīng)用程序目錄

DimAPPPATHAsString

PrivateSubForm_Load()

'如果應(yīng)用程序目錄的最后一個字符為'則APP_PATH變量直接為App.Path的值

'否則APP_PATH變量為App.Path的值加上'

IfRight(App.Path,1)二〃\〃Then

APP_PATH=App.Path

Else

APP_PATH=App.Path+〃\〃

EndIf

'通過屬性設(shè)置使adoMessages控件讀取Users,mdb數(shù)據(jù)庫中Messages表

Me.adoMessages.ConnectionString=_

“Provider=Microsoft.Jet.OLEDB.4.0;〃&_

Per

sistSecurityInfo=False;"&

Dat

aSource=〃&APP_PATH&"Users.mdb〃

Me.adoMessages.CommandType二adCmdTable

Me.adoMessages.RecordSource="Messages”

Me.adoMessages.Refresh

'通過屬性設(shè)置使adoUsers控件讀取Users,mdb數(shù)據(jù)庫中UsersInformation表

Me.adoUsers.Connectionstring="Provider二Microsoft.Jet.OLEDB.4.0;〃&_

“Persist

SecurityInfo=False;"&_

“Data

Source=〃&APPPATH&"Users,mdb”

Me.adoUsers.CommandType=adCmdTable

Me.adoUsers.RecordSource二,ZUsersInformation/z

Me.adoUsers.Refresh

'對wskServer控件進(jìn)行初始化

'設(shè)置wskServer數(shù)組中第1個控件元素的屬性并且處于Listen狀態(tài)

'等待客戶端的連接

IfMe.wskServer(0).State<>0Then

Me.wskServer(0).Close

EndIf

Me.wskServer(0).LocalPort=50400

Me.wskServer(0).Listen

LinkCount=0

’設(shè)置所有用戶為離線狀態(tài)

IfMe.adoUsers.Recordset.EOFAndMe.adoUsers.Recordset.B0FThenExitSub

Me.adoUsers.Recordset.MoveLast

Me.adoUsers.Recordset.MoveFirst

WhileNotMe.adoUsers.Recordset.EOF

Me.adoUsers.Recordset.Fields(z,Status,z).Value=0

Me.adoUsers.Recordset.MoveNext

Wend

EndSub

PrivateSubForm_Unload

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論