聊天系統(tǒng)畢業(yè)論文_第1頁
聊天系統(tǒng)畢業(yè)論文_第2頁
聊天系統(tǒng)畢業(yè)論文_第3頁
聊天系統(tǒng)畢業(yè)論文_第4頁
聊天系統(tǒng)畢業(yè)論文_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、PAGE PAGE 33摘 要本文詳細(xì)論述了在線聊天系統(tǒng)的開發(fā)和實現(xiàn)過程,從需求分析、系統(tǒng)功能分析、系統(tǒng)功能模塊設(shè)計、系統(tǒng)功能的實現(xiàn)和運行調(diào)試等幾大方面敘述了該管理系統(tǒng)的性能及功能的實現(xiàn),其中也包括了在開發(fā)過程中出現(xiàn)的問題難點及解決方案等信息。本系統(tǒng)是在Windows2000下使用現(xiàn)在流行的編程工具Visual C+開發(fā)。以Visual C+的MFC(微軟基本類庫)作為基本的的開發(fā)基礎(chǔ)。本系統(tǒng)使用Socket套接字作為開發(fā)的應(yīng)用程序開發(fā)模型,使用Sockets原型開發(fā),可以方便的建立連接,數(shù)據(jù)傳輸,和斷開連接,從而實現(xiàn)網(wǎng)絡(luò)在線聊天系統(tǒng)的在線好友查找,發(fā)送消息和接收消息.本文詳細(xì)的介紹了網(wǎng)絡(luò)在線

2、聊天系統(tǒng)的開發(fā)背景、開發(fā)工具、運行環(huán)境的選擇,系統(tǒng)功能分析,客戶端和服務(wù)器端的建立連接、消息的發(fā)送、消息的接收、消息的處理和斷開連接、界面設(shè)計和功能實現(xiàn)方面的信息,并詳細(xì)說明了在開發(fā)過程中的遇到的難點和問題,本系統(tǒng)實現(xiàn)了在用戶需求分析階段所提出的所有要求,用戶可以隨時和服務(wù)器建立和斷開連接。方便的連接和斷開連接的方法是Socket的優(yōu)點所在。關(guān)鍵字:網(wǎng)絡(luò)、通信、套接字、連接目錄序言1第一章 VisualC+及Socket套接字介紹3 一 VisualC+ 介紹3 二 Socket套接字介紹4 第二章 軟件需求分析14 一 系統(tǒng)客戶要求14 二 系統(tǒng)詳細(xì)設(shè)計15三 系統(tǒng)開發(fā)目標(biāo)16四 系統(tǒng)開發(fā)思

3、路16五 需求總結(jié)17第三章 系統(tǒng)具體實現(xiàn)20一 概要設(shè)計20二 定義服務(wù)器端和客戶端的通信結(jié)構(gòu)及含義21 三 服務(wù)器端的實現(xiàn)流圖24四 客戶端的實現(xiàn)流圖28第四章 系統(tǒng)測試 29第五章 系統(tǒng)運行和維護(hù)31第六章 結(jié)束語32參考文獻(xiàn)33序 言隨著現(xiàn)代技術(shù)的不斷輸入和信息化的廣泛普及,網(wǎng)絡(luò)作為一種新興事物,在近些年得到了前所未有的普及和深入,網(wǎng)絡(luò)上的各種應(yīng)用層出不窮,給各個階層、各個年齡段的用戶提供了不同的個性化的服務(wù)。而現(xiàn)代中小型企業(yè)的領(lǐng)導(dǎo)認(rèn)識到進(jìn)一步提高企業(yè)信息化的必要性。為使企業(yè)能在瞬息萬變的信息時代生存下去,適應(yīng)激烈的市場競爭,現(xiàn)代企業(yè)要求正加員工之間的交流和通信能力,尤其是領(lǐng)導(dǎo)和員工之

4、間的共同能力,實時的交流系統(tǒng)就是在這種條件下誕生的。系統(tǒng)開發(fā)是一個十分復(fù)雜的系統(tǒng)工程。這里對系統(tǒng)開發(fā)的基本過程和方法進(jìn)行介紹,列出相關(guān)文檔的示例并加以說明。網(wǎng)絡(luò)通信是網(wǎng)絡(luò)應(yīng)用的重要體現(xiàn)方面。網(wǎng)上即時通信則是網(wǎng)絡(luò)應(yīng)用的重要體現(xiàn)方面。本聊天系統(tǒng)主要應(yīng)用于小型企業(yè),學(xué)?;蛐⌒途钟蚓W(wǎng)內(nèi)部使用。本應(yīng)用程序使短距離交流更加快捷和便利。更能高效率的體現(xiàn)現(xiàn)代即時通信的特點。本系統(tǒng)能夠滿足中小型企業(yè),學(xué)校的內(nèi)部網(wǎng)絡(luò)即時通信的需要,在內(nèi)部網(wǎng)絡(luò)正常環(huán)境的運營下,提供即時通信的能力,本系統(tǒng)使用Visual C+開發(fā),本系統(tǒng)能夠為中小型企業(yè)協(xié)同工作,相互間的交流提供了有力的工具,運用在局域網(wǎng)的本系統(tǒng),能夠為企業(yè)員工的交

