聊天系統(tǒng)客戶端的設(shè)計與實現(xiàn)本科生畢業(yè)(論文)設(shè)計論文_第1頁
聊天系統(tǒng)客戶端的設(shè)計與實現(xiàn)本科生畢業(yè)(論文)設(shè)計論文_第2頁
聊天系統(tǒng)客戶端的設(shè)計與實現(xiàn)本科生畢業(yè)(論文)設(shè)計論文_第3頁
聊天系統(tǒng)客戶端的設(shè)計與實現(xiàn)本科生畢業(yè)(論文)設(shè)計論文_第4頁
聊天系統(tǒng)客戶端的設(shè)計與實現(xiàn)本科生畢業(yè)(論文)設(shè)計論文_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

本科生畢業(yè)設(shè)計(論文)PAGE聊天系統(tǒng)客戶端的設(shè)計與實現(xiàn)摘要SOCKET是在Windows進(jìn)行網(wǎng)絡(luò)通信編程的API接口,也是Windows網(wǎng)絡(luò)編程的事實標(biāo)準(zhǔn)。在網(wǎng)絡(luò)編程中最常用的方案便是C/S模型。本程序是一個基于C/S模式的網(wǎng)絡(luò)聊天程序,主要用于測試面向連接的socket編程技術(shù)。本程序使用VirtualC++6.0編寫。為方便測試,本程序采用server(服務(wù)器端)和client(客戶端)合一模式,使用簡潔方便。需要注意的是本程序C/S端合一的模式和服務(wù)器地址、服務(wù)器端口號固定以及自動申請用戶登陸ID的設(shè)計不只為了方便測試,而且適宜商業(yè)化,但是在商業(yè)化階段還是需要進(jìn)行改進(jìn)。本文主要是對本軟件服務(wù)器端的設(shè)計作了比較詳細(xì)的介紹,并對服務(wù)器端進(jìn)行了初步的開發(fā)。而客戶端的設(shè)計有很多都需要完善??蛻舳耸墙o用戶使用的,從方便和美觀上,還都還有很多需要完善的地方。而且,由于時間關(guān)系,客戶端還有些功能沒有完全。如果要使本系統(tǒng)成為一個實際應(yīng)用系統(tǒng)并在網(wǎng)絡(luò)上實際應(yīng)用,還要再下一番功夫進(jìn)行設(shè)計。關(guān)鍵詞:套接字客戶機(jī)服務(wù)器網(wǎng)絡(luò)聊天

