

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 本科畢業(yè)設計</b></p><p><b> ?。?0 屆)</b></p><p> 網絡多人聊天系統(tǒng)的設計與實現</p><p> 所在學院 </p><p> 專業(yè)班級 通信工程
2、 </p><p> 學生姓名 學號 </p><p> 指導教師 職稱 </p><p> 完成日期 年 月 </p><p><b> 摘 要</b>&l
3、t;/p><p> 網絡多人聊天系統(tǒng),屬于即時通訊的范疇,是一種能為多人提供即時交流的聊天平臺。</p><p> 網上聊天系統(tǒng)作為一種方便人與人之間聯系的實用系統(tǒng),為我們的生活和學習帶來了極大的方便,也提高了工作的效率。目前人們交流方式多種多樣,聊天軟件憑其友好的外觀、使用的便利等特點博得現代人的青睞。</p><p> 本畢業(yè)設計論文介紹以C++語言設計和實現
4、一個網絡聊天系統(tǒng)的過程。本系統(tǒng)采用C/S架構設計,程序主要分為兩部分:客戶端和服務器端??蛻舳藭@示在線的所有成員,服務器提供成員之間的私聊以及群聊功能。程序界面簡潔,布局合理,操作方便。利用Socket網絡開發(fā)技術實現客戶端和服務器端的連接訪問,實現網絡功能;通過對數據流操作的合理設計,實現信息傳遞、接受和數據保存。同時,采用多線程、多任務的設計思想,開發(fā)出性能穩(wěn)定的服務器。完整地實現系統(tǒng)的功能。</p><p&g
5、t; 關鍵字:聊天系統(tǒng);C++ Builder;Socket</p><p><b> Abstract</b></p><p> Network multiplayer chat system, belonging to the scope of Instant Messaging, is a kind of communication platform fo
6、r providing people to instant chat.</p><p> Network chat system as a practical system make the communication between people more convenient and make our living and learning more convenient, also improve wor
7、k efficiency. Presently, there are many ways for people communicate, chatting software, relying on it’s friendly appearance, ease of use and so won the favor of the modern human.</p><p> This graduation the
8、sis of design introduction how to use the C++ language design and carry out network chat room, the system adoption the C/ S structure design, the entire project is divided into client and server, the program interface is
9、 simple, reasonable layout and convenient operation. The client will show all the members online, the server private chat between two members and a group chat. We make use of the Socket technology to interconnect the ser
10、ver and client by net-work ;organize the </p><p> Keywords:Chat;C++ Builder;Socket</p><p><b> 目 錄</b></p><p> 1 引言- 1 -</p><p> 1.1 課題的來源- 1 -</p&
11、gt;<p> 1.2 本課題的目的、內容、要求- 1 -</p><p> 1.2.1 目的- 1 -</p><p> 1.2.2 內容- 2 -</p><p> 1.2.3 要求- 2 -</p><p> 2 系統(tǒng)的開發(fā)和運行環(huán)境- 3 -</p><p> 2.1 C++
12、 Builder6簡介- 3 -</p><p> 2.2 開發(fā)技術的選擇- 3 -</p><p> 3 需求分析- 5 -</p><p> 3.1 項目概述- 5 -</p><p> 3.1.1 產品描述- 5 -</p><p> 3.1.2 產品功能- 5 -</p>&
13、lt;p> 3.2 功能需求- 7 -</p><p> 3.2.1 用戶登錄- 7 -</p><p> 3.2.2 公聊- 7 -</p><p> 3.2.3 私聊- 7 -</p><p> 3.2.4 聊天記錄- 8 -</p><p> 3.2.5 用戶注銷- 8 -</
14、p><p> 3.3 質量性能需求- 9 -</p><p> 3.3.1 容錯性需求- 9 -</p><p> 3.3.2 穩(wěn)定性需求- 9 -</p><p> 3.3.3 軟件設計可靠性- 9 -</p><p> 3.3.4 安全性- 9 -</p><p> 3.3
15、.5 擴展性- 9 -</p><p> 3.3.6 易用性- 9 -</p><p> 4 概要設計- 10 -</p><p> 4.1 目的- 10 -</p><p> 4.2 運行環(huán)境- 10 -</p><p> 4.3 條件與限制- 10 -</p><p>
16、 4.4 網上信息傳播模式- 10 -</p><p> 4.5 C++ Builder中常用的Socket控件- 11 -</p><p> 4.6 程序體系結構- 11 -</p><p> 5 詳細設計- 12 -</p><p> 5.1 設計流程- 12 -</p><p> 5.1.1
17、 客戶端與服務器端之間傳遞的主要消息- 12 -</p><p> 5.1.2 服務器端程序設計流程- 12 -</p><p> 5.1.3 客戶端程序設計流程- 13 -</p><p> 5.2 服務器端程序模塊- 13 -</p><p> 5.2.1 建立連接程序模塊- 13 -</p><p&
18、gt; 5.2.2 服務器監(jiān)聽模塊- 16 -</p><p> 5.2.3 服務器端讀取及發(fā)送信息模塊- 19 -</p><p> 5.2.4 斷開連接模塊- 22 -</p><p> 5.3 客戶端程序模塊- 23 -</p><p> 5.3.1 建立連接程序模塊- 23 -</p><p&g
19、t; 5.3.2 輸入交談信息模塊- 26 -</p><p> 5.3.3 客戶端讀取及發(fā)送信息模塊- 27 -</p><p> 5.3.4 斷開連接模塊- 28 -</p><p> 6 系統(tǒng)測試- 30 -</p><p> 7 結論- 36 -</p><p> 致 謝錯誤!未定義書
20、簽。</p><p> 參考文獻- 37 -</p><p><b> 1 引言</b></p><p><b> 1.1 課題的來源</b></p><p> 信息化是目前世界發(fā)展的局勢,是推動經濟社會變革的重要力量。大力推進信息化,是覆蓋我國現代化建設全局的戰(zhàn)略舉措,是貫徹落實科學發(fā)展
21、觀、全面建設小康社會、構建社會主義和諧社會和建設創(chuàng)新型國家的迫切需求和必然選擇。</p><p> 而作為信息傳遞的一個重要平臺,互聯網扮演著舉足輕重的角色。網絡聊天工具,作為一種方便、即時的信息交流方式,漸漸地受到越來越多人的青睞。同時,各種各樣的網絡聊天服務程序也大量出現,比較著名的有NetMeeting、OICQ、ICQ、MSN-Messenger,以及國內最流行的騰訊QQ等[1]。騰訊無疑是國內即時通訊
22、市場的霸主,自從99年進入即時通訊領域并迅速占市場之后,其在國內用戶數量始終高居榜首,即使近幾年面對微軟MSN的強大攻勢,騰訊QQ的時常占有率依然穩(wěn)步增長。騰訊的成功與其對QQ的不斷創(chuàng)新和完善是分不開的。</p><p> 網絡聊天室也是屬于即時通信軟件的范疇,在網絡應用中出現的較早。網絡聊天室以其特有的多人即時聊天方式被大家喜歡,很多時候能給使用者們在工作或學習中帶來更高的效率。其開發(fā)技術和設計思想都已經得到
23、成熟的發(fā)展,并且已經具有許多成功的案例[2]。在開發(fā)技術上已經沒有什么技術難題,并且具有廣泛的應用和市場空間。目前,國內各大門戶網站都架設了大型聊天室。如:新浪聊天室、中華網社區(qū)聊天室、搜狐等都成為網民們的熱門聊天室。</p><p> 1.2 本課題的目的、內容、要求</p><p><b> 1.2.1 目的</b></p><p>
24、 網絡聊天室是一項應用廣泛,并且實用性強的一個應用,雖然其功能簡單,但是在其開發(fā)技術和過程中,能夠充分學習和使用C++的技術,開發(fā)各界面,包括登入、注冊、注銷、公聊、私聊等界面;實現網絡的功能使用,包括通信協議、網絡端口等[3]。并且在開發(fā)過程當中,能充分的使用和體會面向對象技術的原理和方法。</p><p> 所以該項目可以使自己在C++技術方面得到全面應用,使自己項目開發(fā)能力的一個很好體現。</p&g
25、t;<p><b> 1.2.2 內容</b></p><p> 一個網絡多人聊天室,必須有一個穩(wěn)定的服務器,以及客戶的的登錄端。</p><p> 客服端要具有用戶連接、登錄等功能,在登入成功后,要顯示出公聊界面,在新用戶上線和用戶下線時要更新每個客戶端在線用戶列表名,并且可以和在線的用戶實現一對一的私聊功能。</p><p&
26、gt; 在服務器端實現不斷的監(jiān)聽客戶的連接,并且根據客戶端發(fā)送過來的不同信息,如登入信息、公聊信息、私聊信息、退出信息等,服務器端要作出不同的響應。</p><p><b> 1.2.3 要求</b></p><p> 利用TServerSocket和TClientSocket兩個控件,創(chuàng)建網上多用戶聊天的程序,創(chuàng)建的應用程序實現了目前市場上一些商用對話程序的大
27、部分功能,如廣播和對多個用戶選擇性發(fā)送消息、允許用戶選擇自己喜歡的服務器等。在代碼的編寫上要充分體現C++面向對象開發(fā)思想和多態(tài)性,提高代碼的重用性和高效性。</p><p> 2 系統(tǒng)的開發(fā)和運行環(huán)境</p><p> 2.1 C++ Builder6簡介</p><p> Borland 公司在推出 DOS環(huán)境下的C語言編譯器 Turbo C 及Turbo
28、 C++后成為第二個在PC領域推出商業(yè)化C++的編譯器廠商?,F今的Borland C++ Builder 是一種快速應用程序開發(fā)(RAD,Rapid Application Development)工具,基于面向對象的C++語言。可以說,C++ Builder是集C++語言的高效性和RAD開發(fā)工具的快速性等優(yōu)點完美結合的產物,也是基于Pascal 程序設計語言的Delphi強大功能的合理擴展。用戶可以利用C++ Builder 提供的I
29、DE(Integrated Development Environment)開發(fā)環(huán)境來幫助完成整個應用程序的設計,而不需要再依靠其他工具,以便使程序開發(fā)環(huán)境能夠簡單一致,提高整體的工程開發(fā)效率??傊?,C++ Builder 是一種全新的軟件開發(fā)工具,它的優(yōu)點是不言而喻的。</p><p> 2.2 開發(fā)技術的選擇</p><p> 本課題用TServerSocket控件處理客戶端發(fā)來的
30、socket連接。Active屬性決定程序運行后,該組件是否馬上啟動服務器套接字進行監(jiān)聽。ServiceType決定了與服務器的鏈接是非阻塞還是為每個連接創(chuàng)建一個線程。Service屬性決定了該服務器組件提供什么服務。常見的服務有FTP、WWW、SMTP、HTTP等,不過設置了端口屬性,就不需要設置此屬性了。</p><p> TClientSocket控件是一個簡單的套接字(socket)組件,使用這個控件可
31、以實現與服務器建立連接并完成簡單的套接字通信。除此之外,使用此控件還可以按照流的方式發(fā)送數據給服務器,輕松地完成表中數據的傳送。</p><p> Socket是一種用于表達兩臺機器之間連接“終端”的軟件抽象。對于一個給定的連接,在每臺機器上都有一個Socket,可以想象一個虛擬的"電纜"工作在兩臺機器之間,“電纜”插在兩臺機器的Socket上[4]。</p><p>
32、; 簡單的說,一臺計算機上的socket同另一臺計算機通話創(chuàng)建一個通信信道,程序員可以用這個信道在兩臺機器之間發(fā)送數據。當你發(fā)送數據時,TCP/IP協議棧的每一層都給你的數據里添加適當的報頭。socket像電話聽筒一樣在電話的任意一端,兩人通過一個專門的信道來進行通話和接聽。會話將一直進行下去直到兩人決定掛斷電話,否則各自的電話線路都會占線[4]。</p><p> TCP和UDP扮演同樣的角色,但是實現是不
33、同的。兩者都接收傳輸協議數據包并把它們傳遞到表示層。TCP把信息分解成數據包(datagrams)并在接收端重新組裝起來。它還對丟失的數據包進行重新傳輸的請求。TCP減少了上層的擔憂。UDP沒有組裝和重傳請求的功能。它只是傳輸數據包。更高層的層必須確保信息的完整性以及組合順序的正確性。</p><p><b> 3 需求分析</b></p><p><b>
34、; 3.1 項目概述</b></p><p> 3.1.1 產品描述</p><p> 一個操作簡單、界面友好、運行穩(wěn)定的網絡聊天室對于小型局域網內的用戶可以起到很好的交流作用。本聊天室是一個可以讓許多用戶同時互相通信的網上園地,個人用戶可以通過網上聊天室將自己融入整個主流社會中。由于目前上網的一般都是具有高學歷的新一代創(chuàng)業(yè)者,因此,在網上聊天室這個虛擬的社會中,可以結交
35、各層次各地方的朋友,從而為自己獲取更多的知識和更多的閱歷。人們日常生活中越來越多地使用這項新的技術來為自己的工作和學習服務。</p><p> 該聊天室是為許多喜愛上網聊天的朋友開發(fā)設計的,希望能在現有的眾多聊天室中給大家多一種的選擇。和許多大型的網絡聊天室相比該聊天室比較簡單,但能實現聊天的基本功能,點對多聊天,點對點聊天等,基于時間和技術的原因,很遺憾傳送文件的功能尚未實現。本聊天室主要由登錄界面、聊天室界
36、面、私聊界面、查看聊天內容界面等構成。整個設計簡潔明了、實用,使用簡單。</p><p> 3.1.2 產品功能</p><p> 本項目具有以下主要功能</p><p><b> 客戶端:</b></p><p> 1 用戶登錄功能,實現用戶登錄服務器,自定義昵稱。</p><p>
37、 2 群聊功能,實現用戶與在線所有成員聊天方式。</p><p> 3 私聊功能,實現用戶與在線成員一對一的聊天方式。</p><p> 4 查看聊天記錄,實現用戶查看歷史聊天內容。</p><p><b> 服務端:</b></p><p> 1 可以不斷地監(jiān)聽來自客戶端的連接請求</p>
38、<p> 2 顯示用戶的登錄信息</p><p> 3 顯示用戶的注銷信息</p><p> 根據上述功能,得到如圖3-1的系統(tǒng)功能模塊圖。</p><p> 圖3-1 網絡多人聊天系統(tǒng)功能模塊圖</p><p><b> 3.2 功能需求</b></p><p>
39、3.2.1 用戶登錄</p><p> 需求描述:用戶填寫主機名和昵稱,進入聊天室主界面</p><p><b> 執(zhí)行者:用戶</b></p><p><b> 前置條件:無</b></p><p><b> 后置條件:無</b></p><p&g
40、t;<b> 正常過程:</b></p><p> 1 向服務器發(fā)送連接請求。</p><p> 2 返回客戶端一個響應,提示登錄成功,彈出聊天界面。</p><p> 3 刷新其他在線用戶的用戶列表信息。</p><p><b> 3.2.2 公聊</b></p>&
41、lt;p> 需求描述:用戶在聊天室公聊界面的發(fā)言內容,聊天室中的其他在線用戶可以正常接受并正確顯示(包括發(fā)送的表情和用戶設置的字體顏色)。</p><p><b> 執(zhí)行者:登入用戶</b></p><p> 前置條件:用戶登錄成功</p><p><b> 后置條件:無</b></p><
42、;p><b> 正常過程:</b></p><p> 1 客戶端用戶登入成功后,啟動客戶端功能線程。</p><p> 2 客戶端將用戶發(fā)送的信息打包傳送給服務端。</p><p> 3 服務端進行數據分析后,并將用戶的信息進行正確的處理。</p><p> 4 傳給處在聊天室的所有在線其他用戶并
43、正常顯示。</p><p><b> 3.2.3 私聊</b></p><p> 需求描述:用戶可選擇聊天室的在線用戶列表中其他用戶聊天。并且對方有消息提示,雙方發(fā)送的信息對于聊天室的其他用戶是不可見的。</p><p><b> 執(zhí)行者:用戶</b></p><p> 前置條件:用戶登錄成
44、功,私聊的對方在線</p><p><b> 后置條件:無</b></p><p><b> 正常過程:</b></p><p> 1 客戶端與服務端建立通訊。</p><p> 2 客戶端將用戶發(fā)送的信息打包傳送給服務端。</p><p> 3 服務端進行數
45、據分析,將用戶的信息傳給目的用戶。</p><p> 4 目的用戶收到服務器的信息后,正確的顯示并保存。</p><p> 3.2.4 聊天記錄</p><p> 需求描述:用戶可以查詢聊天的歷史紀錄,包括公聊記錄和私聊記錄。</p><p><b> 執(zhí)行者:用戶</b></p><p&g
46、t; 前置條件:用戶正確登入后</p><p><b> 后置條件:無</b></p><p><b> 正常過程:</b></p><p> 1 發(fā)送、接收信息的同時將信息保存在本地文件中。</p><p> 2 信息發(fā)送框中可以查詢歷史聊天記錄。</p><p&
47、gt; 3 從本地文件中讀取信息,并顯示在記錄顯示匡中。</p><p> 3.2.5 用戶注銷</p><p> 需求描述:用戶在正常情況下退出聊天室。</p><p><b> 執(zhí)行者:用戶</b></p><p> 前置條件:用戶成功登錄聊天室</p><p><b>
48、 后置條件:無</b></p><p><b> 正常過程:</b></p><p> 1 向服務器發(fā)送用戶登出消息。</p><p> 2 服務器進行用戶退出的數據處理。</p><p> 3 服務器向聊天室其他用戶發(fā)送登出消息。</p><p> 3.3 質量性能
49、需求</p><p> 3.3.1 容錯性需求</p><p> 當出現代碼異常時,出現正確的提示,不會影響整個系統(tǒng)的運行。用戶之間信息傳輸不會因為數據封裝問題出現丟失或亂碼。因用戶的誤操作產生的異常應做出及時的處理或信息提示。</p><p> 3.3.2 穩(wěn)定性需求</p><p> 軟件應正常完成所有功能需求。服務器端應長時間運
50、行無故障,故障修復時間一般控制在3小時內,除非出現惡性攻擊、病毒破壞、系統(tǒng)資源不足、硬件故障、操作系統(tǒng)或數據庫系統(tǒng)崩潰網絡中斷等情況,要求系統(tǒng)連續(xù)運行一周,不允許出現內存泄露。要求系統(tǒng)可以承受告警風暴和大數據量的沖擊,不出現內存溢出等現象。</p><p> 3.3.3 軟件設計可靠性</p><p> 要確定合適的模塊粒度,各模塊之間要求松耦合,高內聚;從而使整個系統(tǒng)的可靠性和穩(wěn)定性
51、得到提高,并且便于系統(tǒng)維護,和新模塊的添加。</p><p><b> 3.3.4 安全性</b></p><p> 安全性是防止網絡方面的攻擊</p><p><b> 3.3.5 擴展性</b></p><p> 系統(tǒng)建成后,應在現行系統(tǒng)上不需要做大的改動或不影響整個系統(tǒng)結構,就可以增加
52、功能模塊,這就必須在系統(tǒng)設計時留有接口,使其具有可擴展性和維護性。</p><p><b> 3.3.6 易用性</b></p><p> 系統(tǒng)操作的界面必須簡潔、操作方便易用、設計合理</p><p><b> 4 概要設計</b></p><p><b> 4.1 目的<
53、/b></p><p> 該階段目的在于明確網絡聊天室系統(tǒng)的軟件總體結構,各個軟件模塊的功能說明,系統(tǒng)運行配置與應用方式以及使用的關鍵技術。</p><p><b> 4.2 運行環(huán)境</b></p><p> 系統(tǒng)的開發(fā)環(huán)境為C++ Builder6,測試和運行環(huán)境為Windows Vista,2GB內存。</p>
54、<p><b> 4.3 條件與限制</b></p><p> 軟件設計應當表現出層次結構,它應巧妙地利用各個軟件部件之間的控制關系。設計應當是模塊化的,即該軟件應當從邏輯上被劃分成多個部件,分別實現各種特定功能和子功能。設計最終應當給出具體的模塊(例如子程序或過程),這些模塊就具有獨立的功能特性。應當應用在軟件需求分析期間得到的信息,采取循環(huán)反復的方法來獲得設計。</p
55、><p> 4.4 網上信息傳播模式</p><p> 根據信息接收用戶數目的不同,可以將網上信息傳播模式分成廣播、多播和單播三中模式[5]。</p><p> 廣播即把信息傳送給所有已連接用戶。在這種模式下,如果向各個用戶逐個發(fā)送消息,網絡開銷就非常大。在實際應用中,為了節(jié)約網絡資源,提高效率,一般要先根據用戶IP地址將其分組,然后對每個分組只發(fā)送一條信息到該分
56、組對應的服務器,然后再由該服務器在其對應的局域網內進行廣播。廣播模式因為需要消耗大量網絡資源,一般用于傳輸系統(tǒng)信息[6]。</p><p> 多播即只對多個用戶而不是所有用戶傳送消息。在接收用戶數目較少時,可以采用逐個發(fā)送的方式;在接收用戶數目較大時,也需要采用廣播模式中類似的分組方式以節(jié)約網絡資源。在多播模式下,未分組前需要再傳送信息的頭部添加上墓地IP地址列表,分組后海需要添加分組傳送墓地服務器的IP地址,
57、傳送到服務器后由服務器取出下級地址列表進行多播。多播模式常用于網絡會議[7]。</p><p> 單播是多播的一種特例,只將信息發(fā)送給一個單獨的用戶。因此,在這種模式下不需要對用戶進行分組,直接將目的IP地址添加在信息頭部即可發(fā)送。網絡聊天中的單了就是采用這種模式。</p><p> 4.5 C++ Builder中常用的Socket控件</p><p> 一
58、個IP地址和一個端口號的組合稱為一個套接字(Socket),一個套接字可以唯一地標識整個Internet中的一個網絡進程[8]。屬于套接字和端口號有時是可以互相轉換的,實際上,知名服務器經常稱為知名套接字。一對套接字,一個用于接收主機,另一個用于發(fā)送主機,可以定義面向連接協議的一次連接[9]。網絡聊天客戶端和服務端要進行消息相互傳遞,就必須先通過Socket來建立網絡連接,在C++ Builder中有兩個常用的Socket控件Clien
59、tSocket和ServerSocket,他們封裝了WinSocketAPI函數[10],可以用于建立客戶端和服務端的Socket連接。</p><p> 4.6 程序體系結構</p><p> 本程序采用Client/Server體系結構,即客戶機服務器客戶端體系結構。C/S結構廣泛應用于構造數據庫系統(tǒng),它包括連接在一個網絡中的多臺計算機。處理應用程序并請求另一臺計算機服務的計算機稱
60、為客戶機,處理數據庫的計算機稱為服務器[11]。其特點是客戶端只裝載應用軟件,而把數據庫放在服務器上,這樣就可以使客戶端不需要存儲數據,從而簡化客戶端軟件。</p><p> 借鑒這種設計思路,本課題也采用C/S結構。聊天服務器專門用于監(jiān)控用戶狀態(tài)和轉發(fā)消息,當客戶端進行多播或廣播時,客戶端只需把接收消息的用戶序列和消息文本發(fā)送到服務器,然后由服務器轉發(fā)到各個用戶,而不需要向每個用戶建立連接后發(fā)送消息,這樣就大
61、大減輕了客戶端的任務[12]。</p><p><b> 5 詳細設計</b></p><p><b> 5.1 設計流程</b></p><p> 5.1.1 客戶端與服務器端之間傳遞的主要消息</p><p><b> 客戶端向服務器端:</b></p>
62、<p> 1 登錄時將用戶昵稱傳給服務器。</p><p> 2 在廣播模式下發(fā)送消息時將消息正文直接傳送給服務器。</p><p> 3 在多播模式下發(fā)送消息時將目的用戶名序列附加在消息正文前,并且在</p><p> 用戶名序列前加上多播標記后將整個字符串作為消息傳送給服務器。</p><p><b>
63、; 服務器端向客戶端:</b></p><p> 1 用戶登錄時向用戶發(fā)送歡迎信息,并在歡迎信息后面附加已經登錄的用</p><p><b> 戶名序列。</b></p><p> 2 用戶登錄時向其他所有已登錄用戶發(fā)出通知。</p><p> 3 收到用戶的廣播消息則向所有登錄用戶轉發(fā)消息。
64、</p><p> 4 收到用戶的多播消息則向用戶列表中的用戶轉發(fā)消息。</p><p> 5 有用戶注銷時向所有在線用戶發(fā)出通知。</p><p> 5.1.2 服務器端程序設計流程</p><p> 按照服務器打開到關閉的順序,服務器端程序設計流程如下:</p><p> 1 打開服務器,使其處于監(jiān)
65、聽狀態(tài)。</p><p> 2 某用戶登錄,顯示歡迎信息,并將在線用戶列表發(fā)送給該用戶,在日志列表中記錄該用戶的登錄信息,將該用戶調價到在線用戶列表中。</p><p> 3 轉發(fā)消息:有用戶發(fā)送廣播消息,則向所有用戶轉發(fā)該消息;若是發(fā)送多播消息,則只對目的用戶轉發(fā)。</p><p> 4 某用戶注銷,則向所有在線用戶發(fā)送通知,在日志列表中記錄該用戶的注
66、銷信息并從登錄用戶列表中將該用戶刪除。</p><p> 5 所有用戶注銷,服務器可正常關閉,若仍有在線用戶,則關閉前詢問是否真的要關閉。</p><p> 5.1.3 客戶端程序設計流程</p><p> 按照用戶從登錄到注銷的順序,客戶端程序設計流程如下:</p><p> 連接服務器,把用戶昵稱發(fā)送給服務器,建立連接</
67、p><p> 接收服務器消息,對不同的消息采用不同的處理方法:</p><p> ?、?收到服務器歡迎登錄喜愛系,從中提取出已登錄用戶列表,并逐個添加到用戶列表中。</p><p> ?、?收到用戶發(fā)送來的消息,顯示在消息框中。</p><p> ?、?收到其他用戶注銷的消息,從用戶列表中刪除該用戶。</p><p>
68、 發(fā)送消息,對不同的消息發(fā)送方式采用不同的處理方法:</p><p> ?、?廣播消息,則直接將消息發(fā)送給服務器。</p><p> ?、?多播消息,首先在消息正文前添加目的用戶名序列,然后再將多播消息標志添加到用戶名序列前。</p><p><b> 斷開連接。</b></p><p> 5.2 服務器端程序模塊&
69、lt;/p><p> 5.2.1 建立連接程序模塊</p><p> 1.相關成員函數和變量的定義</p><p> 在窗體的頭文件chatserveru.h中,加入如下代碼。(為節(jié)省篇幅,沒有列出C++ Builder自動產生的代碼)。</p><p> enum ServerStatus {SS_NOT_RUNNING, SS_RUN
70、NING};</p><p> enum LogEntryType {LET_WARNING, LET_ERROR, LET_SIGNON, LET_SIGNOFF};</p><p> enum ServerNotification {SN_LOGON, SN_LOGOFF, SN_PUBLIC_MSG,SN_PRIVATE_MSG};</p><p> #
71、define CHAT_SERVER_PORT 5790</p><p> private:// User declarations</p><p> ServerStatus CurrentServerStatus;</p><p> void SetServerStatus(ServerStatus _serverstatus);</p>
72、<p> public:// User declarations</p><p> __fastcall TChatServerForm(TComponent* Owner);</p><p> 在上述代碼中,首先定義了三個枚舉類型來增加程序的可讀性。第一個ServerStatus用于表示服務器當前的狀態(tài),因為在程序中,服務器只有兩種狀態(tài),一種是運行,另一種是沒有運行,
73、因此兩個可能的枚舉值分別為SS_NOT_RUNNING何SS_RUNNING;第二個枚舉類型是LogEntryType,在程序中我們用它來調用函數以便在服務器日志中增加一條日志信息。所有可能的類型包括警告、錯誤、登錄提示和注銷提示;第三個枚舉類型是ServerNofificafion,它用來發(fā)送服務器必須處理的事件,這種事件包括登錄、注銷、廣播消息和多播消息。我們通過將每個可能的狀態(tài)和提示用相應的枚舉類型來表示,就可以創(chuàng)建一個中心程序,
74、并減少程序中重復的代碼。</p><p> 變量CurrentServerStatus用于保存服務器的狀態(tài),并驗證“開始/停止”菜單項,函數 SetServerStatus用來設置該變量。</p><p> 2 在窗體的構造函數中初始化變量</p><p> 在chatserveru.spp文件中,在窗體的構造函數中加入如下代碼,用于設置變量的初始值。<
75、/p><p> __fastcall TChatServerForm::TChatServerForm(TComponent* Owner)</p><p> : TForm(Owner)</p><p><b> {</b></p><p> CurrentServerStatus = SS_NOT_RUNNING
76、;</p><p> MainServerSocket->Port = CHAT_SERVER_PORT;</p><p><b> }</b></p><p> 在上述代碼中,首先將表示服務器狀態(tài)的CurrentServerStatus變量設置成SS_NOT_RUNNING,表示服務器沒有進入監(jiān)聽狀態(tài)。</p>&l
77、t;p><b> 3 啟動服務器</b></p><p> 單擊“開始”菜單,創(chuàng)建次菜單的OnClick時間相應函數,在其中加入如下代碼。</p><p> void __fastcall TChatServerForm::StartStopServerClick(TObject *Sender)</p><p><b>
78、 {</b></p><p> switch(CurrentServerStatus)</p><p><b> {</b></p><p> case SS_NOT_RUNNING:</p><p><b> {</b></p><p> MainS
79、erverSocket->Open();</p><p> SetServerStatus(SS_RUNNING);</p><p> AddLogEntry(LET_WARNING, "服務器已啟動");</p><p> StartStopServer->Caption = "停止";</p>
80、<p><b> break;</b></p><p><b> }</b></p><p> case SS_RUNNING:</p><p><b> {</b></p><p> MainServerSocket->Close();</
81、p><p> SetServerStatus(SS_NOT_RUNNING);</p><p> AddLogEntry(LET_WARNING, "服務器已停止");</p><p> StartStopServer->Caption = "開始";</p><p><b> br
82、eak;</b></p><p><b> }</b></p><p><b> }</b></p><p> UpdateStatusBar();</p><p><b> }</b></p><p> 在上述時間相應函數中,首先
83、判斷CurrentServerStatus變量值。如果CurrentServerStatus變量等于SS_NOT_RUNNING,表示服務器套接字沒有啟動,這時就調用MainServerSocket組件的Open方法,啟動套接字,使服務器進入監(jiān)聽狀態(tài),調用Open方法等同于將該組件的Active屬性設置為true,然后調用SetServerStatus函數將CurrentServerStatus變量設置成SS_RUNNING,接著調用A
84、ddLogEntry函數,在服務器窗口中顯示服務器已啟動,并在開始菜單顯示“停止”。</p><p> 如果CurrentServerStatus變量等于SS_RUNNING,表示服務器套接字已經啟動,這時候調用MainServerSocket組件的Close方法,關閉套接字,調用Close方法等同于將該組件的Active屬性設置false,然后調用SetServerStatus函數將CurrentServer
85、Status變量設置成SS_NOT_RUNNING,接著調用AddlogEntry函數,在服務器窗口中顯示服務器已停止,并在開始菜單顯示“開始”。</p><p> 最后通過調用UpdateStatusBar函數,在狀態(tài)欄上現實有多少個用戶連接。</p><p><b> 4 相應客戶的連接</b></p><p> 當客戶連接到服務器上
86、時,觸發(fā)TServerSocket的OnClientConnect時間。在對象監(jiān)視器中雙擊MainServerSocket的OnClientConnect事件,創(chuàng)建此事件相應函數,在其中加入如下代碼。</p><p> void __fastcall TChatServerForm::MainServerSocketClientConnect(TObject *Sender,</p><p&
87、gt; TCustomWinSocket *Socket)</p><p><b> {</b></p><p> Socket->Data = 0;</p><p> AddConnectionToListView(Socket);</p><p> UpdateStatusBar();</p&g
88、t;<p><b> }</b></p><p> 每當一個客戶請求連接時就激活TServerSocket控件的OnClientConnect事件。在該事件中,我們啟動一個包含Windows套接字的TCustomWinSocket對象。然后初始化此對象的數據成員,使它在以后使用時成為一個已知的數值,在這種情況下應保證它的Data為0,TCustomWinSocket的成員變
89、量Data對于創(chuàng)建多線程網絡程序非常有用。接下來我們調用AddConnectionToListView在列表中添加一個新的連接。最后我們調用UpdatStatusBar函數來更新服務器的狀態(tài)欄,表明有一個新的客戶連接。</p><p> 至此,服務器打開后有用戶連接上時,才真正建立了服務器和客戶端的連接。</p><p> 5.2.2 服務器監(jiān)聽模塊</p><p&
90、gt; 1 相關成員函數的定義</p><p> 在窗體的頭文件chatserveru.h中,加入如下代碼。</p><p> private:// User declarations</p><p> ServerStatus CurrentServerStatus;</p><p> void SetServerStatus(
91、ServerStatus _serverstatus);</p><p> void AddConnectionToListView(TCustomWinSocket *ClientSocket);</p><p> void RemoveConnectionFromListView(TCustomWinSocket *Socket);</p><p> vo
92、id UpdateStatusBar(bool DecUse = false);</p><p> void AddLogEntry(LogEntryType let, AnsiString EntryText);</p><p> void SetUserBySocket(TCustomWinSocket *Socket, const AnsiString &UserNick
93、Name);</p><p> void GetUserBySocket(TCustomWinSocket *Socket, AnsiString &UserNickName);</p><p> int GetSocketNoByUser(AnsiString User);</p><p> TListItem * ListItemBySocket(
94、TCustomWinSocket *Socket);</p><p> EntryTypeToText函數用于將入口類型轉變?yōu)槿肟谛畔⑽谋尽?lt;/p><p><b> 2 監(jiān)聽內容</b></p><p> 服務器打開后,就處于監(jiān)聽狀態(tài),主要監(jiān)聽內容有以下幾項:</p><p> ?、?用戶登錄,將其用戶名加到已登
95、錄用戶列表</p><p> void TChatServerForm::AddConnectionToListView(TCustomWinSocket *ClientSocket)</p><p><b> {</b></p><p> //客戶第一個要發(fā)送的就是他的綽號</p><p> AnsiStrin
96、g UserNickName = "未知";</p><p> TListItem *TempItem = ConnectionsListView->Items->Add();</p><p> TempItem->Caption = UserNickName;</p><p> TDateTime CurrentDT(T
97、DateTime::CurrentDateTime());</p><p> TempItem->SubItems->Add(ClientSocket->RemoteHost);</p><p> TempItem->SubItems->Add(CurrentDT);</p><p> TempItem->Data = Cl
98、ientSocket;</p><p><b> }</b></p><p> ?、?將用戶登錄信息加入日志列表</p><p> void TChatServerForm::AddLogEntry(LogEntryType let, AnsiString EntryText)</p><p><b>
99、{</b></p><p> TListItem *item = LogEntryListView->Items->Add();</p><p> AnsiString entrytype;</p><p> EntryTypeToText(let, entrytype);</p><p> item->
100、Caption = entrytype;</p><p> item->SubItems->Add(EntryText);</p><p> item->SubItems->Add(TDateTime::CurrentDateTime());</p><p><b> }</b></p><p&
101、gt; void EntryTypeToText(LogEntryType let, AnsiString &text)</p><p><b> {</b></p><p> switch(let)</p><p><b> {</b></p><p> case LET_WAR
102、NING:</p><p><b> {</b></p><p> text = "提示";</p><p><b> break;</b></p><p><b> }</b></p><p> case LET_ERRO
103、R:</p><p><b> {</b></p><p> text = "錯誤";</p><p><b> break;</b></p><p><b> }</b></p><p> case LET_SIGNON:
104、</p><p><b> {</b></p><p> text = "登錄";</p><p><b> break;</b></p><p><b> }</b></p><p> case LET_SIGNOFF:&
105、lt;/p><p><b> {</b></p><p> text = "注銷";</p><p><b> break;</b></p><p><b> }</b></p><p><b> default:&l
106、t;/b></p><p><b> {</b></p><p> text = "未知";</p><p><b> break;</b></p><p><b> }</b></p><p><b> }
107、</b></p><p><b> }</b></p><p> ⑶ 用戶注銷,將其用戶名從已登錄用戶列表中刪除</p><p> void TChatServerForm::RemoveConnectionFromListView(TCustomWinSocket *Socket)</p><p>&
108、lt;b> {</b></p><p> TListItem *item = ListItemBySocket(Socket);</p><p><b> if (item)</b></p><p> ConnectionsListView->Items->Delete(item->Index);&l
109、t;/p><p><b> }</b></p><p> TListItem * TChatServerForm::ListItemBySocket(TCustomWinSocket *Socket)</p><p><b> {</b></p><p> for (int i = 0; i &
110、lt;ConnectionsListView->Items->Count; i++)</p><p><b> {</b></p><p> if (reinterpret_cast<TCustomWinSocket *>(ConnectionsListView->Items->Item[i]->Data) == Soc
111、ket)</p><p><b> {</b></p><p> return ConnectionsListView->Items->Item[i];</p><p><b> }</b></p><p><b> }</b></p><
112、;p> return NULL;</p><p><b> }</b></p><p><b> ?、?更新狀態(tài)欄顯示</b></p><p> void TChatServerForm::UpdateStatusBar(bool DecUse/* = false*/)</p><p>
113、<b> {</b></p><p> switch(CurrentServerStatus)</p><p><b> {</b></p><p> case SS_NOT_RUNNING:</p><p><b> {</b></p><p&g
114、t; ChatServerStatusBar->SimpleText = "選擇開始菜單進入聊天";</p><p><b> break;</b></p><p><b> }</b></p><p> case SS_RUNNING:</p><p><b
115、> {</b></p><p> if (DecUse)</p><p> ChatServerStatusBar->SimpleText = IntToStr(MainServerSocket->Socket->ActiveConnections - 1) + "個客戶已連接";</p><p><
116、;b> else</b></p><p> ChatServerStatusBar->SimpleText = IntToStr(MainServerSocket->Socket->ActiveConnections) + "個客戶已連接";</p><p><b> break;</b></p>
117、;<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 5.2.3 服務器端讀取及發(fā)送信息模塊</p><p> 1 相關成員函數和變量的定義</p><p>
118、 在窗體的頭文件chatserveru.h中,加入如下代碼。</p><p> private:// User declarations</p><p> ServerStatus CurrentServerStatus;</p><p> void SetServerStatus(ServerStatus _serverstatus);</p>
119、;<p> void AddConnectionToListView(TCustomWinSocket *ClientSocket);</p><p> void RemoveConnectionFromListView(TCustomWinSocket *Socket);</p><p> void UpdateStatusBar(bool DecUse = fals
120、e);</p><p> void AddLogEntry(LogEntryType let, AnsiString EntryText);</p><p> void SetUserBySocket(TCustomWinSocket *Socket, const AnsiString &UserNickName);</p><p> void Get
121、UserBySocket(TCustomWinSocket *Socket, AnsiString &UserNickName);</p><p> int GetSocketNoByUser(AnsiString User);</p><p> TListItem * ListItemBySocket(TCustomWinSocket *Socket);</p>
122、<p> void BroadcastMessage(AnsiString Message, TCustomWinSocket *ExcludeSocket);</p><p> void MulticastMessage(AnsiString Message, AnsiString UserList); //*!</p><p> void SendNotificati
123、on(ServerNotification sn, AnsiString additional, TCustomWinSocket *ExcludeSocket);</p><p> 2 服務器端讀取及發(fā)送信息程序</p><p> 當合客戶端建立連接護,接下來是TServerSocket組件的OnClientRead事件,當客戶得知他已經成功地與服務器建立連接后,將發(fā)送他希望在繪畫進
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- vb網絡多人聊天系統(tǒng)的設計與實現(論文+源代碼)
- 網絡多人聊天系統(tǒng)的設計與實現【開題報告】
- 畢業(yè)論文---多人聊天室設計
- 網絡多人聊天系統(tǒng)的設計與實現【任務書】
- 畢業(yè)論文:安全聊天系統(tǒng)的設計與實現
- 畢業(yè)論文:安全聊天系統(tǒng)的設計與實現
- android聊天系統(tǒng)畢業(yè)論文--基于android平臺的聊天系統(tǒng)設計與實現
- 畢業(yè)論文-基于java聊天系統(tǒng)設計與實現
- 網絡聊天工具的設計與實現畢業(yè)論文
- 畢業(yè)論文---基于cs架構的java網絡聊天系統(tǒng)的設計與實現
- 畢業(yè)論文---基于cs架構的java網絡聊天系統(tǒng)的設計與實現
- 基于java的聊天系統(tǒng)的設計與實現---畢業(yè)論文
- 畢業(yè)論文-基于java的聊天系統(tǒng)的設計與實現
- 畢業(yè)論文 基于java即時聊天系統(tǒng)的設計與實現
- 基于java的聊天系統(tǒng)的設計與實現---畢業(yè)論文
- 局域網聊天系統(tǒng)的設計與實現-畢業(yè)論文
- 基于java語言的網絡聊天系統(tǒng)開發(fā)與實現畢業(yè)論文
- 基于android平臺的聊天系統(tǒng)設計與實現 畢業(yè)論文
- 基于java即時聊天系統(tǒng)的設計與實現_畢業(yè)論文
- 基于java即時聊天系統(tǒng)的設計與實現_畢業(yè)論文
評論
0/150
提交評論