5、流提供幫助,有利于提高工作效率,第一章 VisualC+及Socket套接字介紹一 Visual C 介紹和其他編程工具相比,Visual C+在提供可視化編程方法的同時,適應(yīng)于編寫直接對系統(tǒng)進(jìn)行底層操作的程序.其生成代碼的質(zhì)量,也要優(yōu)于許多其他開發(fā)工具.Visual C+所提供的MFC(Microsoft基本類庫),對Window98/NT/2000所用的Win32 API(應(yīng)用程序接口)進(jìn)行了徹底的封裝,這使得可以使用完全的面向?qū)ο蟮木幊谭椒▉磉M(jìn)行Windows程序的開發(fā),并能夠大大縮短程序的開發(fā)周期,降低開發(fā)成本,把Windows程序員從大量復(fù)雜的勞動中解放出來.Visual C+給應(yīng)用

6、程序的開發(fā)人員提供了豐富的功能,Visual C+通過MFC庫提供了一個完整的應(yīng)用程序的骨架,開發(fā)人員可以忽略應(yīng)用程序的入口點和結(jié)束地點,并且可以忽略消息在應(yīng)用程序的流動順序,通過MFC的支持Visual C+也提供了Document-View(文檔視圖)的應(yīng)用程序的結(jié)構(gòu),開發(fā)人員可以將數(shù)據(jù)保存在Document類的對象上,而在屏幕的顯示的數(shù)據(jù)由View類的對象來負(fù)責(zé)。通過MFC的支持Visual C+也實現(xiàn)了面向?qū)ο箢I(lǐng)域的RTTI(RunTime Type Information 運行時類型識別)、Dynamic Creation(動態(tài)創(chuàng)建)、(Persitence)永久保存機制,同時他也實

7、現(xiàn)了Windows下的Message Mapping(消息映射)和Command Routing(命令傳遞),通過MFC的Cdatabase和Crecordset類Visual C+可以實現(xiàn)數(shù)據(jù)庫的應(yīng)用,通過ChtmlStream、CHttpFilter、CHttpFilterContext、ChttpServer等ISAPI(Internet Server API)可以很好的支持Internet上的http協(xié)議相關(guān)的操作。由于MFC涉及到應(yīng)用程序開發(fā)的各個領(lǐng)域,其Visual C+成為倍受歡迎的開發(fā)工具。二 Socket套接字介紹Winsock是一套開放的,支持多種協(xié)議的Windows下網(wǎng)絡(luò)

8、編程接口,是Windows網(wǎng)絡(luò)編程實是上的標(biāo)準(zhǔn).應(yīng)用程序通過調(diào)用Winsock的API實現(xiàn)相互間的通信,而Winsock利用下層的網(wǎng)絡(luò)通信協(xié)議功能和操作系統(tǒng)調(diào)用實現(xiàn)實際的通信工作.1 套接字(Sockets)套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的操作單元.可以將套接字看作不同主機間的進(jìn)程進(jìn)行雙向通信的端點,它構(gòu)成了單個主機內(nèi)及整個網(wǎng)絡(luò)間的編程界面.套接字存在于通信域中.通信域是為了處理一般的線程通過套接字通信而引進(jìn)的一種抽象概念.套接字通過通常和同一個域中的套接字交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時一定要執(zhí)行某種解釋程序).Winsock規(guī)范支持單一的通信域,即Inte

9、rnet域.各種進(jìn)程使用這個域互相之間用Internet協(xié)議簇來進(jìn)行通信(Winsock 1.1以上的版本支持其他的域)。套接字可以根據(jù)通信性質(zhì)分類,這種性質(zhì)對于用戶時可見的.應(yīng)用程序一般僅在同一類的套接字間通信.不過只要底層的通信協(xié)議允許,不同類型的套接字間也照樣可以通信進(jìn)入九十年代后,隨著計算機和網(wǎng)絡(luò)技術(shù)的發(fā)展,很多數(shù)據(jù)處理系統(tǒng)都采用開放系統(tǒng)結(jié)構(gòu)的客戶機/服務(wù)器網(wǎng)絡(luò)模式,即客戶機提出任務(wù)請求,通過網(wǎng)絡(luò)發(fā)送給服務(wù)器,由服務(wù)器做相應(yīng)處理,執(zhí)行被請求的任務(wù),然后將結(jié)果返回給客戶機。例如:銀行ATM的前置機和數(shù)據(jù)處理的主機之間即構(gòu)成客戶機/服務(wù)器網(wǎng)絡(luò)模式;電話銀行的前置機和銀行數(shù)據(jù)處理機之間也構(gòu)成

10、這種網(wǎng)絡(luò)模式結(jié)構(gòu)等。這樣,如何在前置機和數(shù)據(jù)主機之間進(jìn)行信息交換,即進(jìn)程網(wǎng)絡(luò)通信,就成為實現(xiàn)這種網(wǎng)絡(luò)模式的基礎(chǔ)。而TCP/IP的套接字技術(shù)是解這一問題的有力工具。它從提出時就一直發(fā)揮著愈來愈重要的作用,并已成為UNIX操作系統(tǒng)下TCP/IP網(wǎng)絡(luò)編程標(biāo)準(zhǔn);甚至WINDOW、JAVA都配有它的通用接口。有了這個強有力的工具,我們可以實現(xiàn)異種機、異種操作系統(tǒng)應(yīng)用程序間的相互連接和通信。套接字(sockets)是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。可以將套接字看作不同主機間的進(jìn)程進(jìn)行雙向通信的端點。它構(gòu)成了在單個主機內(nèi)及整個網(wǎng)際間的編程界面。一般來說,跨機應(yīng)用進(jìn)程之間要在網(wǎng)絡(luò)環(huán)境下進(jìn)行通信,