ABSTRACTTheSOCKETconnectsintheAPIthattheWindowscarriesonthenetworkcorrespondenceplaitdistance,isalsothefactstandardthatthenetworkofWindowsweavesthedistance.Themostincommonuseprojectwouldbethecustomer/servermodelinnetworkweavedistance.ThistextputsforwardtocarryouttheInternetwiththeWINSOCKundercustomer/servermodelintheprojectofthefamiliarchatroomsoftware.Thisprocedureisanaccordingtocustomer/servermodeofthenetworkchatprocedure,mainlyusedforthetesttofacetothecopularsocketplaitdistance.UsetheVirtualC++6.0plaitswrite.Testfortheconvenience,theprocedureadoptionserver(theservercarry)andclient(thecustomercarry)suniteasonethemode,usingthesimpleanddirectconvenience.WhattoneedtobenoticeisthisprocedurethecustomercarrytheservercarrytouniteasoneofmodeandobtainthismachineIPaddressandautobethecustomerdebarkationIDthecalculatorautomaticallyofdesigntestfortheconvenienceonly,wellproperandcommercial,soneedtocarryontheimprovementinthecommercialstage.Thisarticlewasmainlyhasmadethequitedetailedintroductiontothissoftwareserverenddesign,andhascarriedonthepreliminarydevelopmenttotheserverend.Buttheclientsidedesignhasmanyneedstoconsummate.Theclientsideistotheusertheuse,fromconvenientandonartistic,butalsohastheplacewhichmanyneedstoconsummate.Moreover,asaresultofthetimerelationship,theclientsidealsohasafunctionnotcompletely.Ifmustmakethissystemtobecomeapracticalapplicationsystemandinthenetworkthepracticalapplication,butmustthenexttimecarryonthedesignagain.Keyword:socketclientserverThenetworkchats目錄第一章概述 11.1選題來源及意義 11.1.1選題來源 11.1.2選題意義 11.2任務(wù)、要求及問題提出 11.2.1任務(wù)、要求 11.2.2問題提出 21.3國內(nèi)外發(fā)展概況 21.3.1國內(nèi)外發(fā)展概況 21.3.2發(fā)展趨勢 3第二章設(shè)計原理和過程 52.1用戶需求分析 52.2設(shè)計原理概述 52.3系統(tǒng)模塊設(shè)計 62.4服務(wù)器數(shù)據(jù)庫設(shè)計 82.5客戶/服務(wù)器程序設(shè)計 92.6TCP/IP協(xié)議 11第三章詳細(xì)設(shè)計 143.1類設(shè)計總體結(jié)構(gòu) 143.2服務(wù)器端底層通訊類設(shè)計 153.3客戶端底層通訊類設(shè)計 163.4客戶/服務(wù)器間通訊數(shù)據(jù)類設(shè)計 173.5服務(wù)器應(yīng)用程序類設(shè)計 173.6客戶端應(yīng)用程序類設(shè)計 18第四章系統(tǒng)實現(xiàn) 214.1系統(tǒng)環(huán)境 214.1.1系統(tǒng)軟硬環(huán)境 214.1.2系統(tǒng)安裝說明 214.1.3系統(tǒng)運(yùn)行說明 224.1.4系統(tǒng)使用說明 244.2具體實現(xiàn) 244.2.1登錄模塊 244.2.2查找用戶模塊 244.2.3查看在線用戶模塊 264.2.4發(fā)群體消息模塊 264.2.5系統(tǒng)參數(shù)模塊 274.2.6個人設(shè)定模塊 284.2.7正常聊天模塊 284.3系統(tǒng)測試 29結(jié)論 31謝辭 32參考文獻(xiàn) 33附錄 34PAGE72第一章概述1.1選題來源及意義1.1.1選題來源在網(wǎng)絡(luò)無所不在的今天,在Internet上,有icq,oicq,ticq等網(wǎng)絡(luò)聊天軟件,極大程度上方便了處于在世界各地的友人之間的相互聯(lián)系,也使世界好象一下子縮小了,不管你在哪里,只要你上了網(wǎng),打開這些軟件,就可以給你的朋友發(fā)信息,不管對方是否也同時在線,只要知道他有號碼。本文討論基于TCP/IP通信開發(fā)聊天程序的關(guān)鍵技術(shù),重點(diǎn)討論面向?qū)ο蠓椒ㄒ约傲奶斐绦虻膶崿F(xiàn)方法,并給出了相應(yīng)的VC++代碼.網(wǎng)絡(luò)聊天軟件在國外的有icq等,在國內(nèi)的主要有騰訊的Oicq,還有Ticq,OmO和一些在網(wǎng)頁上的即時通訊工具,像Chinaren網(wǎng)站上的WebMaster等等,都做得即美觀,且功能強(qiáng)大,Oicq現(xiàn)在擁有非常大的用戶群。現(xiàn)在也有很多,在網(wǎng)絡(luò)上不使用服務(wù)器的通訊軟件,這種軟件小巧且方便,也能解決一部分問題。但是有服務(wù)器的通訊軟件,有著不可比擬的優(yōu)勢:可以發(fā)送離線消息,不管用戶當(dāng)時是否在線,下次上線時,就可以看到這條消息了。可以保存用戶的個人信息或介紹,供人查看。而且,那種通訊軟件,是以機(jī)器為通訊單元的,而這種聊天軟件是以人為通訊單元??傊?,這種軟件在網(wǎng)絡(luò)上,還是有很大的用途的,為網(wǎng)絡(luò)上通訊,帶來極大的方便。雖然說,現(xiàn)在這個軟件已經(jīng)有公司把它開發(fā)出來了,我再做也不一定有新意,也未必可以做得更好,但作為畢業(yè)設(shè)計,也算是對我能力的一個考驗和這四年來我學(xué)習(xí)知識的一個檢查。如果這個軟件做得比較成功的話,能為網(wǎng)絡(luò)通訊帶來一定的方便的話,我就很滿足了。1.1.2選題意義以前聊天的方式早已離我們遠(yuǎn)去。自從我們順應(yīng)現(xiàn)代工業(yè)的潮流,從平房搬入樓房之后,在享受自動的水、電、煤氣之時,我們也失去了舊日街坊鄰里聚在一起群聚而談的熱鬧和溫情。甚至這種氣氛也滲透到了家庭內(nèi)部,我們與家人一起聊天的時間也越來越少。然而這并不是說人們不需要聊天提供的享受。在人情淡薄懷舊氣氛濃重的九十年代末期,網(wǎng)絡(luò)聊天出現(xiàn)了。那些寂寞無助的“亞細(xì)亞的孤兒”們忽然發(fā)現(xiàn)了這一巨大的狂歡場所,更有甚于電子游戲帶給他們的新奇和喜悅?!熬W(wǎng)聊”借助網(wǎng)絡(luò)這種現(xiàn)代通訊手段在一定程度上恢復(fù)甚至拓展了傳統(tǒng)聊天在人們生活中失去的地盤。這些因素都決定了網(wǎng)絡(luò)聊天勢必成為一種青年人的流行事物。1.2任務(wù)、要求及問題提出1.2.1任務(wù)、要求本設(shè)計基于TCP/IP通信開發(fā)聊天程序,綜合利用VC++程序設(shè)計語言,以SQLServer2000數(shù)據(jù)庫做后臺開發(fā)出一高效實用的聊天系統(tǒng)客戶端軟件。該系統(tǒng)要求實現(xiàn):1.實現(xiàn)各種信息的系統(tǒng)化、規(guī)范化和自動化;2.客戶端應(yīng)具有十分友好的主窗口界面,登陸界面和注冊界面等;3.客戶端可以使用戶方便地進(jìn)行登錄、下線、接收消息和發(fā)送消息等;4.客戶端能夠使用TCP連接實現(xiàn)與服務(wù)器端進(jìn)行良好的協(xié)作與通信;5.客戶端能夠使用IP連接,與其他客戶端進(jìn)行信息的收發(fā);6.客戶端各個界面的設(shè)計合理、實用。1.2.2問題提出隨著計算機(jī)應(yīng)用技術(shù)的日益普及,網(wǎng)絡(luò)也遍及到我們生活的每個角落,很好的利用這人資源,將為我們的工作和學(xué)習(xí),帶來極大的方便和提高工作效率,所以,開發(fā)一個網(wǎng)絡(luò)里的C/S通訊軟件,是十分必要。由于采用面向?qū)ο蠓椒ㄩ_發(fā)軟件具有明顯的優(yōu)點(diǎn),本系統(tǒng)將采用面向?qū)ο蠓椒ㄟM(jìn)行開發(fā)。由于采用面向?qū)ο蟮南到y(tǒng)模型可以使整個軟件系統(tǒng)的結(jié)構(gòu)變得更加靈活,本系統(tǒng)的結(jié)構(gòu)模型將采用面向?qū)ο蟮南到y(tǒng)模型,采用VC++6.0這個可視化開發(fā)工具進(jìn)行編碼。傳統(tǒng)的軟件工程方法有生命周期方法和快速原型法。面向?qū)ο蠓椒▽W(xué)是一種全新的軟件工程方法,其出發(fā)點(diǎn)和基本原則是盡可能模擬人類習(xí)慣的思維方式,把構(gòu)成客觀世界的實體抽象為對象。概括地說,面向?qū)ο蠓椒▽W(xué)有四個要點(diǎn):1.認(rèn)為客觀世界是由各種對象組成的,復(fù)雜的對象可以由比較簡單的對象以某種方式組合而成;2.把所有對象都劃分成各種對象類,每個對象類可以定義一組數(shù)據(jù)和方法;3.按照子類和父類的關(guān)系,把若干對象類組成一個層次結(jié)構(gòu)的系統(tǒng);4.對象彼此之間僅能通過傳遞消息互相聯(lián)系。用面向?qū)ο蠓椒▽W(xué)開發(fā)的軟件有以下優(yōu)點(diǎn):1.與人類習(xí)慣的思維方法一致;2.穩(wěn)定性好;3.可重用性好;4.可維護(hù)性好。1.3國內(nèi)外發(fā)展概況1.3.1國內(nèi)外發(fā)展概況伴隨著網(wǎng)絡(luò)的發(fā)展,已經(jīng)有大量的聊天類軟件進(jìn)入了實用階段,例如現(xiàn)階段大家經(jīng)常使用的QQ,ICQ和MSN等,他們已經(jīng)融入到大家的網(wǎng)絡(luò)生活中,成為大家網(wǎng)絡(luò)生活中必不可少的組成部分。而且其程序的功能也伴隨著網(wǎng)絡(luò)技術(shù)的發(fā)展而不斷的完善和發(fā)展,從最初的只支持文本式聊天一直到現(xiàn)在的圖文聊天、語音聊天、視頻對話等,技術(shù)越來越成熟可靠。網(wǎng)絡(luò)聊天軟件在國外的有icq等,在國內(nèi)的主要有騰訊的Oicq,還有Ticq,OmO和一些在網(wǎng)頁上的即時通訊工具,像Chinaren網(wǎng)站上的WebMaster等等,都做得即美觀,且功能強(qiáng)大,Oicq現(xiàn)在擁有非常大的用戶群。現(xiàn)在也有很多,在網(wǎng)絡(luò)上不使用服務(wù)器的通訊軟件,這種軟件小巧且方便,也能解決一部分問題。但是有服務(wù)器的通訊軟件,有著不可比擬的優(yōu)勢:可以發(fā)送離線消息,不管用戶當(dāng)時是否在線,下次上線時,就可以看到這條消息了。可以保存用戶的個人信息或介紹,供人查看。而且,那種通訊軟件,是以機(jī)器為通訊單元的,而這種聊天軟件是以人為通訊單元。總之,這種軟件在網(wǎng)絡(luò)上,還是有很大的用途的,為網(wǎng)絡(luò)上通訊,帶來極大的方便。傳統(tǒng)聊天是指在任何現(xiàn)代通訊技術(shù)出現(xiàn)之前人類最尋常的交流方式,即面對面地對話。它包括非正式的私人談話,如家人團(tuán)聚、鄰居串門、朋友造訪,也包括一些較為隨意的多人集會如酒會、沙龍和座談會。聊天的特點(diǎn)在于它的無目的性,天南地北,海闊天空,都可以作為談資助興,所以正式的訪談和會議都不在聊天之列。傳統(tǒng)聊天具有多重社會功能,比如交流情感、促進(jìn)友誼、擴(kuò)散信息等等,但最主要的還是消閑,一種有效的排解無聊的手段——無聊這一詞的字面意思就是指“不值一聊”。聊天作為一種消閑手段廉價而富有人情味,很適合人類這種擁有語言能力的高等群居動物。梁實秋的“雅舍小品”里有專文談聊天的好處。即使在現(xiàn)代通訊方式已經(jīng)非常普及的今天,傳統(tǒng)聊天方式依然不可能被取代,然而它占有人們的時間已經(jīng)大為縮小。雖然電話和網(wǎng)絡(luò)提供了遠(yuǎn)程的即時交流手段,但是現(xiàn)代社會一方面加快了人們的生活和工作節(jié)奏,另一方面以商業(yè)化的手段向人們提供了更多消閑方式,其中電視就擠占了我們原先大量的聊天時間。由于電視的誘惑,傳統(tǒng)聊天被迫讓出了它在人類生活中的地位。茶余飯后不再是門前一張板凳圍在一起胡侃,而是每家每戶坐在封閉的單元房內(nèi)面對一臺電子顯像管。電視節(jié)目雖然表面上比聊天更為豐富多彩,但是看電視本身單向傳遞信息,沒有反饋機(jī)制,觀眾只是被動地接受信息,只在極小的程度上參與節(jié)目。電視并不促進(jìn)觀眾思考,也不會根據(jù)觀眾收看時的反應(yīng)做出調(diào)整。更不要說電視的非人格化與聊天富有人情味的區(qū)別。電視雖然對人類消閑時間的爭奪戰(zhàn)中勝出,但它卻不可能滿足人類所有的需要,尤其是傳統(tǒng)聊天能夠滿足的那些需要。這些需要也不是電子游戲、觀看電影話劇表演甚至旅游所能替代的。這時,一種新的聊天形式借助網(wǎng)絡(luò)生長出來,填補(bǔ)了人們的精神空白。網(wǎng)絡(luò)聊天同樣具有傳統(tǒng)聊天的基本功能,即消閑的作用,它也同樣可以交流情感、促進(jìn)友誼、傳遞信息,滿足表達(dá)欲望。但它并非是傳統(tǒng)聊天在網(wǎng)絡(luò)上簡單的呈現(xiàn)和復(fù)制,它具有并非本質(zhì)但十分重要的特殊性質(zhì)。1.3.2發(fā)展趨勢最后試著討論一下網(wǎng)絡(luò)聊天的命運(yùn)。網(wǎng)絡(luò)聊天的現(xiàn)實存在不可能因為老師和家長的反對而消除,也不會因為某某法規(guī)的出臺而被管制。淘汰它的只能是更發(fā)達(dá)的聊天技術(shù),即語音聊天。語音聊天更為經(jīng)濟(jì)快捷,單位時間傳遞的信息量也更大。語音聊天的技術(shù)已經(jīng)成熟,待它普及之后成熟之后,目前這種“打電話”的網(wǎng)絡(luò)聊天方式將成為歷史。等有一天,我們都可以像打免費(fèi)電話那樣語音聊天時,我們還會懷念當(dāng)年那段“此時無聲勝有聲”的網(wǎng)絡(luò)聊天故事嗎?設(shè)計原理和過程2.1用戶需求分析提供基于TCP/IP網(wǎng)絡(luò)的即時消息傳送、大小圖標(biāo)方式、實時聊天、多人聊天等功能。具體列舉如下:支持多賬號??梢酝瑫r發(fā)送同一個消息給多人,通過輸入這些人的號碼列表或姓名列表??梢酝瑫r發(fā)送一個消息給所有好友。即使用戶不在線,也能通過服務(wù)器發(fā)送離線消息。提供消息、聊天的歷史記錄,方便對信息的查看和管理。提供查看在線的人的功能。提供按ID或姓名查找用戶的功能,添加用戶方便。小窗口顯示,不占用屏幕很大的空間。支持隱身登陸,可以看到在線的朋友,朋友卻不知道你上線??梢詫崟r顯示用戶的狀態(tài)和隨時改變自己的狀態(tài)。提供了自動彈出消息。好友上線通知。好友下線更新。查看好友信息。按姓名或號碼查找某人。在好友列表中刪除某人。更改個人信息。系統(tǒng)設(shè)置。主窗口總是浮在最上端。速度快,占用資源少。2.2設(shè)計原理概述采用客戶端——服務(wù)器模型,使用從MFC類中的CAsyncSocket類的派生類進(jìn)行實現(xiàn)底層通訊,底層利用UDP數(shù)據(jù)報協(xié)議進(jìn)行通訊,這樣,便于客戶端之間的直接通訊,也可以高效的傳送消息。因為使用UDP協(xié)議進(jìn)行通訊,所以要自己控制其可靠性。我每發(fā)送一個數(shù)據(jù),接受方接受到數(shù)據(jù)后,會發(fā)回一個響應(yīng)信息,發(fā)送方在一個超時時間內(nèi),收到響應(yīng)信息,就表示發(fā)送數(shù)據(jù)成功,若沒有收到,就表示發(fā)送失敗,會按用戶指定的次數(shù)N,重試N次,如果N次都失敗,就返回發(fā)送數(shù)據(jù)失敗。當(dāng)然,發(fā)回來的確認(rèn)信息也可能丟失,但確認(rèn)信息很短,相對來說,丟失的機(jī)率會小一些,是一個折中的辦法。為了保存用戶信息和好友信息及一些相關(guān)數(shù)據(jù),服務(wù)器使用到數(shù)據(jù)庫技術(shù)。服務(wù)器的數(shù)據(jù)庫采用的是ODBC的SQL2000數(shù)據(jù)源,服務(wù)器訪問數(shù)據(jù)庫,用的是MFC中的CDatabase和CRecordset,因為,對數(shù)據(jù)庫的操作簡單,服務(wù)器端,我只要功能,不需做界面,所以使用Sql語句直接訪問數(shù)據(jù)庫,已經(jīng)足夠滿足要求了。服務(wù)器運(yùn)行的流程為:服務(wù)器運(yùn)行后,開啟服務(wù),則服務(wù)器開始偵聽用戶請求,如有信息發(fā)送過來,首先,發(fā)送回確認(rèn)信息,然后,建立一個線程,處理接受到的數(shù)據(jù)。在線程里,按照接受到數(shù)據(jù)的類別,進(jìn)行相應(yīng)的處理,如有需要,會向用戶發(fā)送處理的結(jié)果,或成功或失敗的消息,處理結(jié)束后,線程就結(jié)束了。這樣,可以實時接受每個用戶的請求,不會因為處理一個用戶的請求,而忽略了其它用戶。服務(wù)器端主要是為用戶存儲必要的信息,協(xié)調(diào)用戶之間的通訊,服務(wù)器端的設(shè)計,主要在功能上面。服務(wù)器端的設(shè)計和底層通訊的方法,將是我講述的重點(diǎn)??蛻舳说倪\(yùn)行流程為:若有本地用戶信息,則取出本地用戶信息,顯示登陸窗口,若沒有,則顯示用戶注冊窗口(在登陸窗口里,也可以選擇用戶注冊)。登陸時,可選擇是否隱身,進(jìn)入系統(tǒng)后,好友列表中,在線的人,將以高亮度顯示,并處在列表的上頭。不在線的人,將以灰色顯示。登陸后,如果有的話,服務(wù)器會發(fā)來好友給你發(fā)送的離線消息。如果有好友上線了,就會通知你,好友下線了,你也可以在好友列表中看到,你可能接受到別人給你發(fā)送的消息。根據(jù)用戶的操作,可以向好友發(fā)送消息,查看好友信息,查看在線的人,查找用戶等等功能??蛻舳酥饕翘峁┙o用戶一個友好的用戶界面,方便用戶操作,客戶端主要負(fù)責(zé)從服務(wù)器上得到數(shù)據(jù)后,顯示給用戶。從服務(wù)器得到好友的IP和Port后,就可以直接與好友進(jìn)行通訊,聊天等等。客戶端主要是界面的設(shè)計(除了底層通訊的以外),根據(jù)不同的要求,向服務(wù)器發(fā)送各種類型的請求。然后等待服務(wù)器的響應(yīng)??蛻舳说慕缑娴脑O(shè)計很繁瑣,沒有詳細(xì)介紹的必要,所以,我的重點(diǎn)將放在服務(wù)器的設(shè)計上??蛻舳酥皇呛喴恼f明一下。2.3系統(tǒng)模塊設(shè)計聊天系統(tǒng)將分為六大模塊,包括用查找戶模塊,查找在線用戶模塊,發(fā)群體消息模塊,系統(tǒng)參數(shù)模塊,個人設(shè)定模塊,關(guān)于模塊。各模塊功能如下圖2-1所示:圖2-1聊天系統(tǒng)模塊在信息世界中,信息從客觀事物出發(fā)流經(jīng)數(shù)據(jù)庫,通過決策機(jī)構(gòu)最后又回到客觀世界,信息的這一循環(huán)經(jīng)歷了三個領(lǐng)域:信息世界,數(shù)據(jù)世界,現(xiàn)實世界。現(xiàn)實世界的事物反映到人的頭腦中,人的大腦對它有個認(rèn)識過程,經(jīng)過分析(選擇、命名、分類等)進(jìn)入信息世界。這些信息再進(jìn)一步加工、編碼,然后進(jìn)入數(shù)據(jù)世界,而軟件系統(tǒng)的開發(fā)工作需要考慮這兩個方面的問題,也就是要考慮系統(tǒng)開發(fā)所需要的數(shù)據(jù),以及如何對這些數(shù)據(jù)進(jìn)行操作。這兩個問題貫穿了整個軟件系統(tǒng)的開發(fā)過程,這也就是數(shù)據(jù)庫的設(shè)計問題,也是軟件設(shè)計的一個核心。在系統(tǒng)設(shè)計的開始,我首先考慮的是如何用數(shù)據(jù)模型來數(shù)據(jù)庫的結(jié)構(gòu)與語義,以對現(xiàn)實世界進(jìn)行抽象。目前廣泛使用的數(shù)據(jù)模型可分為兩種類型,一種是獨(dú)立于計算機(jī)系統(tǒng)的“概念數(shù)據(jù)模型”如“實體聯(lián)系模型”,另一種是直接面向數(shù)據(jù)庫邏輯結(jié)構(gòu)的“結(jié)構(gòu)數(shù)據(jù)模型”。在本系統(tǒng)中我采用“實體聯(lián)系模型”(ER模型)來描述數(shù)據(jù)庫的結(jié)構(gòu)與語義,以對現(xiàn)實世界進(jìn)行第一次抽象。ER模型直接從現(xiàn)實世界抽象出實體類型及實體間聯(lián)系,然后用ER圖來表示數(shù)據(jù)模型。它有兩個明顯的優(yōu)點(diǎn):接近于人的思維,容易理解;與計算機(jī)無關(guān),用戶容易接受。但ER模型只能說明實體間語義的聯(lián)系,不能進(jìn)一步說明詳細(xì)的數(shù)據(jù)結(jié)構(gòu),它只是數(shù)據(jù)庫設(shè)計的第一步。ER圖是直觀表示概念模型的工具,它有四個基本成分:1.矩形框,表示實體類型(考慮問題的對象)。2.菱形框,表示聯(lián)系類型(實體間的聯(lián)系)。3.橢圓形框,表示實體類型和聯(lián)系類型的屬性。對于主鍵碼的屬性,如下表示:屬性名(*)。4.直線,聯(lián)系類型與其涉及的實體類型之間以直線連接。本系統(tǒng)為聊天系統(tǒng)客戶端的實現(xiàn),主要是聊天為主,考慮了多方面的因素以后,確定系統(tǒng)圖如下:下面就是各實體及聯(lián)系類型的屬性圖:(為了表達(dá)的方便,在這里我沒有在一張圖上表達(dá)出所有的關(guān)系,而是分別采用實體屬性關(guān)系圖(即E-R圖)來表達(dá)數(shù)據(jù)庫的結(jié)構(gòu)。)本系統(tǒng)的實體圖如下圖所示:圖2-2用戶信息圖2-3好友信息圖2-4離線消息2.4服務(wù)器數(shù)據(jù)庫設(shè)計服務(wù)器數(shù)據(jù)庫設(shè)計的要求是要能夠滿足客戶端的需求,保存用戶信息和用戶好友信息,提供離線消息的服務(wù),和發(fā)廣播消息的服務(wù)等。總共有三個表:用戶信息表(Users)好友信息表(Friends)離線消息表(OffMsg)表2-1用戶信息表(Users)字段名稱說明長度UserId(主鍵)自動編號4字節(jié)長整形Id用戶帳號4字節(jié)長整形Photoid用戶的圖象編號4字節(jié)長整形password用戶登陸的密碼字符串name用戶的姓名字符串sex用戶的性別單字節(jié)整形0男1女2未知age用戶的年齡字符串(為了適應(yīng)不愿填寫此項的人)canbeadd能否被人加為好友單字節(jié)整形(0,1,2不能被加入,允許被任何人加入,需要身份驗證)email電子信箱字符串homepage個人主頁字符串a(chǎn)ddress地址字符串phone電話字符串fax傳真字符串department部門字符串description個人簡介字符串表2-2好友信息表(Friends)字段名稱說明長度Num(主鍵)自動編號4字節(jié)長整形MyId自己帳號4字節(jié)長整形FriendId朋友帳號4字節(jié)長整形表2-3離線消息表(OffMsg)字段名稱說明長度MsgId(主鍵)自動編號4字節(jié)長整形RecvId接受者帳號4字節(jié)長整形SenderId發(fā)送者帳號4字節(jié)長整形RecvTime接受時間4字節(jié)長整形nIndex發(fā)送消息類型4字節(jié)長整形Msg發(fā)送消息備注類型2.5客戶/服務(wù)器程序設(shè)計C/S模型也是一種網(wǎng)絡(luò)模型,但與前述的模型不同,它并不是定義了網(wǎng)絡(luò)的層次結(jié)構(gòu),而是描述了一種網(wǎng)絡(luò)程序運(yùn)行的方式。C/S模型將網(wǎng)絡(luò)應(yīng)用程序分為客戶和服務(wù)器兩部分??蛻舴綄Ψ?wù)器方發(fā)送信息請求,服務(wù)器方對其做出相應(yīng)回答,提供服務(wù)。在TCP/IP網(wǎng)絡(luò)應(yīng)用中,多數(shù)網(wǎng)絡(luò)應(yīng)用程序是使用C/S模型設(shè)計的。服務(wù)程序通常在一個眾所周知的地址監(jiān)聽對服務(wù)的請求,也就是說,服務(wù)進(jìn)程一直處于休眠狀態(tài),直到一個客戶程序提出了請求信息。此時,服務(wù)程序被"驚醒"并且為客戶提供服務(wù),對客戶的請求作出適當(dāng)?shù)姆磻?yīng)。雖然基于連接的服務(wù)是設(shè)計C/S應(yīng)用程序的標(biāo)準(zhǔn),但有些服務(wù)也是可以通過數(shù)據(jù)報Socket提供的。通常,網(wǎng)絡(luò)應(yīng)用程序包含兩個獨(dú)立的應(yīng)用程序:客戶程序和服務(wù)器程序。但是,也可以設(shè)計同時完成這兩種功能的程序,例如,一些服務(wù)器程序如果不能完成一個服務(wù)請求時,它將轉(zhuǎn)而充當(dāng)客戶程序,向其它服務(wù)器程序請求信息。這方面的一個典型例子就是提供Internet從域名到IP地址映射服務(wù)的DNS服務(wù)器。為了充分理解TCP/IP協(xié)議族,必須理解幾個重要術(shù)語。這些術(shù)語指出了兩個TCP/IP傳輸協(xié)議:用戶數(shù)據(jù)包協(xié)議(UDP)和傳榆控制協(xié)議(TCP)之間的區(qū)別。這些術(shù)語進(jìn)一步描述了與網(wǎng)絡(luò)連接、協(xié)議可靠性以及數(shù)據(jù)服務(wù)有關(guān)的協(xié)議特性。當(dāng)建立服務(wù)器程序時,應(yīng)該將服務(wù)器程序設(shè)計成等候客戶的請求。你知道,TCP傳輸層通過協(xié)議端口和應(yīng)用程序(像服務(wù)器和客戶)通信,也就是說,為了按收客戶請求,服務(wù)器程序必須對傳輸層的一個特定協(xié)議端口進(jìn)行偵聽。當(dāng)服務(wù)器配置socket接口時,它使用bind()函數(shù)讓socket執(zhí)行體登記一個協(xié)議端口。也就是說,程序告訴socket執(zhí)行體使用哪-個協(xié)議端口進(jìn)行數(shù)據(jù)傳送。Socket執(zhí)行體接著告訴傳輸層某個特定協(xié)議端口已被使用,并將其收到的所有數(shù)據(jù)傳送給SocketAPI。使用無連接協(xié)議的程序和使用面向連接協(xié)議的服務(wù)器程序之間的主要相似之處是它們都必須對一個協(xié)議端口進(jìn)行偵聽。例如,無連接和連接服務(wù)器程序必須在協(xié)議端口偵聽客戶請求。同樣,由于無連接客戶程序沒有和遠(yuǎn)地主機(jī)建立直接連接,所以它也必須對協(xié)議端口進(jìn)行偵聽,以便接收以對它服務(wù)請求產(chǎn)生的數(shù)據(jù)報應(yīng)答。SocketAPI中的bind()函數(shù)讓程序?qū)⒁粋€本地地址(包括主機(jī)地址和協(xié)議端口)和一個Socket聯(lián)系起來。下面程序行顯示了一個典型的函數(shù)調(diào)用:result=bind(socket_handle,local_structure,socket_address,address_length)無連接客戶程序也對一個協(xié)議端口進(jìn)行偵聽。使用無連接協(xié)議的程序不和遠(yuǎn)地主機(jī)建立直接連接。無連接客戶程序使用數(shù)據(jù)報發(fā)送網(wǎng)絡(luò)服務(wù)請求,它不建立點(diǎn)到點(diǎn)連接。因此無連接客戶程序必須在一個協(xié)議端口,對應(yīng)答數(shù)據(jù)報進(jìn)行偵聽。與服務(wù)器程序一樣,無連接客戶程序也使用bind函數(shù)讓Socket執(zhí)行體登記協(xié)議端口。也就是說,類似服務(wù)器程序,無連接客戶程序告訴Socket執(zhí)行體使用哪個協(xié)議端口進(jìn)行數(shù)據(jù)傳輸。Socket執(zhí)行體處理傳輸層內(nèi)UDP軟件模塊和客戶程序之間的接口。圖2-5無連接協(xié)議的套接字調(diào)用時序圖圖2:面向連接的套接字系統(tǒng)調(diào)用時序圖圖2-6面向連接的套接字系統(tǒng)調(diào)用時序圖2.6TCP/IP協(xié)議TCP/IP是國際互聯(lián)網(wǎng)所采用進(jìn)行網(wǎng)際互連的通信協(xié)議。實際所稱的TCP/IP協(xié)議包括了在國際互聯(lián)網(wǎng)絡(luò)應(yīng)用的一組協(xié)議,互聯(lián)網(wǎng)協(xié)議族是此協(xié)議族的另一個名字。這個協(xié)議族包括幾種工作在不同層次上的網(wǎng)絡(luò)協(xié)議,IP互連協(xié)議(InternetProtocol),負(fù)責(zé)主機(jī)之間的傳輸數(shù)據(jù)。TCP傳輸控制協(xié)議(TransmissionControlProtocol),負(fù)責(zé)在應(yīng)用程序之間傳遞數(shù)據(jù)。UDP用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol),提供給用戶進(jìn)程的無連接協(xié)議,也負(fù)責(zé)在應(yīng)用程序之間無連接傳遞數(shù)據(jù),但不執(zhí)行正確性檢查。ICMP互連網(wǎng)控制報文協(xié)議(InternetControlMessageProtocol),處理主機(jī)間的差錯和傳送控制。ARP地址解析協(xié)議(AddressResolutionProtocol),負(fù)責(zé)將網(wǎng)絡(luò)層地址轉(zhuǎn)換成鏈路層地址。RARP反向地址解析協(xié)(ReverseAddressResolutionProtocol),負(fù)責(zé)將鏈路層地址轉(zhuǎn)換成網(wǎng)絡(luò)層地址。TCP/IP協(xié)議的核心是傳輸層協(xié)議(TCP、UDP)、網(wǎng)絡(luò)層協(xié)議(IP)和物理接口層,這三層通常在操作系統(tǒng)的內(nèi)核中實現(xiàn)。TCP/IP網(wǎng)絡(luò)環(huán)境下的應(yīng)用程序設(shè)計是通過網(wǎng)絡(luò)系統(tǒng)編程界面Socket實現(xiàn)的,Socket提供應(yīng)用程序與系統(tǒng)內(nèi)核之間的網(wǎng)絡(luò)編程接口。協(xié)議可以是可靠的可以是不可靠的??煽康膮f(xié)議意味著當(dāng)數(shù)據(jù)通過協(xié)議傳遞時,協(xié)議保證數(shù)據(jù)正確傳輸??煽總鬏敯◣讉€特征。首先,為了確保數(shù)據(jù)正確傳送,協(xié)議在通信應(yīng)用程序之間互相交換確認(rèn)信息。也就是說,程序每次發(fā)送-個報文時,都期望對方發(fā)送一個相當(dāng)于說:“我得到這個報文”的確認(rèn)信息。如果發(fā)送程序沒有收到這樣一個確認(rèn)信息,程序?qū)⒆詣又匦掳l(fā)送此報文,直到得到應(yīng)答信息為止。其次,為了確保傳輸?shù)臄?shù)據(jù)有效,可靠協(xié)議在每次傳輸時,都包含一個或更多的校驗和(CRC)。接收計算機(jī)重新計算校驗和,與收到的校驗和進(jìn)行比較。如果不匹配,就表明在傳輸過程中發(fā)生了錯誤。傳輸控制協(xié)議TCP是一個使用校驗和確認(rèn)信息以及其它可靠數(shù)據(jù)傳輸技術(shù)的可靠協(xié)議。相比之下,不可靠協(xié)議不能確保數(shù)據(jù)正確傳輸。協(xié)議試圖傳輸數(shù)據(jù),但不保證成功。而且,不可靠協(xié)議在傳輸失敗后,并不通知發(fā)送方應(yīng)用程序??蓪⒉豢煽繑?shù)據(jù)傳輸比作沒有返回地址的信件。如果發(fā)送地址是鍺誤的,由于郵遞系統(tǒng)不能將信退回給你,所以你就不知道信件有沒有送到。即使發(fā)送地址是正確的,也不能保證郵遞系統(tǒng)不丟失你的信件。TCP/IP協(xié)議組中存在的兩個基本數(shù)據(jù)服務(wù)是:字節(jié)流服務(wù)和數(shù)據(jù)報服務(wù),使用字節(jié)流的協(xié)議將信息看作一串字節(jié)流進(jìn)行傳輸。協(xié)議不管要求發(fā)送或接收數(shù)據(jù)的長度和傳送數(shù)目,只是將數(shù)據(jù)看作一個簡單的字節(jié)串流。使用數(shù)據(jù)報的協(xié)議將信息視作一個獨(dú)立單元進(jìn)行傳輸。協(xié)議單獨(dú)發(fā)送每個數(shù)據(jù)報——數(shù)據(jù)報之間不相互依賴。例如,假設(shè)你使用字節(jié)流協(xié)議發(fā)送5個數(shù)據(jù)段(每個有10字節(jié))和一個包含50字節(jié)的數(shù)據(jù)段(總共100字節(jié))。連接的接收方可以按每次20字節(jié)讀數(shù)據(jù)(要讀5次)。傳輸控制協(xié)議是字節(jié)流協(xié)議。字節(jié)流協(xié)議不關(guān)心每個數(shù)據(jù)段的長度。如果應(yīng)用程序使用字節(jié)流協(xié)議發(fā)送數(shù)據(jù),則協(xié)議能夠保證連接的另一端按照發(fā)送的順序接收數(shù)據(jù)。相比之下,傳輸?shù)酵荒康牡氐亩鄠€數(shù)據(jù)報可能不會按發(fā)送順序到達(dá)。如果接收方應(yīng)用程序要求數(shù)據(jù)順序一致,應(yīng)用程序必須在數(shù)據(jù)到達(dá)后,校對這些數(shù)據(jù)。用戶數(shù)據(jù)報協(xié)議和互連網(wǎng)協(xié)議使用數(shù)據(jù)報傳輸數(shù)據(jù)。數(shù)據(jù)報類似于信件。如果你在同一天給同一個人郵寄兩封信,你無法知道那個人先收到那封信。同樣,如果連續(xù)兩天給兩個人郵信,你也不能知道哪封信先收到。收到信的順序和發(fā)送順序可能相反。在TCP/IP術(shù)語中,端口類(Port)似于IP地址,IP地址與主機(jī)地址是相聯(lián)系的,端口和協(xié)議相聯(lián)系。IP數(shù)據(jù)報保存目的和源IP地址,同樣傳輸協(xié)議也保存源和目的端口號。如果端口這個概念對你來說很陌生,請考慮計算機(jī)上的硬件端口。你可能編寫過往硬件端口送數(shù)據(jù)的程序。例如為了打印,如果沒有其它程序的話,必須向串或并端口發(fā)送數(shù)據(jù)。PC機(jī)給它的端口命名和編號。例如,PC機(jī)的并行打印端口稱為LPTl和LPT2,串行端口稱為COM1和COM2。在Internet上,網(wǎng)絡(luò)只是簡單地對協(xié)議端口編號。在PC機(jī),LPT1表示并行端口1。成千個PC機(jī)應(yīng)用程序使用此方案。多年來,程序員編寫PC程序時都假定LPT1表示并行打印端口1。同樣,程序員將每個Internet協(xié)議端口與一個特定的應(yīng)用程序和功能聯(lián)系在一起。Internet包括像FTP、Telnet和Mail這樣廣泛使用的應(yīng)用程序采用的應(yīng)用協(xié)議,在Internet上,這些應(yīng)用程序使用一種叫做“通用口分配”的端口。通用口分配是特定應(yīng)用程序廣泛使用的一個協(xié)議端口。像PC程序員使用打印端口LPT1用于打印,Internet程序員也對具體應(yīng)用程序使用許多協(xié)議端口。例如,平凡文件傳輸協(xié)議(FTP)的通用口分配是端口號21的。Telnet的通用口分配是端口號23。第三章詳細(xì)設(shè)計本章將論述軟件系統(tǒng)的面向?qū)ο笤O(shè)計過程。用VisualC++語言在Windows環(huán)境下編程實現(xiàn)。3.1類設(shè)計總體結(jié)構(gòu)服務(wù)器的類總體結(jié)構(gòu):1.主應(yīng)用程序類CServerApp包含全局的數(shù)據(jù)結(jié)構(gòu)2.傳送信息類CData,CMsg1,CMsg2,CMsg3,CMsg4,CMsgChangePI,CMsgModifyPwd,CMsgOnlineFriend,CMsgPerson,CshowOnlinePeople處理傳輸數(shù)據(jù)3.SOCKET通訊類CServerSocket,CSendSocket,CRecvSocket處理底層通訊的類,與外部的接口是CserverSocket類,提供了一個簡單的接口4.其它類CMainFrame,CServerDoc,CServerView,CSetupDlg,CAboutDlgUserInfo結(jié)構(gòu)存儲在線人的信息客戶端的類總體結(jié)構(gòu):1.應(yīng)用程序類CClientApp包含全局的數(shù)據(jù)結(jié)構(gòu)2.傳送信息類CData,CMsg1,CMsg2,CMsg3,CMsg4,CMsgChangePI,CMsgModifyPwd,CMsgOnlineFriend,CMsgPerson,CshowOnlinePeople處理傳輸數(shù)據(jù)3.SOCKET通訊類CClientSocket處理底層通訊的類,提供了一個簡單的接口4.用程序框架類CmainFrame處理用戶界面和一些接受數(shù)據(jù)的響應(yīng),主要的處理過程都在這個類里實現(xiàn)。5.對話框類CfriendDetailDlg顯示用戶詳細(xì)信息的對話框類CloginDlg顯示登陸窗口的對話框類ClookDlg顯示查看消息的對話框類CregisterDlg顯示注冊窗口的對話框類CsetupServerDlg修改服務(wù)器設(shè)置的對話框CtalkDlg顯示發(fā)送消息對話框的類CshowBroadcastDlg顯示廣播消息的對話框CshowAddMsgDlg顯示被加為好友的信息的對話框CmultiSendDlg通過姓名或ID列表的向多人發(fā)送信息的對話框CsendToAllDlg向所有好友發(fā)送消息的對話框CModifyPIDlg修改個人信息的對話框6.界面類CGfxGroupEdit,CGfxOutBarCtrl,CGfxPopupMenu實現(xiàn)像OutBar和oicq樣式的那種滾動分欄的界面類,從Internet,上獲得的源代碼,通過修改一些接口,使之更適合我的應(yīng)用。提供了一個漂亮的界面。7.TrayIcon類處理在任務(wù)欄上添加.修改.刪除圖標(biāo)的類。封閉了Window的API函數(shù)8.全局結(jié)構(gòu):UserInfo結(jié)構(gòu)存儲在線人的信息FriendState在好友線信息結(jié)構(gòu)SaveMsg消息的存儲結(jié)構(gòu)Sparam傳給線程的參數(shù)結(jié)構(gòu)3.2服務(wù)器端底層通訊類設(shè)計為了使能及時響應(yīng)用戶的請求,當(dāng)用戶很多時,仍然能夠適應(yīng)要求,我把偵聽與發(fā)送數(shù)據(jù)的Socket分開,并分別都建立了多個實例,也就是說,支持多個端口的偵聽,發(fā)送數(shù)據(jù)使用的是多個端口,我只對偵聽端口感興趣,對發(fā)送數(shù)據(jù)的端口不感興趣,因為,發(fā)送端口是多少都無所謂。CRecvSocket和CsendSocket都是從CAsyncSocket類里繼承而來,分別處理偵聽請求各發(fā)送數(shù)據(jù),在CServerSocket類里,定義了幾個CRecvSocket和CSendSocket對象的實例,通過CServerSocket類對內(nèi)部進(jìn)行組織和管理,提供給上層的接口是CServerSocket,它隱藏了服務(wù)器底層通訊的細(xì)節(jié)及多線程發(fā)送數(shù)據(jù)的問題,提供給上一層一個統(tǒng)一的接口,CServerSocket類的使用,是先建立一個它的實例,再調(diào)用成員函數(shù)Create(),傳入必要的參數(shù),發(fā)送數(shù)據(jù)時,就調(diào)用其成員函數(shù)SendData,處理接受數(shù)據(jù),在CRecvSocket類的OnReceive里處理,調(diào)用了一個名為ProcessRecvData的線程函數(shù),用戶在這個線程函數(shù)里寫上具體的處理代碼算法描述:發(fā)送一個數(shù)據(jù),需要等待響應(yīng)信息的回來,如果在規(guī)定時間內(nèi),還沒有收到確認(rèn)信息,則認(rèn)為發(fā)送數(shù)據(jù)丟失,將重試FailReDoTime次,如果還是沒有確認(rèn)信息發(fā)送回來,則返回發(fā)送失敗,否則,返回發(fā)送成功。因為服務(wù)器是多線程的發(fā)送數(shù)據(jù),有一個請求,就建立一個線程進(jìn)行處理。我為每個發(fā)送socket設(shè)置一個是否忙的標(biāo)志busy,當(dāng)需要發(fā)送數(shù)據(jù)時,就選擇一個空閑的sendsocket,設(shè)置為忙,然后發(fā)送數(shù)據(jù),再設(shè)置回空閑,然后等待確認(rèn)信息的回來。SendData函數(shù)的實現(xiàn)算法,通過設(shè)置一個緩沖區(qū)長度為N,然后,為每一次數(shù)據(jù)進(jìn)行統(tǒng)計,發(fā)一次,就加1,然后把發(fā)送數(shù)據(jù)中的This=count%N,且把緩沖區(qū)中第This個成員設(shè)為0,在發(fā)送端,就要數(shù)組中的第This個成員是否為1即可,在接受到的確認(rèn)信息中,取出This項,再為緩沖區(qū)中第This項設(shè)為1,這樣就可以快速且可靠的判斷發(fā)送數(shù)據(jù)是否得到響應(yīng)回來了。偵聽類結(jié)構(gòu):classCRecvSocket發(fā)送數(shù)據(jù)的socket類結(jié)構(gòu):classCSendSocket:服務(wù)器的socket類:CServerSocket這個通訊類的SendData,當(dāng)發(fā)送數(shù)據(jù)失敗時,可以重發(fā)幾次,次數(shù)可由用戶來確定3.3客戶端底層通訊類設(shè)計與客戶端上層的接口是CClientSocket類,它隱藏了服務(wù)器底層通訊的細(xì)節(jié)及多線程發(fā)送數(shù)據(jù)的問題,提供給上一層一個統(tǒng)一的接口,CClientSocket類的使用,是先建立一個它的實例,再調(diào)用成員函數(shù)Create()傳入必要的參數(shù),發(fā)送數(shù)據(jù)時,就調(diào)用其成員函數(shù)SendData,或SendDataInThread處理發(fā)送數(shù)據(jù),在CRecvSocket類的OnReceive里處理,向父窗口發(fā)送一個WM_RECIEVE_MSG消息,并把接受到的數(shù)據(jù)作為參數(shù)傳遞給父窗口。兩個函數(shù)的適應(yīng)情況,SendData函數(shù),適用于需要直接發(fā)送數(shù)據(jù)的場合,不需要回應(yīng)。如果在線程里執(zhí)行,則可由其返回值確定發(fā)送成功與否。而SendDataInThread是建立一個線程,在線程里調(diào)用SendData函數(shù)進(jìn)行發(fā)送數(shù)據(jù),通過向指定接受窗口發(fā)送消息來確定是否成功。算法描述:發(fā)送一個數(shù)據(jù),需要等待響應(yīng)信息的回來,如果在規(guī)定時間內(nèi),還沒有收到確認(rèn)信息,則認(rèn)為發(fā)送數(shù)據(jù)丟失,將重試FailReDoTime次,如果還是沒有確認(rèn)信息發(fā)送回來,則返回發(fā)送失敗,否則,返回發(fā)送成功。因為客戶端可以多線程的發(fā)送數(shù)據(jù),有一個請求,就建立一個線程進(jìn)行處理。我為每個發(fā)送socket設(shè)置一個是否忙的標(biāo)志busy,當(dāng)需要發(fā)送數(shù)據(jù)時,就選擇一個空閑的sendsocket,設(shè)置為忙,然后發(fā)送數(shù)據(jù),再設(shè)置回空閑,然后等待確認(rèn)信息的回來。SendData函數(shù)的實現(xiàn)算法,與服務(wù)器端是基本一樣的原理,通過設(shè)置一個緩沖區(qū)長度為N,然后,為每一次數(shù)據(jù)進(jìn)行統(tǒng)計,發(fā)一次,就加1,然后把發(fā)送數(shù)據(jù)中的This=count%N,且把緩沖區(qū)中第This個成員設(shè)為0,在發(fā)送端,就要數(shù)組中的第This個成員是否為1即可,在接受到的確認(rèn)信息中,取出This項,再為緩沖區(qū)中第This項設(shè)為1,這樣就可以快速且可靠的判斷發(fā)送數(shù)據(jù)是否得到響應(yīng)回來了。因為在客戶端,大部分?jǐn)?shù)據(jù),是在某個消息處理函數(shù)中執(zhí)行的,所以,適用于服務(wù)器的SendData發(fā)送數(shù)據(jù)函數(shù),在客戶端,若是在消息處理函數(shù)中發(fā)送,函數(shù)返回值,將永遠(yuǎn)為FALSE,于是就添加了一個SendDataInThread函數(shù),把發(fā)送數(shù)據(jù)的過程放在線程里執(zhí)行,通過發(fā)消息的手段,來返回結(jié)果。在SendDataInThread函數(shù)中,調(diào)用SendData函數(shù)進(jìn)行發(fā)送數(shù)據(jù)??蛻舳送ㄓ嶎惖慕Y(jié)構(gòu):CClientSocket在線程里發(fā)送數(shù)據(jù),成功,或失敗都會向指定窗口類發(fā)送一個WM_SENDINTHREAD_RES的消息,參數(shù)WPARAM為發(fā)送數(shù)據(jù)的指針,參數(shù)LPARAM為1,則表示發(fā)送成功,0則表示發(fā)送失敗3.4客戶/服務(wù)器間通訊數(shù)據(jù)類設(shè)計整個系統(tǒng)的所有的發(fā)送的數(shù)據(jù),都包含在這幾個類中了,當(dāng)要發(fā)送一種數(shù)據(jù),則先確定一個數(shù)據(jù)類,然后填入相應(yīng)數(shù)據(jù),再調(diào)用函數(shù)PackToBuf就可以把這些數(shù)據(jù),存入szBuf的數(shù)組緩沖區(qū)中,num指示其長度,LoadFromBuf函數(shù)則是已知在緩沖區(qū)中數(shù)據(jù),把各項的值,從緩沖區(qū)中提取出來。因為使用udp協(xié)議發(fā)送數(shù)據(jù),sendto和recvfrom函數(shù),只能處理串的發(fā)送和接受,所以,把數(shù)據(jù)壓為串,和從串中恢復(fù)數(shù)據(jù),是這些數(shù)據(jù)類所必須完成的功能。算法描述:定義的基類,提供了數(shù)據(jù)的一種統(tǒng)一的接口,其派生類再對其虛函數(shù)進(jìn)行重載,實現(xiàn)相應(yīng)的功能。在數(shù)據(jù)的打包過程中,對字符串的打包原理為:先存入串長度,再存入串。串的長度,采用的是2個字節(jié)的WORD類型,已經(jīng)足夠滿足要求了。打包時,按照某一順序,對其進(jìn)行數(shù)據(jù)的存入串中,解開時,以相同的順序進(jìn)行還原即可。其中,類CModifyPersonPI的算法與其它類不大一樣,因為它的成員中有一個位掩Mask成員,只有被選中的成員,才會打包入串。3.5服務(wù)器應(yīng)用程序類設(shè)計CServerApp類,定義了服務(wù)器全局的數(shù)據(jù)結(jié)構(gòu),classCServerApp:publicCWinApp{public: voidSaveMyProfileSettings();//保存配置文件 BOOLLoadMyProfileSettings();//讀取配置文件 CServerApp(); CServerSocketm_Socket;//服務(wù)器端的上層socket接口 CArray<DWORD,DWORD>m_anPort;//服務(wù)器端開設(shè)的偵聽端口數(shù)組 intm_nSendNum;//發(fā)送端口的個數(shù) intm_nTimeOut;//發(fā)送一次數(shù)據(jù)的超時時間 BOOLm_bServerStarted;//標(biāo)志服務(wù)是否已經(jīng)開啟 UserOnline*m_pUsers;//用來存儲服務(wù)開啟后,在線人的信息的一個指針, CDatabasem_Database;//數(shù)據(jù)庫對象 CStringm_sConnectString;//聯(lián)接數(shù)據(jù)庫需要的字符串參數(shù) intm_nNumberOnline;//當(dāng)前在線的人數(shù) intm_nMaxUserId;//最大的用戶帳號(隨著用戶帳號的申請而增加) intm_nRecvMsg;//當(dāng)前從啟動后,接受到多少交請求信息 CStringm_strBroadcastPwd;//發(fā)廣播消息的密碼 CStringm_strDataSource;//數(shù)據(jù)源的字符串 CStringm_strDataSUID;//用戶UID字符串 CStringm_strDataSPwd;//數(shù)據(jù)源的密碼字符串 CStringm_strLocalIP;//本計算機(jī)的IP地址字符串 public: virtualBOOLInitInstance();//服務(wù)器程序的初始化部分 afx_msgvoidOnAppAbout(); afx_msgvoidOnSetupServer();//進(jìn)行服務(wù)器設(shè)置 afx_msgvoidOnStartServer();//啟動服務(wù) afx_msgvoidOnUpdateStartServer(CCmdUI*pCmdUI); afx_msgvoidOnUserOnline();//顯示在線的用戶的對話框 afx_msgvoidOnCloseServer();//關(guān)閉系統(tǒng)服務(wù) afx_msgvoidOnUpdateCloseServer(CCmdUI*pCmdUI); afx_msgvoidOnAppExit();//處理程序的退出,執(zhí)行程序中必要的清理工作 afx_msgvoidOnUpdateUserOnline(CCmdUI*pCmdUI); DECLARE_MESSAGE_MAP()};3.6客戶端應(yīng)用程序類設(shè)計CClientApp類,定義了客戶端全局的數(shù)據(jù)結(jié)構(gòu),客戶端應(yīng)用程序的入口classCClientApp:publicCWinApp{public: CClientApp(); BOOLm_bOnlineState;//用戶的在線狀態(tài)(0,1,2分別為離線,在線,隱身) intm_nNumberHeadBmp;//保存頭像文件的個數(shù)(從文件中讀出) CArray<UserInfo*,UserInfo*>m_aUserInfo;//存儲好友信息的數(shù)組 CArray<UserInfo*,UserInfo*>m_aStranger;//存儲陌生人信息的數(shù)組 CArray<FriendState*,FriendState*>m_aUserState;//存儲好友的在線狀態(tài)及相關(guān)信息 CArray<FriendState*,FriendState*>m_aStrangerState;//存儲陌生人在線狀態(tài)及相關(guān)信息 CArray<SaveMsg*,SaveMsg*>m_aSysMsg;//接受到的系統(tǒng)消息數(shù)組 intm_nCurSysMsg;//當(dāng)前讀到的系統(tǒng)消息的位置(索引) CArray<SaveMsg*,SaveMsg*>m_aBroadcast;存放廣播消息的數(shù)組 intm_nCurBroadcast;//當(dāng)前讀到的廣播消息的位置(索引) CArray<SaveMsg*,SaveMsg*>m_aBeAdd;//存放自己被別人加為好友的信息 intm_nCurBeAdd;當(dāng)前讀到的被別人加為好友的信息的位置(索引) CClientSocketm_Socket;//底層通訊類的實例對象 DWORDm_uCurrentUserID;當(dāng)前用戶的ID號 CStringm_strCurIDpwd;當(dāng)前用戶的密碼 CStringm_strCurUserDir;當(dāng)前用戶的運(yùn)行目錄(是ID的數(shù)字串為目錄) CStringm_strServerIP;服務(wù)器IP地址的字符串 DWORDm_uServerIP;服務(wù)器IP地址的32位整數(shù) DWORDm_uServerPort;服務(wù)器的端口號 BYTEm_cLoginType;登陸時,選擇的狀態(tài)(是否隱身登陸) CImageListm_imaLarge;//用戶頭像的大圖標(biāo)列表CImageListm_imaSmall//用戶頭像的小圖標(biāo)列表CImageListm_imaHead;//供用戶選擇頭像時的大圖標(biāo)列表(沒有灰色顯示的) CBitmapm_paBitmap;//用來指向在運(yùn)行時,動態(tài)創(chuàng)建的Cbitmap對象數(shù)組 intm_nBitmapNum;//指示Cbitmap對象的個數(shù) virtualBOOLInitInstance();//包括客戶端的初始化和配置信息的讀取等 virtualintExitInstance();//退出時,必要的清理工作,如果在線,則向服務(wù)器發(fā)送下線消息 voidSaveCurIDToFile();//把當(dāng)前用戶的ID號,加入配置文件中,下次登陸就可以選擇了 BOOLSaveUserInfo();//保存所有用戶的信息到磁盤文件中 BOOLLoadFriendInfo();//從磁盤中讀取用戶信息 BOOLLoadFaceBmp();//從磁盤中讀取用戶頭像信息 BOOLLoadLocalAllUserID(CArray<int,int>&aID);//從配置文件中讀出所有可選登陸用戶的ID afx_msgvoidOnAppAbout(); afx_msgvoidOnSendBroadcast();//調(diào)用發(fā)送廣播對話框 afx_msgvoidOnSendtoAll();//調(diào)用向所有好友發(fā)送數(shù)據(jù)的對話框 afx_msgvoidOnSysSetup();//調(diào)用服務(wù)器設(shè)置的對話框 afx_msgvoidOnSearch();//調(diào)用查找用戶的對話框 afx_msgvoidOnSendFile();//實現(xiàn)文件的發(fā)送(現(xiàn)在還沒有完成) DECLARE_MESSAGE_MAP()};第四章系統(tǒng)實現(xiàn)4.1系統(tǒng)環(huán)境4.1.1系統(tǒng)軟硬環(huán)境軟件環(huán)境說明:MicrosoftVisual;C++6.0;SQLServer2000;WindowsXP硬件環(huán)境說明:CPU:Intel(R)Pentium(R)processor1.7GHz;內(nèi)存:256M;硬盤:40G4.1.2系統(tǒng)安裝說明安裝:1.打開控制面板,選擇“管理工具”,打開“數(shù)據(jù)源”,會出現(xiàn)如下圖所示的ODBC數(shù)據(jù)源管理器。如下圖4-1所示:圖4-1ODBC數(shù)據(jù)源管理器2.點(diǎn)擊“添加”,出現(xiàn)一個“創(chuàng)建新數(shù)據(jù)源”界面。如下圖4-2所示:圖4-2ODBC數(shù)據(jù)源管理器3.點(diǎn)擊“MicrosoftAccssDriver(*.mdb)”然后點(diǎn)擊“完成”,點(diǎn)擊“完成”后,出現(xiàn)“ODBCMicrosoftAccss安裝”界面,輸入數(shù)據(jù)源名“IDServer”,點(diǎn)擊“完成”即可。如圖4-3所示:圖4-3ODBCMicrosoftAccess安裝之后出現(xiàn)“選擇數(shù)據(jù)庫”界面,選擇數(shù)據(jù)庫即完成。如圖4-4所示:圖4-4ODBC數(shù)據(jù)源管理器點(diǎn)擊“確定”即完成操作。4.1.3系統(tǒng)運(yùn)行說明正確的對軟件進(jìn)行安裝之后,即可以運(yùn)行。首先打開您所安裝的文件夾,點(diǎn)擊“Server.exe”文件,打開服務(wù)器,單擊“啟動服務(wù)器”即可啟動服務(wù)器。操作正確應(yīng)得到如下圖4-5及圖4-6:圖4-5聊天系統(tǒng)打開服務(wù)器界面圖4-6聊天系統(tǒng)打開服務(wù)器界面點(diǎn)擊“Clientd.exe”,如果您的電腦達(dá)到安裝說明書所提示的配置,程序首界面就會彈出,輸入正確的用戶號碼和密碼,此時程序就可以正常運(yùn)行了。如圖4-7所示:圖4-7聊天系統(tǒng)用戶登錄界面4.1.4系統(tǒng)使用說明本系統(tǒng)大體可以分成登錄模塊、查找用戶模塊、查看在線用戶模塊、發(fā)群體消息模塊、系統(tǒng)參數(shù)模塊、個人設(shè)定模塊、正常聊天模塊七大模塊。這五大模塊以及其所包含的各分支小模塊完成了此聊天系統(tǒng)客戶端的主要使用功能。4.2具體實現(xiàn)4.2.1登錄模塊在用戶要登錄聊天系統(tǒng)時,系統(tǒng)會進(jìn)入如下圖所示的用戶登錄界面,在顯示的信息中包括用戶號碼和密碼,用戶需正確輸入個人號碼和密碼才能進(jìn)入下一界面。如下圖4-8所示:圖4-8用戶登錄界面4.2.2查找用戶模塊進(jìn)入主界面后,用戶就可以在系統(tǒng)管理功能模塊中進(jìn)行聊天、查找用戶、修改個人信息等。點(diǎn)擊系統(tǒng),會出現(xiàn)下列信息,按照需要選擇,即可達(dá)到相應(yīng)功能。如下圖4-9所示:圖4-9系統(tǒng)管理下拉菜單各功能項點(diǎn)擊查找用戶,會出現(xiàn)查找用戶框,輸入需要查找的用戶的ID號或姓名,即查找相應(yīng)的用戶。如下圖4-10所示:圖4-10按ID號查找用戶功能號右鍵單擊所查找的用戶,即可出現(xiàn)“加為好友”和“詳細(xì)資料”項。如下圖4-11所示:圖4-11查找用戶備選項單擊“加為好友”即可加為好友。單擊“詳細(xì)資料”及可查看所查用戶的詳細(xì)資料。如下圖4-12所示:圖4-12所查找用戶的詳細(xì)資料4.2.3查看在線用戶模塊點(diǎn)擊查看在線用戶可查看當(dāng)前在線的用戶。對已經(jīng)查找到的在線用戶單擊右鍵同樣會出現(xiàn)“加為好友”和“詳細(xì)資料”項,執(zhí)行結(jié)果同查找用戶執(zhí)行結(jié)果。如下圖4-13所示:圖4-13成功查找在線用戶界面4.2.4點(diǎn)擊“發(fā)群體消息”選框,出現(xiàn)一個向所有好友發(fā)送消息的對話框,用戶可以通過此對話框向所有好友發(fā)送消息。如下圖4-14所示:圖4-14發(fā)送群體消息對話框用戶好友收到消息對話框如圖4-15所示:圖4-15發(fā)送群體消息對話框4.2.5點(diǎn)擊“系統(tǒng)參數(shù)”選項,能查看用戶的服務(wù)器地址和服務(wù)器端口。如下圖4-16所示:圖4-16系統(tǒng)參數(shù)模塊4.2.6點(diǎn)擊“個人設(shè)定”選項,可以更改個人基本信息,包括修改密碼等。如下圖4-174-18所示:圖4-17用戶詳細(xì)信息界面圖4-18用戶修改密碼界面4.2.7在主界面中,在好友圖標(biāo)處左鍵單擊即可出現(xiàn)收發(fā)消息界面,可方便向該好友發(fā)送消息。如下圖4-19所示:圖4-19用戶發(fā)送消息界面4.3系統(tǒng)測試檢查程序是否還存在邏輯上的錯誤,確保程序的順利運(yùn)行。確保程序在網(wǎng)絡(luò)上的連接正確。測試過程如下:編譯程序,如果程序無邏輯錯誤就可以編譯通過。通過編譯后,可直接運(yùn)行程序。點(diǎn)擊啟動,開始啟動服務(wù)器端。啟動時,服務(wù)器已經(jīng)設(shè)置好服務(wù)器地址,服務(wù)器地址為,端口號默認(rèn)為4000,如啟動成功,則顯示服務(wù)器啟動成功。如下圖4-20所示:圖4-20服務(wù)器設(shè)置服務(wù)器啟動成功后,可啟動客戶端登陸服務(wù)器,客戶如成功登陸服務(wù)器,則在客戶端輸入用戶帳號和密碼,如果輸入有誤,數(shù)據(jù)無法正確傳輸,系統(tǒng)提示為:密碼不符合,是否需要登錄服務(wù)器驗證。如圖4-214-22所示:圖4-21用戶登錄圖4-22服務(wù)器驗證如需要驗證,則進(jìn)入服務(wù)器驗證,驗證服務(wù)器地址和端口號是否正確,如不需要,則退出登錄。正常主界面如下圖4-23所示。圖4-23登錄主界面客戶端啟動成功后便可進(jìn)行自由聊天及實現(xiàn)各項系統(tǒng)功能。結(jié)論本課題重點(diǎn)討論C/S的程序的設(shè)計方法和過程,對整個系統(tǒng)進(jìn)行了詳細(xì)設(shè)計,利用面向?qū)ο蟮姆椒ǎM(jìn)行整個系統(tǒng)的設(shè)計。本課題主要做了以下工作:1.列舉了網(wǎng)絡(luò)聊天軟件的系統(tǒng)和界面需求。2.陳述了C/S程序的設(shè)計原理和過程。3.根據(jù)系統(tǒng)需求,進(jìn)行整個系統(tǒng)的各個部分的詳細(xì)設(shè)計。本課題主要是對本軟件服務(wù)器端的設(shè)計作了比較詳細(xì)的介紹,并對服務(wù)器端進(jìn)行了初步的開發(fā)。而客戶端的設(shè)計有很多都需要完善??蛻舳耸墙o用戶使用的,從方便和美觀上,還都還有很多需要完善的地方。而且,由于時間關(guān)系,客戶端還有些功能沒有完全。如果要使本系統(tǒng)成為一個實際應(yīng)用系統(tǒng)并在網(wǎng)絡(luò)上實際應(yīng)用,除了完成客戶端的功能外,我認(rèn)為還應(yīng)做以下的完善和開發(fā)工作:1.進(jìn)一步完善底層通訊協(xié)議,使能夠更好的處理數(shù)據(jù)的發(fā)送和接受。2.多線程下的對臨界數(shù)據(jù)訪問的問題。3.對發(fā)送的數(shù)據(jù),進(jìn)行一定的加密措施,使之更加安全可靠。4.對本地用戶的密碼的加密問題,在本程序中,沒有對本地密碼進(jìn)行加密。5.在客戶端系統(tǒng),功能的設(shè)置有待進(jìn)一步豐富,功能的實現(xiàn)還有待完善和改進(jìn)。6.在客戶端處理中,響應(yīng)從服務(wù)器發(fā)來的數(shù)據(jù),是在主線程里執(zhí)行的,所以,當(dāng)接受數(shù)據(jù)忙時,就會出現(xiàn)沒有響應(yīng)的情況。進(jìn)一步考慮,如何能改善這種情況。謝辭在畢業(yè)論文完成之際,我在此對郭金令老師表示衷心的感謝!在整個畢業(yè)設(shè)計過程中,非常感謝老師和同學(xué)在各個方面的悉心指導(dǎo)。老師不懈的研究精神和崇高的敬業(yè)精神深深震撼了我。在今后的工作生活中,我將會以他為榜樣,向著郭老師指出的方向和高度最后,向所有在學(xué)習(xí)上給過我?guī)椭椭С值膶W(xué)院領(lǐng)導(dǎo)、老師和同學(xué)致以最衷心的感謝!謝謝!參考文獻(xiàn)[1]官章全.VC60高級編程范例[M].北京:電子工業(yè)出版社,2001:72~163[2]張海藩.軟件工程導(dǎo)論[M].北京:清華大學(xué)出版社,1998:18~209[3]謝希仁.計算機(jī)網(wǎng)絡(luò)[M].北京:電子工業(yè)出版社,1999:103~198[4]王國印.譯VisualC++TM技術(shù)內(nèi)幕(第二版)[M].北京:清華大學(xué)出版社,1996:23~132[5]徐軍譯.VisualC++5開發(fā)人員指南[M].北京:機(jī)械工業(yè)出版社,1995:64~239[6]木林森.VisualC++5.0使用與開發(fā)[M].北京:清華大學(xué)出版社,1992:85~189[7]汪成為.面向?qū)ο蠓治?、設(shè)計及應(yīng)用[M].北京:國防工業(yè)出版社,1992:216~386[8]譚浩強(qiáng).C程序設(shè)計[M].北京:清華大學(xué)出版社,1994:64~162[9]賀善侃.社會發(fā)展的新紀(jì)元[M].上海:上海辭書出版社,2004:47~230[10]RosemaryPhipps.TheMarketingCustomer[M].MassachusettsInstituteofTechnologyjournal,2005:23~199附錄附錄1:源代碼//AddFriendDlg.cpp:implementationfile#include"stdafx.h"#include"client.h"#include"AddFriendDlg.h"#include"Mainfrm.h"#include"frienddetail.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAddFriendDlgdialogCAddFriendDlg::CAddFriendDlg(CWnd*pParent/*=NULL*/) :CDialog(CAddFriendDlg::IDD,pParent){ //{{AFX_DATA_INIT(CAddFriendDlg) m_strID=_T(""); m_strName=_T(""); //}}AFX_DATA_INIT pDetailDlg=NULL; pWnd=NULL; bStartAdd=FALSE;}voidCAddFriendDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAddFriendDlg) DDX_Control(pDX,IDC_FRIEND_DETAIL,m_headbmp); DDX_Control(pDX,IDC_RECT,m_Rect); DDX_Text(pDX,IDC_ID,m_strID); DDX_Text(pDX,IDC_NAME,m_strName); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAddFriendDlg,CDialog) //{{AFX_MSG_MAP(CAddFriendDlg) ON_WM_TIMER() ON_BN_CLICKED(IDC_FRIEND_DETAIL,OnFriendDetail) //}}AFX_MSG_MAP ON_MESSAGE(WM_RECIEVE_MSG,OnRecvAddFriendRes) ON_MESSAGE(WM_NOTICE_ADDFRIEND,OnNoticeAddFriend)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CAddFriendDlgmessagehandlersvoidCAddFriendDlg::OnTimer(UINTnIDEvent){ if(nIDEvent==1) { EndWaitCursor(); KillTimer(1); CStringstr; str.LoadString(IDS_SERVER_NOT_RES); MessageBox(str); CDialog::OnOK(); }}LRESULTCAddFriendDlg::OnRecvAddFriendRes(WPARAMwParam,LPARAMlParam){ if(!bStartAdd)return0; bStartAdd=FALSE; CData*pData=(CData*)wParam; if(pData->index==RE_ADD_AS_FRIEND) { KillTimer(1); CMsg3msg; CopyDataBuf(&msg,pData); deletepData; if(!msg.LoadFromBuf())return0; //(0,1,2,3別人拒絕,成功加入,要求驗證人份,此人已經(jīng)為好友) En

溫馨提示

  • 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

提交評論