11、必須要在網(wǎng)絡(luò)的每一端都要建立一個套接字,兩個套接字之間是可以建立連接的,也是可以無連接的,并通過對套接字的“讀”、“寫”操作實現(xiàn)網(wǎng)絡(luò)通信功能。類似于UNIX系統(tǒng)中的I/O概念,像文件那樣有打開、讀、寫、關(guān)閉的方式。根據(jù)傳輸數(shù)據(jù)類型的不同,套按字可分為面向連接的數(shù)據(jù)套接字(streamsockets)和無連接的數(shù)據(jù)報套接字(datagramsockets)兩種類型:(1)字節(jié)流套接字字節(jié)流不按記錄定界,在TCP/IP協(xié)議簇中對應(yīng)TCP協(xié)議,即傳輸控制協(xié)議(TransmitionControlProtocol)。它是一個提供給用戶進(jìn)程可靠的全雙工的面向連接的協(xié)議,大多數(shù)INTERNET應(yīng)用程序如f

12、tp、telnet使用TCP協(xié)議。通信端點使用TCP對應(yīng)的INTERNET地址互相連接,可保證按正確的順序以及單一和可靠的地址傳輸數(shù)據(jù)。由于它是字節(jié)流,所以包長包沒有限制,信包傳輸也不重復(fù),因而是一種常用的套接字類型。流套接字提供雙向的,有序的,無重復(fù)并且無記錄邊界的數(shù)據(jù)流服務(wù),它適應(yīng)于處理大量數(shù)據(jù).網(wǎng)絡(luò)傳輸層可以將數(shù)據(jù)分散或集中到合適尺寸的數(shù)據(jù)包中。 (2)數(shù)據(jù)報套接字?jǐn)?shù)據(jù)報對應(yīng)記錄型數(shù)據(jù)流,在TCP/IP協(xié)議簇中對應(yīng)UDP協(xié)議,即用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol)。利用數(shù)據(jù)報服務(wù)可實現(xiàn)一些簡單的網(wǎng)絡(luò)服務(wù),如網(wǎng)點檢測程序PING。由于不建立連接,數(shù)據(jù)報協(xié)議比連接協(xié)議快

13、。但不能保證所有數(shù)據(jù)都準(zhǔn)確有序地到達(dá)目的地。不保證順序性、可靠性和無重復(fù)性。它是無連接的服務(wù),以獨立的信包進(jìn)行傳輸,通信端點使用UDP對應(yīng)的INTERNET地址。雙方不需互連,按固定的最大長度進(jìn)行傳輸,因而適用于單個報文傳輸,或較小文件的傳輸。數(shù)據(jù)報套接字支持雙向的數(shù)據(jù)流,但不保證數(shù)據(jù)傳輸?shù)目煽啃?有序性,和無重復(fù)性.也就是說,一個從數(shù)據(jù)報套接字接受信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù),或者和發(fā)出時間順序不同的情況.此外,數(shù)據(jù)報套接字的一個重要特點是它保留了記錄邊界。2套接字的編程要點及過程不論何種套接字編程,均采用客戶機/服務(wù)器方式,其運作過程基本類似,限于篇幅,這里僅介紹字節(jié)流套接字。字節(jié)流套按字

14、的服務(wù)進(jìn)程和客戶進(jìn)程,在通信前必須創(chuàng)建各自的套接字以建立連接,然后對相應(yīng)的套接字進(jìn)行“讀”、“寫”操作,實現(xiàn)信息的交換。服務(wù)器進(jìn)程創(chuàng)建套接字。服務(wù)進(jìn)程總是先于客戶進(jìn)程啟動,服務(wù)進(jìn)程首先調(diào)用socket()函數(shù)創(chuàng)建自已端的一個字節(jié)流套接字,并提供三個參數(shù):網(wǎng)絡(luò)地址類型,一般取AF_INEF(AdressfamilyInterNET);套接字類型,這里取SOCK_STREAM;網(wǎng)絡(luò)協(xié)議,缺省為TCP/IP協(xié)議,對應(yīng)參數(shù)為0。給套接字地址變量賦初值。在生成套接字后,要用服務(wù)器的地址先對sockaddr_in結(jié)構(gòu)變量賦初值。sockaddr_in它只適用INTERNET地址類型,含有INTERNET套

15、接字地址類型、IP端口號、IP地址等信息。地址類型可取定為AF_INET,IP地址對服務(wù)器可取任意合法地址INADDR_ANY。IP端口號可由用戶設(shè)定,但要注意主機字節(jié)順序向網(wǎng)絡(luò)字節(jié)順序的轉(zhuǎn)換。給套接字命名。由socket()函數(shù)創(chuàng)建的套接字是沒有名字的。所謂命名,就是用bind()函數(shù)將服務(wù)器地址捆綁到創(chuàng)建的套接字上。服務(wù)器進(jìn)程準(zhǔn)備接受來自客戶機的連接請求。首先調(diào)用listen()函數(shù),讓服務(wù)器進(jìn)程進(jìn)入監(jiān)聽狀態(tài);然后調(diào)用accept()函數(shù),準(zhǔn)備接受客戶機的連接信號。無連接請求時,服務(wù)進(jìn)程被阻塞??蛻暨M(jìn)程調(diào)用socket()函數(shù)創(chuàng)建已端的套接字。給客戶端的sockaddr_in結(jié)構(gòu)體變量賦值

16、。地址類型仍可取AF_INET,端口號和服務(wù)器方的端口號相同,欲連服務(wù)器的地址通過調(diào)用inet_addr()轉(zhuǎn)換得到。也可通過gethostbyname()函數(shù)將名字轉(zhuǎn)換為指向hostent結(jié)構(gòu)變量的指針,再將hostent結(jié)構(gòu)變量的地址成員用bcopy()復(fù)制到sockaddr_in結(jié)構(gòu)變量上。客戶方調(diào)用connect()函數(shù)向服務(wù)進(jìn)程發(fā)出連接請求。當(dāng)連接請求到來后,被阻塞服務(wù)進(jìn)程的accpet()函數(shù)生成一個新的字節(jié)流套接字,并返回客戶機的sockaddr_in結(jié)構(gòu)變量,從而在服務(wù)器應(yīng)用程序中用新的被賦予客戶機地址的套接字同客戶進(jìn)程進(jìn)行連接,然后向客戶方返回接受信號。一旦客戶機的套接字收到

17、來自服務(wù)器的接受信號,則表示客戶機與服務(wù)器雙方已實現(xiàn)連接。任一方均可向?qū)Ψ桨l(fā)送,也可接收對方發(fā)來的數(shù)據(jù)。這既可通過send()、recv()函數(shù)來實現(xiàn)。也可通過read()、write()函數(shù)來交換數(shù)據(jù)。服務(wù)進(jìn)程和客戶進(jìn)程可通過調(diào)用shutdown()和colse()關(guān)閉套接字上的所有發(fā)送和接收操作,撤銷套接字并中斷連接3 基本概念(1)帶外數(shù)據(jù)帶外數(shù)據(jù),也稱為TCP緊急數(shù)據(jù),它是相連的每一對流套接字間的一個邏輯上獨立的傳輸通道,帶外數(shù)據(jù)是獨立于普通數(shù)據(jù)傳輸給用戶的,這一抽象要求帶外數(shù)據(jù)設(shè)備必須支持每一時刻僅有一個帶外數(shù)據(jù)信息等候發(fā)送。對于僅支持帶外數(shù)據(jù)的通信協(xié)議來說(例如緊急數(shù)據(jù)是與普通數(shù)據(jù)

18、在同一序列發(fā)送),系統(tǒng)通常把緊急數(shù)據(jù)從普通數(shù)據(jù)中分離出來單獨存放。這就允許用戶可以在順序接受緊急數(shù)據(jù)和非順序接收緊急數(shù)據(jù)之間作出選擇。(2)廣播數(shù)據(jù)報套接字可以用來向許多系統(tǒng)支持的網(wǎng)絡(luò)發(fā)送廣播數(shù)據(jù)包。要實現(xiàn)這種功能,網(wǎng)絡(luò)必須支持廣播功能。為此系統(tǒng)軟件并不提供對廣播功能的任何模擬。廣播信息將會給網(wǎng)絡(luò)造成極重的負(fù)擔(dān),為此它們要求網(wǎng)絡(luò)上的每臺主機都為他們服務(wù),所以發(fā)送廣播數(shù)據(jù)包的能力被限制于那些用顯式標(biāo)記了允許廣播的套接字中。廣播通常應(yīng)用于以下兩種情況:一個應(yīng)用程序希望在本地網(wǎng)絡(luò)中找到一個資源。而應(yīng)用程序?qū)υ撡Y源的地址又沒有任何先驗的知識。一些重要功能,例如路由要求把它們的信息發(fā)送給所有可以找到的鄰

19、機。被廣播信息的目的地址取決于這一信息將在何種網(wǎng)絡(luò)上廣播。Internet域中支持一個速記地址INADDR_BROADCAST用于廣播。由于使用廣播以前必須綁定一個數(shù)據(jù)包套接字,所以所有收到的廣播消息都帶有發(fā)送者的地址和端口。(3)字節(jié)順序不同的計算機有時使用不同的字節(jié)順序存儲數(shù)據(jù)。例如,基于Intel處理器的計算機和Macintosh計算機使用了相反的字節(jié)排序順序。Intel的字節(jié)順序被成為“Little-Endian”,它與網(wǎng)絡(luò)的字節(jié)排序順序“Big-Endian”排序順序相反。任何從Winsock函數(shù)對IP地址和端口號的引用和傳送給Winsock函數(shù)的IP地址和端口號均是按照網(wǎng)絡(luò)順序組織

20、的,這也包括了sockaddr_in這一數(shù)據(jù)結(jié)構(gòu)中的IP地址域和端口域考慮到一個應(yīng)用程序通常用與“時間”服務(wù)對應(yīng)的端口來和服務(wù)器連接,而服務(wù)器提供某些機制來通知用戶使用另一端口。為此getservbyname函數(shù)返回的端口已經(jīng)是網(wǎng)絡(luò)順序了,可以直接使用來組織成一個地址,而不需要進(jìn)行轉(zhuǎn)換。然而如果從主機順序轉(zhuǎn)換成網(wǎng)絡(luò)順序。相應(yīng)地,如果應(yīng)用程序希望顯示包含于某一地址中地端口號,則這一端口號就必須在被顯示前從網(wǎng)絡(luò)順序轉(zhuǎn)換到主機順序。(4)阻塞和非阻塞套接字可以處于阻塞模式或非阻塞模式。調(diào)用任何一個阻塞模式地函數(shù),都回產(chǎn)生相同地后果-耗費或長或短地時間等待操作地完成。而當(dāng)套接字處于非阻塞模式時,API

21、函數(shù)的調(diào)用會立即返回,大多數(shù)情況這些調(diào)用都回“失敗”,并返回一個WASEWOULDBLOCK的錯誤,它意味著請求的操作在調(diào)用期間沒有時間完成。Winsock的套接字I/O模型可以幫助應(yīng)用程序判斷一個套接字何時可供讀寫.套接字的行為在Windows 9X 和Windows NT中與在 Windows 3.1中不同.在32位操作系統(tǒng)中,可以采用多線程編程,在不同的線程中使用套接字,這樣即使某個線程中的套接字被阻塞,也不會影響應(yīng)用程序的其他操作,同時也不會在阻塞線程上耗費CPU時間。(5) Winsock編程原理進(jìn)入20世紀(jì)90年代后,隨著計算機和網(wǎng)絡(luò)技術(shù)的發(fā)展,很多數(shù)據(jù)處理系統(tǒng)都采用開放系統(tǒng)結(jié)構(gòu)的

22、客戶機/服務(wù)器(Client/Server)網(wǎng)絡(luò)模型,即客戶機向服務(wù)器提交請求,服務(wù)器對請求做相應(yīng)的處理兵執(zhí)行被請求的任務(wù),然后將結(jié)構(gòu)返回給客戶機。這種方式隱含了在建立客戶機/服務(wù)器間通信是的非對稱性??蛻魴C/服務(wù)器模型工作時要求有一套為客戶機和服務(wù)器所共識的慣例來保證服務(wù)能夠被提供(或被接受),這一套慣例包含了一套協(xié)議,它必須在通信的兩頭都被實現(xiàn)。根據(jù)不同的實際情況,協(xié)議可能是對稱的或非對稱的。在對稱的協(xié)議中每一方都有可能扮演主從角色;在非對稱協(xié)議中一方被不可改變地認(rèn)為是主機,而另一方則是從機。一個對稱協(xié)議地例子是Internet中用于終端仿真地Telnet,而非對稱協(xié)議地例子是Intern

23、et中的http。無論具體的協(xié)議是對稱的或是非對稱的,當(dāng)服務(wù)被提供時必然存在客戶進(jìn)程和服務(wù)進(jìn)程。 (6) MFC Windows Socket類Visual C+對眾多的socket函數(shù)進(jìn)行了封裝,MFC提供的封裝類是:CAsyncSocket和CSocket類,它們使編程工作變得相對簡單尤其是CSocket類:CAsyncSocket類所提供的唯一的抽象就是將與套接字相聯(lián)系的Windows消息以回調(diào)函數(shù)的形式表示,因此它帶來的唯一方便就是程序員無需自行處理Winsock的I/O模型,而對于如阻塞處理、字節(jié)順序差異以及Unicode等依然負(fù)有責(zé)任并有靈活的控制權(quán)。CSocket類是CAsync

24、Socket類的派生類,它提供了對通過Carchive對象使用套接字工作的更高級抽象。CSocket類的使用比CAsynCSocket類更加容易,它繼承了CAsyncSocket類的許多封裝了API的成員函數(shù),并且管理了通信的大多數(shù)方面,這使得用戶從原來不得不使用原始API或者CAsyncSocket類的煩雜的工作中解脫出來。更加重要的是CSocket和Carchive類提供了對于同步操作Carchive對象十分重要的阻塞功能,且CSocket通過與CSocketFile和Carchive一起使用來管理對象數(shù)據(jù)的發(fā)送和接收,使發(fā)送數(shù)據(jù)和操作變得簡單明了。以下使CSocket對象與串行化技術(shù)及C

25、Socket類的編程模型。第二章 軟件需求分析一 系統(tǒng)客戶要求需求分析是軟件分析中的一個重要步驟。它的基本任務(wù)是要準(zhǔn)確地分析出系統(tǒng)應(yīng)用者的需要,以及系統(tǒng)目標(biāo)必須具備哪些功能。這些功能必須準(zhǔn)確地,完整地體現(xiàn)出用戶的要求根據(jù)網(wǎng)絡(luò)應(yīng)用程序的特點,網(wǎng)絡(luò)在線聊天系統(tǒng)應(yīng)就有即時,快速的特點。服務(wù)器端和客戶端應(yīng)就有不同的功能特性。對于服務(wù)器端應(yīng)能夠正確地建立與客戶端的連接并能正確地斷開,能即時地接收、處理和發(fā)送接收到的數(shù)據(jù)。能及時地通知在線用戶當(dāng)前好友在線狀況,能夠處理非正常數(shù)據(jù)的能力。對于客戶端應(yīng)能夠快速地檢查是否能夠連接到服務(wù)器端。能正確的獲得和反映當(dāng)前好友在線情況。能夠正確的與特定好友交流。能及時地接

26、收到服務(wù)器端地數(shù)據(jù),并能即時處理數(shù)據(jù),并能將處理結(jié)果反映給用戶。服務(wù)器端:能夠正確地、無沖突地啟動服務(wù)器。監(jiān)聽指定的端口,等待用戶的連接。建立與客戶端的邏輯連接,并能通知其他好友。向新進(jìn)入的好友發(fā)出已上線的好友名單。接收客戶端的消息請求,并能正確無誤地處理消息,并能發(fā)出消息到客戶端。反映當(dāng)前在線人數(shù)和在線好友狀況。及時地反映發(fā)出地消息和聊天消息。當(dāng)好友斷開與服務(wù)器端地連接時,服務(wù)器能夠正確地斷開連接,并通知其他用戶。當(dāng)用戶違反聊天系統(tǒng)規(guī)定時,服務(wù)器系統(tǒng)管理員能夠斷開與此用戶的連接。當(dāng)服務(wù)器關(guān)閉時,應(yīng)通知所有用戶??蛻舳耍耗軌蛘_啟動應(yīng)用程序,并能向服務(wù)器發(fā)出連接請求。反映當(dāng)前好友在線情況。能夠

27、向群體或指定好友發(fā)出消息能夠及時接收好友發(fā)出消息,并通知用戶。能夠正確地斷開與服務(wù)器端地的連接。二 系統(tǒng)詳細(xì)設(shè)計對現(xiàn)行管理業(yè)務(wù)進(jìn)行了詳細(xì)調(diào)查研究,了解了系統(tǒng)需求和進(jìn)行了系統(tǒng)分析與設(shè)計工作。對員工進(jìn)行全面、細(xì)致而充分的調(diào)查研究和到生產(chǎn)和管理的現(xiàn)場去,并通過座談、詢問后,自上而下逐步細(xì)化的進(jìn)行了了解,調(diào)查的內(nèi)容涉及到企業(yè)的發(fā)展目標(biāo)、經(jīng)營管理情況,通過系統(tǒng)流程圖中的部分圖形工具來描述管理業(yè)務(wù)活動,進(jìn)行規(guī)范化說明。流程圖如下:用戶運行客戶端端應(yīng)用程序用戶運行客戶端端應(yīng)用程序用戶名存在,從新填寫用戶名存在,從新填寫填寫用戶姓名 提交到服務(wù)器填寫用戶姓名 提交到服務(wù)器不存在同名,用戶登陸到聊天室,等待好友

28、消息或向好友發(fā)出消息不存在同名,用戶登陸到聊天室,等待好友消息或向好友發(fā)出消息三 系統(tǒng)開發(fā)目標(biāo)1 實時好友登陸 當(dāng)好友登陸或離開聊天室,服務(wù)器端有能力通知所有其他在線用戶。2 收發(fā)消息同步 當(dāng)一用戶向其他的好友發(fā)出消息,發(fā)送接收端的用戶應(yīng)能及時接收到消息。3 服務(wù)器關(guān)閉通知 當(dāng)服務(wù)器因故障或維護(hù)需要暫時關(guān)閉,應(yīng)有通知在線用戶的能力。4 隱私消息模式 當(dāng)用戶選擇發(fā)送消息為私聊的模式。其他在線用戶不能看到此條消息。四 系統(tǒng)開發(fā)思路盡量采用公司現(xiàn)有的硬件環(huán)境,及先進(jìn)的管理系統(tǒng)開發(fā)方案,從而達(dá)到充分利用公司現(xiàn)有資源,提高系統(tǒng)開發(fā)水平和應(yīng)用效果的目的。系統(tǒng)應(yīng)符合員工日常的規(guī)定,滿足公司日常工作需要,并達(dá)

29、到操作過程中的直觀、方便、實用、安全等要求。系統(tǒng)采用C/S模型。服務(wù)器端和客戶端均使用Visual C+并使用Sockets模型開發(fā)實現(xiàn)系統(tǒng)采用模塊化程序設(shè)計方法,既便于系統(tǒng)功能的各種組合和修改,又便于未參與開發(fā)的技術(shù)維護(hù)人員補充和維護(hù)。五 需求的總結(jié)首先,經(jīng)過和用戶的討論將系統(tǒng)要實現(xiàn)的功能列出來。主要模塊有登陸模塊、連接模塊 、發(fā)送消息模塊和接收和處理模塊。其次,對軟件的性能指標(biāo)的需求。主要有人機界面交互反應(yīng)時和運行時間限制在 2 秒之內(nèi),系統(tǒng)啟動運行不超過 5 秒,占用內(nèi)存不超過 20M,外存不超過 200M(不包括數(shù)據(jù)庫部分) 。 然后,提出軟件運行的環(huán)境需求。該公司的運行環(huán)境設(shè)置為:具

30、有 1GB以上的cpu , 128MB的內(nèi)存, 20GB硬盤規(guī)模的服務(wù)器和數(shù)臺普通可連網(wǎng)微機;軟件采用windows 2000(服務(wù)器)和windows 98以上作為系統(tǒng)和網(wǎng)絡(luò)軟件。該軟件的使用對象是公司的管理人員,只要會用一般的微機操作即可。 從數(shù)據(jù)流和數(shù)據(jù)結(jié)構(gòu)出發(fā),逐步細(xì)化所有的軟件功能,找出系統(tǒng)各元素之間的聯(lián)系,接口特性和設(shè)計上的限制,分析它們是否滿足功能要求,是否合理。在該系統(tǒng)的分析和綜合中,經(jīng)過多次與用戶的交流形成了如下所示的各功能模塊圖如下。發(fā)出添加好友消息發(fā)出好友名單消息發(fā)出傳輸數(shù)據(jù)消息發(fā)出用戶重名消息發(fā)出消息接收客戶端退出消息接收傳輸數(shù)據(jù)消息接收連接請求消息接收消息用戶請求連接

31、在線聊天系統(tǒng)服務(wù)器端啟動發(fā)出用戶登陸成功消息發(fā)出聊天室關(guān)閉消息發(fā)出好友離開消息發(fā)出添加好友消息發(fā)出好友名單消息發(fā)出傳輸數(shù)據(jù)消息發(fā)出用戶重名消息發(fā)出消息接收客戶端退出消息接收傳輸數(shù)據(jù)消息接收連接請求消息接收消息用戶請求連接在線聊天系統(tǒng)服務(wù)器端啟動發(fā)出用戶登陸成功消息發(fā)出聊天室關(guān)閉消息發(fā)出好友離開消息服務(wù)器端系統(tǒng)功能模塊圖接收消息在線聊天系統(tǒng)服務(wù)器端接收客戶端退出消息接收傳輸數(shù)據(jù)消息接收連接請求消息發(fā)出消息發(fā)出好友離開消息發(fā)出聊天室關(guān)閉消息發(fā)出好友名單消息發(fā)出傳輸數(shù)據(jù)消息發(fā)出用戶重名消息發(fā)出用戶登陸成功消息接收消息在線聊天系統(tǒng)服務(wù)器端接收客戶端退出消息接收傳輸數(shù)據(jù)消息接收連接請求消息發(fā)出消息發(fā)出好

32、友離開消息發(fā)出聊天室關(guān)閉消息發(fā)出好友名單消息發(fā)出傳輸數(shù)據(jù)消息發(fā)出用戶重名消息發(fā)出用戶登陸成功消息客戶端系統(tǒng)功能模塊圖第三章 系統(tǒng)具體實現(xiàn)一 概要設(shè)計根據(jù)調(diào)查和研究,得到系統(tǒng)所要處理的數(shù)據(jù)可流程,如圖所示:用戶名存在,從新填寫用戶運行客戶端端應(yīng)用程序填寫用戶姓名 提交到服務(wù)器用戶名存在,從新填寫用戶運行客戶端端應(yīng)用程序填寫用戶姓名 提交到服務(wù)器不存在同名,用戶登陸到聊天室不存在同名,用戶登陸到聊天室 接收服務(wù)器端的在線用戶列表 接收服務(wù)器端的在線用戶列表接收好友消息接收好友下線或登陸消息發(fā)送消息給好友接收好友消息接收好友下線或登陸消息發(fā)送消息給好友客戶端數(shù)據(jù)流圖服務(wù)器端正常啟動 等待接收用戶連接

33、信息服務(wù)器端正常啟動 等待接收用戶連接信息若消息為用戶登陸,則查看是否后同名用戶登陸 若有,這發(fā)出此用戶已存在消息,否則,發(fā)送登陸成功消息,并發(fā)送在線好友名單,若消息為用戶登陸,則查看是否后同名用戶登陸 若有,這發(fā)出此用戶已存在消息,否則,發(fā)送登陸成功消息,并發(fā)送在線好友名單,并發(fā)送此用戶名稱給已在線用戶若消息為用戶通訊消息,則轉(zhuǎn)發(fā)給該接收的用戶若消息為用戶通訊消息,則轉(zhuǎn)發(fā)給該接收的用戶若消息為用戶退出消息,這斷開連接,同時發(fā)送其他用戶此用戶退出消息若消息為用戶退出消息,這斷開連接,同時發(fā)送其他用戶此用戶退出消息服務(wù)器端數(shù)據(jù)流圖二 定義服務(wù)器端和客戶端的通信結(jié)構(gòu)及含義struct CMessa

34、gechar m_strText200;char from20;char to20;int type;結(jié)構(gòu)體的含義定義如下:type定義to20的含義m_strText20含義to20的含義MSG_FIRST用戶請求建立連接方向由客戶端到服務(wù)器端請求建立連接的好友名稱為空為空MSG_SUCCESS建立連接成功方向由服務(wù)器端到客戶端建立成功的好友名稱建立成功的好友名稱為空MSG_MESSAGE好友間傳輸?shù)南⒎?wù)器和客戶端雙向發(fā)出消息的好友名稱默認(rèn)接收消息好友名稱聊天內(nèi)容MSG_USER_ADD添加好友名稱消息方向由服務(wù)器端到客戶端為空添加的好友名稱為空MSG_USER_REMOVE好友離開時刪

35、除好友名稱方向由服務(wù)器到客戶端為空刪除地的好友名稱為空MSG_QUIT_CLIENT客戶端退出消息方向又客戶端到服務(wù)器端退出的好友名稱為空為空MSG_QUIT_SERVER客戶端退出消息方向又服務(wù)器端到客戶端為空為空為空MSG_RENAME通知用戶此用戶名已存在,應(yīng)更改用戶名再登陸方向又服務(wù)器端到客戶端存在重名的好友名稱空空三 服務(wù)器端具體實現(xiàn)服務(wù)器端有個CSocket的派生類CListenSocket對象指針來監(jiān)聽端口等待用戶登陸,而用另一個CSocket的派生類對象CClientSocket的指針組來處理和每一個客戶端的交互過程。派生類 CListenSocket的回調(diào)函數(shù)OnAccpet

36、()與客戶端建立套接字層次的連接。派生類CClientSocket的回調(diào)函數(shù)OnReceive()與接收每一個已連接的數(shù)據(jù)傳輸。由于應(yīng)用Visual C+的MFC編程,應(yīng)體現(xiàn)View/Document體系結(jié)構(gòu),所以CListenSocket的OnAccpet和CClientSocket的OnReceive函數(shù)放到應(yīng)用程序的Document的實現(xiàn)類實現(xiàn),又由于服務(wù)器端是基于對話框的應(yīng)用程序,所以以上兩個函數(shù)的實際處理代碼再工程的主體類CServerDlg的ProcessPendingAccept和ProcessPendingRead來處理工程中的cpp文件及其包含的重要函數(shù):ListenSock

37、et.cpp:(CListenSocket的實現(xiàn)文件)OnAccept(int nErrorCode)ClientSocket.cpp:(CClientSocket的實現(xiàn)文件)OnReceive(int nErrorCode)ServerDlg.cpp:(CServerDlg的實現(xiàn)文件) void InsertListAction(CMessage &msg,BOOL bDirection = FALSE);用于更新服務(wù)器端的消息列表。void NotifyName(LPCTSTR lpszText, int i)用于更新服務(wù)器端的在線用戶顯示void OnButtonKick()用于服務(wù)器端

38、的管理員斷開與指定用戶的連接void OnInitDialog()用于初始化主窗體對話框,并且建立套接字并綁定端口,和一些界面的初始化工作。void ProcessPendingAccept()處理客戶端和服務(wù)器端的連接工作。并將連接的套接字的對象指針保留到數(shù)組中。void ProcessPendingRead()處理客戶端發(fā)送到服務(wù)器端的數(shù)據(jù)。并對消息做一定的處理。SendUserNameToClient(CClientSocket *pSocket,CMessage msg)將用戶名稱發(fā)送到指定的套接字對應(yīng)的用戶UpdateClients(CMessage mmsg, int nBuffe

39、rSize)將mmsg結(jié)構(gòu)發(fā)送給所有用戶,即模擬廣播發(fā)送CPtrList m_connectionList; 連接到客戶端的套接字指針鏈表CListenSocket * m_pSocket; 監(jiān)聽套接字的對象指針intm_iConnNum;當(dāng)前連接數(shù)CServerDlg:OnInitDialog()m_pSocket = new CListenSocket(this);創(chuàng)建監(jiān)聽套接字m_pSocket-Create(1213);CServerDlg:OnInitDialog()m_pSocket = new CListenSocket(this);創(chuàng)建監(jiān)聽套接字m_pSocket-Create

40、(1213);綁定本地的1213端口m_pSocket-Listen();開始監(jiān)聽m_pSocket = new CListenSocket(this);創(chuàng)建監(jiān)聽套接字m_pSocket-Create(1213);綁定本地的1213端口m_pSocket-Listen();開始監(jiān)聽分析包的內(nèi)容,并查看是否存在同名用戶CServerDlg:ProcessPendRead()接收客戶端包含的WM_FIRST請求構(gòu)造包含MSG_USER_ADD的CMessage對象,調(diào)用CSocket-Send(),發(fā)送給其他用戶,通知新用戶登陸構(gòu)造包含MSG_USER_ADD的CMessage對象,調(diào)用CSock

41、et-Send(),發(fā)送給該用戶已進(jìn)入聊天室的好友名單若存在同名構(gòu)造包含MSG_RENAME的CMessage對象,調(diào)用分析包的內(nèi)容,并查看是否存在同名用戶CServerDlg:ProcessPendRead()接收客戶端包含的WM_FIRST請求構(gòu)造包含MSG_USER_ADD的CMessage對象,調(diào)用CSocket-Send(),發(fā)送給其他用戶,通知新用戶登陸構(gòu)造包含MSG_USER_ADD的CMessage對象,調(diào)用CSocket-Send(),發(fā)送給該用戶已進(jìn)入聊天室的好友名單若存在同名構(gòu)造包含MSG_RENAME的CMessage對象,調(diào)用CSocket:Send(),通知存在重名

42、CServerDlg:ProcessPendAccept()CListenSocket:OnAccpet()客戶端的請求連接若不存在同名 構(gòu)造包含MSG_SUCCESS若不存在同名 構(gòu)造包含MSG_SUCCESS的CMessage對象,調(diào)用CSocket:Send()通知用戶已建立連接服務(wù)器端具體的建立連接的過程觸發(fā)退出聊天室退出事件構(gòu)造包含MSG_QUIT_SERVER的CMessage的對象,用UpdateClients來使所有連接的客戶端都斷開連接,觸發(fā)退出聊天室退出事件構(gòu)造包含MSG_QUIT_SERVER的CMessage的對象,用UpdateClients來使所有連接的客戶端都斷開

43、連接,服務(wù)器退出并通知用戶過程接收到數(shù)據(jù)包CClientSocket:OnReceive()調(diào)用CServerDlg:ProcessPendRead()來分析獲得的包的內(nèi)容接收到數(shù)據(jù)包CClientSocket:OnReceive()調(diào)用CServerDlg:ProcessPendRead()來分析獲得的包的內(nèi)容接收到的包的type為MSG_MESSAGE接收到的包的type為MSG_MESSAGE,則調(diào)用UpdateAllClients來通知所有用戶構(gòu)造包含MSG_USER_REMOVE的CMessage 對象,并調(diào)用UpdateClients()來通知當(dāng)前在線好友好友離開接收到的包的typ

44、e為MSG_QUIT_CLIENT,則將此用戶對應(yīng)的套接字從套接字鏈表中刪除,并斷開連接服務(wù)器端接收到包含MSG_MESSAGE或MSG_QUIT_CLIENT消息的處理過程四 客戶端的實現(xiàn)流圖發(fā)送包含WM_FIRST和用戶名的 CMessage的對象調(diào)用 CClientSocket的 Connect建立連接添加用戶名稱,調(diào)用CClientDlg:ConnectSocket啟動應(yīng)用程序發(fā)送包含WM_FIRST和用戶名的 CMessage的對象調(diào)用 CClientSocket的 Connect建立連接添加用戶名稱,調(diào)用CClientDlg:ConnectSocket啟動應(yīng)用程序CClientSocket:OnReceive()接收到數(shù)據(jù)包客戶端的啟動和嘗試建立連接的過程CClientSocket:OnReceive()接收到數(shù)據(jù)包CclientSocketDoc:ProcessPengingRead()CclientSo

溫馨提示

  • 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

提交評論