版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> Linux下基于C++語言開發(fā)的</p><p><b> 即時(shí)通信軟件</b></p><p><b> 摘 要</b></p><p> 網(wǎng)絡(luò)通訊是目前計(jì)算機(jī)用戶進(jìn)行交流最普遍的方式,各種各樣的聊天軟件也層出不窮;服務(wù)提供商也提供了越來越豐富的通訊服務(wù)功能。當(dāng)前中國(guó)的互聯(lián)網(wǎng)技術(shù)已經(jīng)進(jìn)入了一個(gè)
2、飛速發(fā)展的時(shí)期,即時(shí)通訊工具作為當(dāng)今網(wǎng)絡(luò)應(yīng)用的主流,越來越受到了人們的青睞,使人們的網(wǎng)上生活更加豐富多彩。當(dāng)今使用最為廣泛的即時(shí)通信工具,微軟公司的MSN,騰訊公司的 QQ 聊天軟件等為人們的工作和生活帶來很大的便利。特別是對(duì)于騰訊來說,其公司的收益很大部分是歸功于QQ龐大的客戶群,并在此基礎(chǔ)上拓展其他的業(yè)務(wù)。</p><p> 本畢業(yè)設(shè)計(jì)就是模擬 QQ 聊天軟件,開發(fā)一個(gè)包括文字聊天、保存用戶信息等功能的即時(shí)
3、通信軟件。</p><p> 采用 C/S 架構(gòu),基于Linux平臺(tái)開發(fā),采用C++編程語言。由服務(wù)器端和客戶端程序組成。采用ICE中間件,解除服務(wù)器和客戶端的耦合。并使用QT進(jìn)行圖形界面的設(shè)計(jì)。主要實(shí)現(xiàn)的是聊天軟件的部分功能,即文字聊天、保存用戶消息等功能,主要完成的任務(wù)包括服務(wù)器模塊的設(shè)計(jì)、文字聊天,保存用戶信息等功能。通過運(yùn)行、測(cè)試與分析,該多功能聊天軟件運(yùn)行穩(wěn)定、可靠,具有一定的實(shí)用價(jià)值。</p&
4、gt;<p> 關(guān)鍵詞:聊天軟件 文字聊天 Linux平臺(tái) C/S架構(gòu) ICE中間件</p><p> Linux-based instant messaging software </p><p> using C++ language development</p><p><b> Abstract</b>
5、</p><p> Network communication is the computer users to communicate the most common way, all kinds of chat software also emerge in endlessly; Service providers also provide more and more rich communication
6、service functions. The current China's Internet technology has entered a rapid development period, instant communication tools as the network application of mainstream, more and more get the favour of people, make pe
7、ople online life more colorful. The most widely used instant communication tools, Micro</p><p> The graduation design is simulated QQ chat software, the development of a text chat, group chat function of in
8、stant communication software.</p><p> Using C/S structure, based on Linux platform development, the C++ programming language. From the server and client program composition. The ICE middleware, and remove t
9、he server and client coupling. And use QT for the design of the graphical interface. The realization of the main chat software is part of the function, which text chat, the function such as news group, the main task of t
10、he module design, including the server text chat, mass news etc. Function. Through the operation, test and analy</p><p> Keywords: chat software text chat Linux platform C/S ICE</p><p>
11、<b> 1 前言</b></p><p> 1.1 課題研究背景和現(xiàn)狀</p><p> 1.1.1 研究背景</p><p> 21世紀(jì)以計(jì)算機(jī)為代表的信息產(chǎn)業(yè),標(biāo)志著人類社會(huì)進(jìn)入了信息時(shí)代,計(jì)算機(jī)網(wǎng)絡(luò)的研究和發(fā)展。特別是Internet在全球的推廣和應(yīng)用,對(duì)全世界科學(xué)、經(jīng)濟(jì)和社會(huì)產(chǎn)生了重大影響。而網(wǎng)絡(luò)通訊的出現(xiàn)又把全世界各個(gè)
12、地方的人的距離拉得越來越近!隨著互聯(lián)網(wǎng)的普及,具有交互功能的應(yīng)用軟件日益受到親睞,尤其是即時(shí)通訊軟件ICS大受歡迎。163和263網(wǎng)站使用ICS的在線人數(shù)常達(dá)幾萬人,上百萬人同時(shí)出現(xiàn)在騰訊的QQ上。優(yōu)秀的ICS確 實(shí)為天南地北的人們的信息勾通提供了便利,對(duì)提高網(wǎng)站知名度起到了至關(guān)重要的作用, 國(guó)外有的公司甚至把ICS作為支柱軟件推出。</p><p> 1.1.2 研究現(xiàn)狀和發(fā)展趨勢(shì)</p>&
13、lt;p> 自1990s,四位以色列人推出的ICQ后,IM首次出現(xiàn),憑借實(shí)時(shí)在線的交互特性迅速風(fēng)靡全球。如今,IM軟件正逐漸成為一個(gè)集合了文字、視頻、音頻業(yè)務(wù)以及多種增值業(yè)務(wù)的多媒體網(wǎng)絡(luò)通信軟件,憑借其所具有的廉價(jià)性和方便性,以及功能不斷完善,IM已經(jīng)和WWW、Email等一起成為網(wǎng)民們最喜愛的網(wǎng)絡(luò)服務(wù)之一。尤其在國(guó)內(nèi),騰訊QQ普及率遠(yuǎn)高于Email,在部分中國(guó)網(wǎng)民眼中上網(wǎng)基本等價(jià)于使用QQ等。2010年3月5日19時(shí)52分58
14、秒,騰訊QQ同時(shí)在線用戶數(shù)突破了1億。截止到2009年3月18日,QQ官方宣布注冊(cè)賬戶數(shù)量超過8.919億,活躍賬戶數(shù)量超過3.766億。</p><p> 近年來公共互聯(lián)網(wǎng)上的即時(shí)通訊發(fā)展迅猛,并向著未來通信和協(xié)作的主要模式演化。這種演化主要表現(xiàn)為:從文本向話音、視頻和多媒體演化;從固定網(wǎng)絡(luò)向無線移動(dòng)演化;從個(gè)人通信向企業(yè)即時(shí)通信和協(xié)作演化;在體系結(jié)構(gòu)方面,從集中服務(wù)器向?qū)Φ冗B接P2P演化;從專門系統(tǒng)向開放系
15、統(tǒng)演化,推動(dòng)實(shí)現(xiàn)不同系統(tǒng)的互通??傮w看,是從即時(shí)通訊向新一代統(tǒng)一消息演化。</p><p> 1.2 本課題研究的目的和意義</p><p> 即時(shí)通訊(Instant messaging,簡(jiǎn)稱IM)是一個(gè)終端服務(wù),允許兩人或多人使用網(wǎng)絡(luò)即時(shí)地傳遞文字信息、文件、語音與視頻交流。它是一種使人們能在網(wǎng)上識(shí)別在線用戶并與他們實(shí)時(shí)交換消息的技術(shù)。即時(shí)通訊被認(rèn)為比電子郵件更具有自發(fā)性,甚至能
16、在進(jìn)行實(shí)時(shí)文本對(duì)話的同時(shí)瀏覽網(wǎng)上信息。 利用“即時(shí)通訊”工具,用戶間可以實(shí)現(xiàn)異地文字、語言、視頻的實(shí)時(shí)互通;同時(shí),借助即時(shí)通訊工具,還可以幫助企業(yè)提高業(yè)務(wù)協(xié)同性及反饋的敏感度和快捷度。作為使用頻率最高的網(wǎng)絡(luò)軟件,即時(shí)通訊已被認(rèn)為是現(xiàn)代交流方式的新象征。</p><p> 1.3 開發(fā)工具及工具簡(jiǎn)介</p><p> 操作系統(tǒng):Linux操作系
17、統(tǒng)</p><p> 數(shù)據(jù)庫:SQL Server 2000</p><p> 編程語言:C++語言</p><p> 開發(fā)工具:QT編程軟件</p><p> 使用技術(shù):ICE中間件</p><p> 1.3.1 Linux操作系統(tǒng)</p><p> 最早的Fedora Linu
18、x社區(qū)的目標(biāo)是Red Hat Linux制作并發(fā)布第三方的軟件包,然而當(dāng)Red Hat Linux停止發(fā)行后,F(xiàn)edora社區(qū)便集成到Red Hat贊助的Fedora Project,目標(biāo)是開發(fā)出由社區(qū)支持的操作系統(tǒng)Red Hat,Enterprise Linux則取代Red Hat Linux成為官方支持的系統(tǒng)版本。 </p><p> Fedora Core是眾多Linux發(fā)行套件之一。它是一套從Red H
19、at Linux 發(fā)展出來的免費(fèi)Linux 系統(tǒng)。現(xiàn)時(shí)Fedora最新的版本是Fedora16,F(xiàn)edora是Linux發(fā)行版中更新最快的之一,通常每6個(gè)月發(fā)布一個(gè)正式的新版本。 </p><p> Fedora和Red Hat這兩個(gè)Linux的發(fā)行版聯(lián)系很密切。Red Hat自9.0以后,不再發(fā)布桌面版的,而是把這個(gè)項(xiàng)目與開源社區(qū)合作,于是就有了Fedora 這個(gè) Linux 發(fā)行版。Fedora 可以說是R
20、ed hat桌面版本的延續(xù),只不過是與開源社區(qū)合作。</p><p> 1.3.2 數(shù)據(jù)庫SQL Server 2000</p><p> 數(shù)據(jù)庫是依照某種數(shù)據(jù)模型組織起來并存放二級(jí)存儲(chǔ)器中的數(shù)據(jù)集合。這種數(shù)據(jù)集合具有如下特點(diǎn):盡可能不重復(fù),以最優(yōu)方式為某個(gè)特定組織的多種應(yīng)用服務(wù),其數(shù)據(jù)結(jié)構(gòu)獨(dú)立于使用它的應(yīng)用程序,對(duì)數(shù)據(jù)的增、刪、改和檢索由統(tǒng)一軟件進(jìn)行管理和控制。從發(fā)展的歷史看,數(shù)據(jù)
21、庫是數(shù)據(jù)管理的高級(jí)階段,它是由文件管理系統(tǒng)發(fā)展起來的。</p><p> SQL Server 2000 是Microsoft公司推出的SQL Server數(shù)據(jù)庫管理系統(tǒng)的一個(gè)版本。該版本繼承了SQL Server 7.0 版本的優(yōu)點(diǎn)同時(shí)又比它增加了許多更先進(jìn)的功能,具有使用方便,可伸縮性好與相關(guān)軟件集成程度高等優(yōu)點(diǎn),可跨越從運(yùn)行Microsoft Windows 98的膝上型電腦到運(yùn)行Microsoft Wi
22、ndows 2000的大型多處理器的服務(wù)器等多種平臺(tái)使用。</p><p> 1.3.3 開發(fā)語言C++語言</p><p> C++程序設(shè)計(jì)語言是由來自AT&T Bell Laboratories的Bjarne Stroustrup(即本文作者)設(shè)計(jì)和實(shí)現(xiàn)的,它兼具Simula語言在組織與設(shè)計(jì)方面的特性以及適用于系統(tǒng)程序設(shè)計(jì)的C語言設(shè)施。C++最初的版本被稱作“帶類的(C
23、with classes)”[Stroustrup,1980],在1980年被第一次投入使用;當(dāng)時(shí)它只支持系統(tǒng)程序設(shè)計(jì)(§3)和數(shù)據(jù)抽象技術(shù)(§4.1)。支持面向?qū)ο蟪绦蛟O(shè)計(jì)的語言設(shè)施在1983年被加入C++;之后,面向?qū)ο笤O(shè)計(jì)方法和面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)就逐漸進(jìn)入了C++領(lǐng)域。在1985年,C++第一次投入商業(yè)市場(chǎng)[Stroustrup,1986][Stroustrup,1986b]。在1987至1989年間,支持范
24、型程序設(shè)計(jì)的語言設(shè)施也被加進(jìn)了C++[Ellis,1990][Stroustrup,1991]。 </p><p> 隨著若干獨(dú)立開發(fā)的C++實(shí)現(xiàn)產(chǎn)品的出現(xiàn)和廣泛應(yīng)用,正式的C++標(biāo)準(zhǔn)化工作在1990年啟動(dòng)。標(biāo)準(zhǔn)化工作由ANSI(American National Standard Institute)以及后來加入的ISO(International Standards Organization)負(fù)責(zé)。1998
25、年正式發(fā)布了C++語言的國(guó)際標(biāo)準(zhǔn)[C++,1998]。在標(biāo)準(zhǔn)化工作進(jìn)展期間,標(biāo)準(zhǔn)委員會(huì)充當(dāng)了一個(gè)重要的角色,其發(fā)布的C++標(biāo)準(zhǔn)之草案在正式標(biāo)準(zhǔn)發(fā)布之前,一直被作為過渡標(biāo)準(zhǔn)而存在。</p><p> 1.3.4 Qt編程軟件</p><p> Qt是一個(gè)1991年由奇趣科技開發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程式,也可用于開發(fā)非GUI程式,比如控制臺(tái)工具和
26、服務(wù)器。Qt是面向?qū)ο笳Z言,易于擴(kuò)展,并且允許組件編程。2008年,奇趣科技被諾基亞公司收購(gòu),QT也因此成為諾基亞旗下的編程語言工具。在發(fā)布Qt 4.6 的同時(shí),作為 Qt 開發(fā)跨平臺(tái) IDE 的 Qt Creator 也發(fā)布了更新版本。Qt Creator 1.3 和 Qt 4.6共同構(gòu)成的 Qt SDK,包含了開發(fā)跨平臺(tái)應(yīng)用程序所需的全部功能。 Qt Creator是一個(gè)用于Qt開發(fā)的輕量級(jí)跨平臺(tái)集成開發(fā)環(huán)境。Qt Creator可
27、帶來兩大關(guān)鍵益處:提供首個(gè)專為支持跨平臺(tái)開發(fā)而設(shè)計(jì)的集成開發(fā)環(huán)境 (IDE),并確保首次接觸Qt框架的開發(fā)人員能迅速上手和操作。 Qt Creator包含了一套用于創(chuàng)建和測(cè)試基于Qt應(yīng)用程序的高效工具,包括: 一個(gè)高級(jí)的C++代碼編輯器 上下文感知幫助系統(tǒng) 可視化調(diào)試器 源代碼管理 項(xiàng)目和構(gòu)建管理工具 Qt Creator在LGPL2.1版本授權(quán)下有效,并且接受代碼貢獻(xiàn)。</p><p> 1.3.5 ICE
28、中間件</p><p> ZeroC,Inc開發(fā)的Internet Communications Engine ,簡(jiǎn)稱Ice1。其主要設(shè)計(jì)目標(biāo)是: </p><p> ? 提供適用于異種環(huán)境的面向?qū)ο笾虚g件平臺(tái)。 </p><p> ? 提供一組完整的特性,支持廣泛的領(lǐng)域中的實(shí)際的分布式應(yīng)用的開發(fā)。 </p><p> ? 避免不必要
29、的復(fù)雜性,使平臺(tái)更易于學(xué)習(xí)和使用。 </p><p> ? 提供一種在網(wǎng)絡(luò)帶寬、內(nèi)存使用和 CPU 開銷方面都很高效的實(shí)現(xiàn)。 </p><p> ? 提供一種具有內(nèi)建安全性的實(shí)現(xiàn),使它適用于不安全的公共網(wǎng)絡(luò)。 </p><p> 更簡(jiǎn)單地說,Ice 的設(shè)計(jì)目標(biāo)可陳述為: “讓我們構(gòu)建與CORBA 一樣強(qiáng)大的中間件平臺(tái),而又不去犯 CORBA 所犯下的任何錯(cuò)誤”
30、。</p><p> Ice 是一種面向?qū)ο蟮闹虚g件平臺(tái)。從根本上說,這意味著 Ice 為構(gòu)建面向?qū)ο蟮目蛻簦?wù)器應(yīng)用提供了工具、API 和庫支持。 Ice 應(yīng)用適合在異種環(huán)境中使用:客戶和服務(wù)器可以用不同的編程語言編寫,可以運(yùn)行在不同的操作系統(tǒng)和機(jī)器架構(gòu)上,并且可以使用多種網(wǎng)絡(luò)技術(shù)進(jìn)行通信。無論部署環(huán)境如何,這些應(yīng)用的源碼都是可移植的</p><p> 2 即時(shí)通信軟件系統(tǒng)總體設(shè)
31、計(jì)</p><p> 2.1 即使通信系統(tǒng)總體結(jié)構(gòu)及總體需求</p><p> 本系統(tǒng)是一個(gè)即時(shí)通訊程序,目前實(shí)現(xiàn)是在局域網(wǎng)下。本系統(tǒng)分為服務(wù)器和客戶端兩個(gè)應(yīng)用程序,服務(wù)器負(fù)責(zé)管理客戶端,客戶端之間自由通訊。服務(wù)器端和客戶端之間使用TCP協(xié)議進(jìn)行通信。模塊的工作方式如下:</p><p> 圖2-1 服務(wù)器和客戶端工作方式簡(jiǎn)圖</p><
32、;p> 為了開發(fā)出符合要求的網(wǎng)絡(luò)聊天程序,首先必須知道使用者的需求。對(duì)需求的深入理解是開發(fā)工作獲得成功的前提條件,它對(duì)目標(biāo)項(xiàng)目提出完整、準(zhǔn)確、清晰、具體的要求。</p><p><b> 軟件的功能需求:</b></p><p><b> 1、登錄功能。</b></p><p> 2、申請(qǐng)新用戶的功能。<
33、;/p><p> 3、客戶可以通過服務(wù)器轉(zhuǎn)發(fā),實(shí)現(xiàn)一對(duì)一的聊天。</p><p><b> 4、添加好友。</b></p><p><b> 5、刪除好友。</b></p><p> 6、服務(wù)器端可以保存用戶的信息,同時(shí)將信息保存在文件和數(shù)據(jù)庫中。</p><p> 7
34、、客戶端程序可以顯示好友列表。</p><p> 8、應(yīng)該具有易用、穩(wěn)定的圖形界面。</p><p> 9、系統(tǒng)實(shí)現(xiàn)保存聊天記錄的功能。</p><p> 10、發(fā)送系統(tǒng)消息。</p><p> 11、服務(wù)器端保存錯(cuò)誤日志。</p><p> 12、從數(shù)據(jù)庫中讀取保存用戶信息。</p><
35、p> 2.2 總體性能需求分析</p><p> 2.2.1 服務(wù)器端性能需求</p><p> 服務(wù)器需要同時(shí)連接很多個(gè)用戶,并能提供給這些連接用戶所需要的任務(wù)處理請(qǐng)求,這就要求服務(wù)器能同時(shí)處理多個(gè)客戶端連接。</p><p> 服務(wù)器模型一般分為循環(huán)服務(wù)器和并發(fā)服務(wù)器,循環(huán)服務(wù)器一次只能處理一個(gè)連接,也就是說同一時(shí)間只能由一個(gè)用戶連接到服務(wù)器進(jìn)
36、行消息處理,這種情況是不被允許的。</p><p> 因此我們將采用多線程方式的并發(fā)服務(wù)器來設(shè)計(jì)服務(wù)器端,這樣將能從很大程度上提高服務(wù)器的運(yùn)行效率。</p><p> 2.2.2 客戶端端性能需求</p><p> 客戶端只需要連接到服務(wù)器便可以進(jìn)行任務(wù)的處理工作,因此客戶端的主要性能要求為圖形界面運(yùn)行的穩(wěn)定性和對(duì)出錯(cuò)信息的及時(shí)反映。</p>
37、<p> 當(dāng)一個(gè)窗體出現(xiàn)問題時(shí)能夠及時(shí)的處理,讓主程序不受影響。</p><p> 2.2.3 錯(cuò)誤處理需求</p><p> 所有的應(yīng)用程序在運(yùn)行過程中都會(huì)出現(xiàn)出錯(cuò)的情況,這種錯(cuò)誤可能來自于程序本身的BUG也可能是用戶操作的失誤所造成的。當(dāng)有錯(cuò)誤發(fā)生時(shí),我們應(yīng)該有一個(gè)很好的機(jī)制來保障錯(cuò)誤能夠及時(shí)地被排除。</p><p> 因此,當(dāng)應(yīng)用程序出現(xiàn)
38、了錯(cuò)誤的時(shí)候我們就需要程序能提供給我們出錯(cuò)的信息,這樣用戶就能夠很快的找出具體的出錯(cuò)原因,以便尋找合理的途徑去解決它。</p><p><b> 3 程序設(shè)計(jì)方案</b></p><p><b> 3.1 方案比較</b></p><p> 3.1.1 采用TCP方式連接</p><p&g
39、t; TCP方式連接的一個(gè)顯著特點(diǎn)就是需要有服務(wù)器,這種類型的程序通常被稱為客戶機(jī)/服務(wù)器模式。</p><p> 客戶機(jī)/服務(wù)器模型也是一種網(wǎng)絡(luò)模型,它并不是定義了網(wǎng)絡(luò)的層次結(jié)構(gòu),而是描述了一種網(wǎng)絡(luò)程序運(yùn)行的方式。</p><p> 客戶及/服務(wù)器模型將網(wǎng)絡(luò)應(yīng)用程序分為客戶和服務(wù)器兩部分。客戶方對(duì)服務(wù)器方發(fā)送信息請(qǐng)求,服務(wù)器方對(duì)其做出相應(yīng)回答,提供服務(wù)。在TCP/IP網(wǎng)絡(luò)應(yīng)用中,多
40、數(shù)網(wǎng)絡(luò)應(yīng)用程序是使用客戶/服務(wù)器模型設(shè)計(jì)的。服務(wù)程序通常在一個(gè)眾所周知的地址監(jiān)聽對(duì)服務(wù)的請(qǐng)求,也就是說,服務(wù)進(jìn)程一直處于休眠狀態(tài),直到一個(gè)客戶程序提出了請(qǐng)求信息。此時(shí),服務(wù)程序被"驚醒"并且為客戶提供服務(wù),對(duì)客戶的請(qǐng)求做出適當(dāng)?shù)姆磻?yīng)。雖然基于連接的服務(wù)是設(shè)計(jì)客戶/服務(wù)器應(yīng)用程序的標(biāo)準(zhǔn),但是通過運(yùn)用ICE中間件的原理,可以將客戶端和服務(wù)端進(jìn)行解耦合,使二者成為獨(dú)立的一部分,服務(wù)器只需提供一個(gè)servant,而客戶端只需
41、獲取servant的代理,二者就可以進(jìn)行通信,甚至服務(wù)器端和客戶端可以使用不同的語言來編寫。</p><p> 當(dāng)建立服務(wù)器程序時(shí),應(yīng)該將服務(wù)器程序設(shè)計(jì)成等候客戶的請(qǐng)求。TCP傳輸層通過協(xié)議端口和應(yīng)用程序通信,也就是說,為了接收客戶請(qǐng)求,服務(wù)器程序必須對(duì)傳輸層的一個(gè)特定協(xié)議端口進(jìn)行偵聽。</p><p> 同時(shí),客戶與服務(wù)器這兩個(gè)術(shù)語不是對(duì)應(yīng)用的特定組成部分的嚴(yán)格指稱,而是表示在某個(gè)請(qǐng)
42、求從發(fā)生到結(jié)束期間,應(yīng)用的某些部分所承擔(dān)的角色: </p><p> ? 客戶是主動(dòng)的實(shí)體。它們向服務(wù)器發(fā)出服務(wù)請(qǐng)求。 </p><p> ? 服務(wù)器是被動(dòng)的實(shí)體。它們提供服務(wù),響應(yīng)客戶請(qǐng)求。 </p><p> 在從不發(fā)出請(qǐng)求、而只是響應(yīng)請(qǐng)求的意義上,許多服務(wù)器常常不是 “純粹的”服務(wù)器:它們常常充當(dāng)某些客戶的服務(wù)器,但為了完成它們的客戶的請(qǐng)求,它們又會(huì)
43、充當(dāng)另外的服務(wù)器的客戶。與此類似,在只從某個(gè)對(duì)象那里請(qǐng)求服務(wù)的意義上,客戶常常也不是“純粹的”客戶:它們常常是客戶-服務(wù)器混合物。例如,客戶可以在服務(wù)器上啟動(dòng)一個(gè)長(zhǎng)時(shí)間運(yùn)行的操作,在啟動(dòng)該操作時(shí),客戶可以向服務(wù)器提供回調(diào)對(duì)象 (callback object ),供服務(wù)器用于在操作完成時(shí)向客戶發(fā)出通知。在這種情況下,客戶在啟動(dòng)操作時(shí)充當(dāng)客戶,而在接收操作完成通知時(shí)充當(dāng)服務(wù)器。這樣的角色反轉(zhuǎn)在許多系統(tǒng)中都很常見,所以,許多客戶-服務(wù)器系統(tǒng)
44、常??梢员桓鼫?zhǔn)確地描述為對(duì)等 (peer-to-peer )系統(tǒng)。</p><p> 3.1.2 采用UDP方式連接</p><p> 采用UDP協(xié)議的程序不需要有服務(wù)器,兩個(gè)程序之間可以通過無連接的方式進(jìn)行通信,所以無連接是使用UDP協(xié)議程序的一個(gè)顯著特點(diǎn)。</p><p> 使用無連接協(xié)議的程序和使用面向連接協(xié)議的服務(wù)器程序之間的主要相似之處是它們都
45、必須對(duì)一個(gè)協(xié)議端口進(jìn)行偵聽。例如,無連接和連接服務(wù)器程序必須在協(xié)議端口偵聽客戶請(qǐng)求。同樣,由于無連接客戶程序沒有和遠(yuǎn)地主機(jī)建立直接連接,所以它也必須對(duì)協(xié)議端口進(jìn)行偵聽,以便接收以對(duì)它服務(wù)請(qǐng)求產(chǎn)生的數(shù)據(jù)報(bào)應(yīng)答。</p><p> 無連接客戶程序也對(duì)一個(gè)協(xié)議端口進(jìn)行偵聽。使用無連接協(xié)議的程序不和遠(yuǎn)地主機(jī)建立直接連接。無連接客戶程序使用數(shù)據(jù)報(bào)發(fā)送網(wǎng)絡(luò)服務(wù)請(qǐng)求,它不建立點(diǎn)到點(diǎn)連接。因此無連接客戶程序必須在一個(gè)協(xié)議端口,
46、對(duì)應(yīng)答數(shù)據(jù)報(bào)進(jìn)行偵聽。</p><p> Ice 是一種面向?qū)ο蟮闹虚g件平臺(tái)。從根本上說,這意味著 Ice 為構(gòu)建面 向?qū)ο蟮目蛻簦?wù)器應(yīng)用提供了工具、API 和庫支持。 Ice 應(yīng)用適合在異種環(huán)境中使用:客戶和服務(wù)器可以用不同的編程語言編寫,可以運(yùn)行在不同的操作系統(tǒng)和機(jī)器架構(gòu)上,并且可以使用多種網(wǎng)絡(luò)技術(shù)進(jìn)行通信。無論部署環(huán)境如何,這些應(yīng)用的源碼都是可移植的。</p><p> 3.
47、1.3 采用ICE中間件</p><p> Ice 提供了一種 RPC 協(xié)議,既可以把 TCP/IP 、也可以把UDP 用作底層傳輸機(jī)制。此外,Ice 還允許你把 SSL 用作傳輸機(jī)制,讓客戶與服務(wù)器間的所有通信都進(jìn)行加密。Ice 協(xié)議定義了:</p><p> 1、 一些消息類型,比如請(qǐng)求和答復(fù)類型;</p><p> 2、 協(xié)議狀態(tài)機(jī),確定客戶與服務(wù)器
48、以怎樣的序列交換不同的消息類型,同時(shí)還包括相關(guān)的 TCP/IP 連接建立和關(guān)閉語義;</p><p> 3、編碼規(guī)則,確定在線路上怎樣表示數(shù)據(jù)的類型</p><p> 4、每種消息類型的頭,其中含有像這樣的細(xì)節(jié):消息類型、消息尺寸、所使用的協(xié)議及編碼版本。</p><p> Ice 還支持在線路上進(jìn)行壓縮:通過設(shè)置一個(gè)配置參數(shù),你可以讓所有的網(wǎng)絡(luò)通信數(shù)據(jù)都被壓
49、縮,從而節(jié)省帶寬。如果你的應(yīng)用要在客戶與服務(wù)器間交換大量數(shù)據(jù),這種功能會(huì)很有用。Ice 協(xié)議適用于構(gòu)建高效的事件轉(zhuǎn)發(fā)機(jī)制,因?yàn)橐朕D(zhuǎn)發(fā)消息,你不需 要了解消息內(nèi)部的詳細(xì)信息。這意味著,消息交換機(jī)不需要對(duì)消息進(jìn)行任 何解編或重整編——它們可以簡(jiǎn)單地把消息當(dāng)作不透明的字節(jié)緩沖區(qū)加以轉(zhuǎn)發(fā)。Ice 協(xié)議還適用于構(gòu)建雙向操作:如果服務(wù)器想要把一條消息發(fā)送給客 戶提供的某個(gè)回調(diào)對(duì)象,這個(gè)回調(diào)對(duì)象可以通過客戶原來創(chuàng)建的連接傳給服務(wù)器。如果客戶在防火墻
50、后面,連接只能外出,不能進(jìn)入,這種特性就特別重要。Ice 核心為分布式應(yīng)用開發(fā)提供了一個(gè)完善的客戶-服務(wù)器平臺(tái)。但現(xiàn)實(shí)應(yīng)用需要的常常不止是遠(yuǎn)地通信能力:你通常還需要擁有這樣的能力:隨需啟動(dòng)服務(wù)器、把代理分發(fā)給客戶、分發(fā)異步事件、配置你的應(yīng)用、分發(fā)應(yīng)用補(bǔ)丁,等等。在 Ice 中有一些服務(wù),能夠提供上述特性及其他一些特性。這些服務(wù)被實(shí)現(xiàn)成Ice 服務(wù)器,你的應(yīng)用充當(dāng)?shù)氖沁@些服務(wù)器的客戶。這些服務(wù)都沒有使用 Ice 的任何向應(yīng)用開發(fā)者隱藏起
51、來的內(nèi)部特性,所以在理論上,你可以</p><p><b> 3.2 方案比較</b></p><p> 綜合以上分析,本軟件開發(fā)選擇方案如下:</p><p> Linux操作系統(tǒng),采用C++開發(fā)語言,TCP協(xié)議進(jìn)行連接。采用C/S架構(gòu),運(yùn)用ICE中間件連接服務(wù)器和客戶端。系統(tǒng)界面美觀內(nèi)容豐富,很好的實(shí)現(xiàn)了服務(wù)器與用戶、用戶與用戶的交
52、互。</p><p> 3.3 總體設(shè)計(jì)方案</p><p> 為實(shí)現(xiàn)網(wǎng)絡(luò)聊天的功能,該軟件使用ICE中間件,服務(wù)器與客戶端采用了TCP/IP方式連接,在設(shè)計(jì)聊天方案時(shí),實(shí)行將所有信息發(fā)往服務(wù)器端,再由服務(wù)器進(jìn)行分別處理的思路,服務(wù)器端是所有信息的中心。</p><p> 3.3.1 服務(wù)器端功能模塊劃分</p><p> 服務(wù)
53、器負(fù)責(zé)向各個(gè)客戶端發(fā)布系統(tǒng)消息。</p><p> 接受來自客戶端的各種信息并分別處理。</p><p> 針對(duì)這些操作,服務(wù)器做了如下的模塊劃分:</p><p> 處理登陸信息模塊:檢查登陸信息是否正確,并向客戶端返回登陸信息。</p><p> 處理聊天信息模塊:轉(zhuǎn)發(fā)消息給指定的用戶。</p><p>
54、 處理申請(qǐng)信息模塊:通過用戶申請(qǐng)模塊進(jìn)行新用戶的注冊(cè),保存該用戶信息。</p><p> 發(fā)布系統(tǒng)消息模塊:將消息發(fā)給各客戶端,改寫用戶在服務(wù)器端和客戶端的狀態(tài)。</p><p><b> 服務(wù)器功能示意圖:</b></p><p> 圖3-1 服務(wù)器功能示意圖</p><p> 3.3.2 客戶端端功能模
55、塊劃分</p><p> 客戶端主要負(fù)責(zé)處理用戶的操作信息,當(dāng)用戶做出相應(yīng)的動(dòng)作時(shí)客戶端應(yīng)該能夠及時(shí)地做出相應(yīng),當(dāng)GTK圖形程序檢測(cè)到鼠標(biāo)點(diǎn)擊時(shí),將觸發(fā)一個(gè)事件,對(duì)該事件進(jìn)行動(dòng)作的定義和函數(shù)的編寫便可完成相應(yīng)的動(dòng)作。因此,針對(duì)這些操作特性,將客戶端模塊進(jìn)行如下劃分:</p><p> 登陸功能模塊:建立與服務(wù)器的連接并登陸,能顯示登陸錯(cuò)誤信息。</p><p>
56、 界面顯示模塊:將在線好友顯示在好友列表中,并顯示其當(dāng)前狀態(tài)。</p><p> 聊天功能模塊:處理各種聊天信息,并判斷消息類型。</p><p> 離線消息模塊:接收和發(fā)送離線消息,對(duì)離線消息進(jìn)行處理。</p><p> 配置信息模塊:提供基本的軟件配置操作。</p><p><b> 客戶端功能示意圖:</b&g
57、t;</p><p> 圖3-2 客戶端功能示意圖</p><p> 3.3.3 消息標(biāo)識(shí)定義</p><p> 消息頭,包含發(fā)送者,信息內(nèi)容,接受者,發(fā)送時(shí)間</p><p> struct message</p><p><b> {</b></p><p&
58、gt; string sender;</p><p> string mes;</p><p> string receiver;</p><p> string time;</p><p><b> }</b></p><p> 用戶信息,包含姓名,密碼,頭像</p>
59、<p> struct userinfo</p><p><b> {</b></p><p> string name;</p><p> string pwd;</p><p> string picpath;</p><p><b> } </b>
60、</p><p> 好友列表 </p><p> sequence < string > frilist</p><p> 消息隊(duì)列 </p><p> sequence < message > messagelist</p><p> 用戶-用戶信息
61、 </p><p> dictionary < string, userinfo > userinfolist</p><p> 用戶-好友列表 </p><p> dictionary < string, frilist > userfri</p><p> 離線消息 </p>
62、;<p> sequence < message > offlinemessage</p><p> 在線用戶 </p><p> sequence < string > liveuser</p><p> 3.3.4 服務(wù)器接口函數(shù)</p><p> 在slice語言中,定于
63、服務(wù)器接口funcpp,該接口提供以下操作:</p><p><b> 登入系統(tǒng)</b></p><p> int Logins (string name, string pwd);</p><p><b> 注冊(cè)用戶</b></p><p> int Regists (string nam
64、e, string pwd, string picpath);</p><p><b> 獲取用戶名</b></p><p> int Getusername (string name);</p><p><b> 獲取用戶頭像</b></p><p> string Getfripic(s
65、tring name);</p><p><b> 獲取好友列表</b></p><p> frilist Retfrilist(string name);</p><p><b> 添加好友</b></p><p> int Addfriend(string name,string fri
66、name);</p><p><b> 刪除好友</b></p><p> int Delfriend(string name,string friname);</p><p><b> 將用戶信息寫入文件</b></p><p> int Writeofflinemesfile();<
67、;/p><p><b> 讀取文件中用戶信息</b></p><p> offlinemessage Readofflinemesfile();</p><p><b> 發(fā)送消息</b></p><p> int Sendmessage(string recverrname,string se
68、ndername,string message,string sendtime);</p><p><b> 發(fā)送離線消息</b></p><p> int Sendofflinemes(string recvername,string sendername,string message,string sendtime);</p><p>
69、<b> 獲取消息</b></p><p> message Getmessage(string recvername,string sendername);</p><p> 獲取是否在線 </p><p> int Getstat(string name);</p><p> 獲取消息數(shù)量
70、 </p><p> int Getmessagenum();</p><p> 獲取系統(tǒng)消息數(shù)量 </p><p> int Getsysnum();</p><p><b> 獲取系統(tǒng)消息</b></p><p> message Getsysmessage(string recv
71、ername);</p><p><b> 獲取當(dāng)前時(shí)間</b></p><p> char* currenttime(char* curtime, const char* format);</p><p> 添加日志 </p><p> void writelog(string s);</
72、p><p> 用戶在線 </p><p> int Loginser(string name); </p><p> 離線用戶 </p><p> int Logoutser(string name);</p><p> 4 即時(shí)通訊系統(tǒng)軟件詳細(xì)設(shè)計(jì)</p><
73、p> 4.1 服務(wù)器端設(shè)計(jì)思想</p><p> 本系統(tǒng)軟件產(chǎn)品的主要功能是實(shí)現(xiàn)網(wǎng)上聊天,可以讓多個(gè)用戶同時(shí)互相通信,有一個(gè)服務(wù)器,用于檢查客戶登陸請(qǐng)求,轉(zhuǎn)發(fā)客戶所發(fā)出的消息,并負(fù)責(zé)刪除退出的用戶。對(duì)服務(wù)器的某一可用端口進(jìn)行監(jiān)聽,以獲得客戶端請(qǐng)求,從而對(duì)客戶端請(qǐng)求進(jìn)行處理。因?yàn)槭嵌嗫蛻敉瑫r(shí)請(qǐng)求,所以要采用多線程,為每一個(gè)在線用戶分配一個(gè)線程,實(shí)時(shí)處理每個(gè)客戶端的請(qǐng)求。服務(wù)器端要求實(shí)現(xiàn)公共數(shù)據(jù)處理,處理
74、公共數(shù)據(jù),客戶數(shù)據(jù)資料的存儲(chǔ)與讀取,聊天記錄資料的存取和讀取等。端口監(jiān)聽器,監(jiān)聽服務(wù)器某一端口,為每一在線客戶建立一個(gè)會(huì)話線程??蛻粽?qǐng)求處理處理客戶的請(qǐng)求,根據(jù)客戶的請(qǐng)求執(zhí)行相應(yīng)的操作。</p><p> 服務(wù)器運(yùn)行后即處于監(jiān)聽狀態(tài),當(dāng)監(jiān)聽到有連接請(qǐng)求時(shí)服務(wù)器進(jìn)入消息處理流程,因?yàn)榉?wù)器為并發(fā)服務(wù)器,所以可以同時(shí)對(duì)多個(gè)請(qǐng)求做出相應(yīng)。</p><p> 由于服務(wù)器與客戶端是相互獨(dú)立的,啟
75、動(dòng)服務(wù)器后,服務(wù)器等待客戶端與之相連,同時(shí),服務(wù)器本身可以做相應(yīng)的操作:從數(shù)據(jù)庫讀取用戶信息、從文件中讀取用戶信息、將用戶信息保存到數(shù)據(jù)庫中(當(dāng)有新用戶注冊(cè)時(shí))、用戶信息保存到文件中(當(dāng)有新用戶注冊(cè)時(shí))。</p><p> 服務(wù)器工作方式簡(jiǎn)圖如下:</p><p> 圖4-1 服務(wù)器工作方式簡(jiǎn)圖</p><p> 4.2 客戶端設(shè)計(jì)思想</p>
76、<p> 本系統(tǒng)軟件產(chǎn)品的主要功能是實(shí)現(xiàn)網(wǎng)上聊天,可以讓多個(gè)用戶同時(shí)互相通信,有一個(gè)服服務(wù)器,用于檢查客戶登陸請(qǐng)求,轉(zhuǎn)發(fā)客戶所發(fā)出的消息,并負(fù)責(zé)刪除退出的用戶.服務(wù)器任務(wù)為從數(shù)據(jù)庫讀取用戶信息、從文件中讀取用戶信息、將用戶信息保存到數(shù)據(jù)庫中(當(dāng)有新用戶注冊(cè)時(shí))、用戶信息保存到文件中(當(dāng)有新用戶注冊(cè)時(shí))。其主要是在后臺(tái)工作。</p><p> 而對(duì)于客戶端,其主要的功能是實(shí)現(xiàn)用戶之間的通信,用穩(wěn)定
77、的圖形化界面表示客戶端,以便直觀的進(jìn)行通信??蛻舳税韵陆缑妫旱顷懡缑妗⒊绦蛑鞔翱?、聊天界面、注冊(cè)用戶界面、彈出離線消息窗口、添加刪除好友窗口。</p><p> 下圖為客戶端前臺(tái)窗口工作方式簡(jiǎn)圖:</p><p> 圖4-2 客戶端前臺(tái)窗口工作方式簡(jiǎn)圖</p><p> 客戶端運(yùn)行后首先要用戶登錄到服務(wù)器,如果登陸成功服務(wù)器會(huì)將在線的用戶聯(lián)系人列表發(fā)送給
78、客戶端,此時(shí)客戶端即可顯示有哪些好友在線而哪些是離線的。當(dāng)用戶點(diǎn)擊在線好友時(shí)便會(huì)彈出一個(gè)聊天信息窗體,該窗體用于發(fā)送和接收用戶的聊天信息。當(dāng)用戶點(diǎn)擊離線用戶時(shí)便會(huì)觸發(fā)一個(gè)離線消息事件,該事件通過服務(wù)器轉(zhuǎn)發(fā)方式發(fā)送給離線用戶,當(dāng)對(duì)方上線時(shí)便可查看該離線消息。</p><p> 服務(wù)器程序啟動(dòng)后,如服務(wù)器流程圖所示,通過雙線程,同時(shí)啟動(dòng)ICE的Server端和ICE的Client端,服務(wù)器的Server端用來等待客
79、戶端的Client連接,服務(wù)器的Client端用來連接客戶端的Server端。</p><p> 啟動(dòng)客戶端,用過IP和端口號(hào)連接上服務(wù)器的Server端,同時(shí)客戶端啟動(dòng)自身的Server端,此時(shí)服務(wù)器的Client端連接客戶端的Server端,此時(shí),客戶端與服務(wù)器之間建立了連接。</p><p> 客戶端服務(wù)器連接后,服務(wù)器通過創(chuàng)建通信器以及適配器,并在通信器中建立Servant以便
80、客戶端調(diào)用。</p><p> 下圖為服務(wù)器和客戶端之間連接方式(ICE的C/S連接)的簡(jiǎn)圖:</p><p> 圖4-3 ICE下服務(wù)器和客戶端工作方式簡(jiǎn)圖</p><p> 客戶端后臺(tái)工作方式簡(jiǎn)圖如下:</p><p> 圖4-4 客戶端后臺(tái)工作方式簡(jiǎn)圖</p><p> 4.3 服務(wù)器端詳細(xì)設(shè)計(jì)&
81、lt;/p><p> 4.3.1 服務(wù)器端主體</p><p> 服務(wù)器主體函數(shù)主要涉及是創(chuàng)建兩個(gè)線程,一個(gè)是Server端線程,一個(gè)Clinet端線程。</p><p> Server端線程負(fù)責(zé)提供連接,供客戶端的Client端連接;</p><p> Client端負(fù)責(zé)連接Client端。</p><p>
82、<b> 創(chuàng)建兩個(gè)新線程:</b></p><p> IceUtil::ThreadPtr st = new serverthread;</p><p> IceUtil::ThreadPtr ct = new clientthread;</p><p><b> 啟動(dòng)線程:</b></p><
83、p> IceUtil::ThreadControl tst = st->start();</p><p> IceUtil::ThreadControl tct = ct->start();</p><p> 4.3.2 服務(wù)器端線程實(shí)現(xiàn)</p><p> 服務(wù)器端有兩個(gè)類serverthread和clientthread,繼承自基類I
84、ceUtil::Thread,兩個(gè)類的public的run()方法用來啟動(dòng)ICE線程。</p><p> serverthread類的run方法完成工作是:初始化通信器,創(chuàng)建適配器,建立Servant,將Servant加入通信器,激活通信器,然后等待連接,同時(shí)完成工作后關(guān)閉通信器。</p><p> clientthread類的run方法完成的工作是:初始化通信器,創(chuàng)建適配器,建立se
85、rver端的代理,查找相應(yīng)的Servant代理,通過代理調(diào)用相應(yīng)接口。</p><p> 在clientthread類的run方法中,通過代理調(diào)用相應(yīng)的接口函數(shù),加上選擇機(jī)制,可以完成服務(wù)器端的四個(gè)功能:從數(shù)據(jù)庫讀取用戶信息、從文件中讀取用戶信息、將用戶信息保存到數(shù)據(jù)庫中(當(dāng)有新用戶注冊(cè)時(shí))、用戶信息保存到文件中(當(dāng)有新用戶注冊(cè)時(shí))。</p><p> 在服務(wù)器和客戶端連接時(shí),二者相連
86、的端口號(hào)直接寫入了配置文件,這樣就無需用硬寫入的方式在程序中就寫入連接的IP和端口號(hào),從而方便了我們以后可以修改,而不必改變整個(gè)程序,ICE的配置文件的方式提供了這樣的方便。</p><p> Ice 屬性機(jī)制提供了一種簡(jiǎn)單的配置 Ice 的途徑,你可以在配置文件中、或在命令行上設(shè)置屬性。這也適用于你自己的應(yīng)用:你可以輕松地使用Properties接口,訪問你為自己的需要而創(chuàng)建的、應(yīng)用專用的屬性。用于訪問屬性值
87、的 API 小而簡(jiǎn)單,所以要在運(yùn)行時(shí)用它獲取屬性值很容易;這個(gè) API 還很靈活,如果有需要,它能讓你使用多個(gè)不同的屬性集和配置文件。</p><p> 啟動(dòng)服務(wù)器后,效果如下圖:</p><p> 圖4-5 啟動(dòng)服務(wù)器截圖</p><p> 4.3.3服務(wù)器端函數(shù)實(shí)現(xiàn)</p><p> 服務(wù)器端提供以下函數(shù)的實(shí)現(xiàn):</p&g
88、t;<p><b> 登入系統(tǒng)</b></p><p> int Logins (string name, string pwd);</p><p><b> 注冊(cè)用戶</b></p><p> int Regists (string name, string pwd, string picpath)
89、;</p><p><b> 獲取用戶名</b></p><p> int Getusername (string name);</p><p><b> 獲取用戶頭像</b></p><p> string Getfripic(string name);</p><p&
90、gt;<b> 獲取好友列表</b></p><p> frilist Retfrilist (string name);</p><p><b> 添加好友</b></p><p> int Addfriend(string name,string friname);</p><p>&l
91、t;b> 刪除好友</b></p><p> int Delfriend(string name,string friname);</p><p><b> 將用戶信息寫入文件</b></p><p> int Writeofflinemesfile();</p><p><b>
92、讀取文件中用戶信息</b></p><p> offlinemessage Readofflinemesfile();</p><p><b> 發(fā)送消息</b></p><p> int Sendmessage(string recverrname,string sendername,string message,strin
93、g sendtime);</p><p><b> 發(fā)送離線消息</b></p><p> int Sendofflinemes(string recvername,string sendername,string message,string sendtime);</p><p><b> 獲取消息</b><
94、/p><p> message Getmessage(string recvername,string sendername);</p><p><b> 獲取是否在線</b></p><p> int Getstat(string name);</p><p><b> 獲取消息數(shù)量</b>&
95、lt;/p><p> int Getmessagenum();</p><p><b> 獲取系統(tǒng)消息數(shù)量</b></p><p> int Getsysnum();</p><p><b> 獲取系統(tǒng)消息</b></p><p> message Getsysmess
96、age(string recvername);</p><p><b> 獲取當(dāng)前時(shí)間</b></p><p> char* currenttime(char* curtime, const char* format);</p><p><b> 添加日志</b></p><p> void
97、 writelog(string s);</p><p> 用戶在線 </p><p> int Loginser(string name); </p><p> 離線用戶 </p><p> int Logoutser(string name);</p><p> 4.4
98、 客戶端圖形界面詳細(xì)設(shè)計(jì)</p><p> 即時(shí)通信軟件的客戶端是使用圖形用戶界面來實(shí)現(xiàn)的,程序運(yùn)行后激活主窗體,在主窗體上點(diǎn)擊設(shè)置為敏感狀態(tài)的按鈕就會(huì)產(chǎn)生相應(yīng)的事件,該事件將會(huì)觸發(fā)一個(gè)消息驅(qū)動(dòng)所指定的函數(shù)來處理這個(gè)操作。</p><p> 本軟件使用QT圖形界面來實(shí)現(xiàn),其具有以下優(yōu)點(diǎn):</p><p> 面向?qū)ο螅篞t 的良好封裝機(jī)制使得 Qt 的模塊化程度
99、非常高,可重用性較好,對(duì)于用戶開發(fā)來說是非常 方便的。Qt 提供了一種稱為signals/slots 的安全類型來替代 callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡(jiǎn)單;</p><p> 豐富的API:Qt包括多達(dá) 250個(gè)以上的 C++ 類,還提供基于模板的 collections, serialization, file, I/O device, directory management, da
100、te/time 類。</p><p> 登陸界面的設(shè)計(jì)是整個(gè)客戶端的切入點(diǎn),客戶端的整個(gè)設(shè)計(jì)都是在圖形界面下完成的。</p><p> 圖形用戶界面或圖形用戶接口(Graphical User Interface,GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作環(huán)境用戶接口。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來說更為簡(jiǎn)便易用。GUI的廣泛應(yīng)用是當(dāng)今計(jì)算機(jī)發(fā)展的重大成就之一,它極
101、大地方便了非專業(yè)用戶的使用人們從此不再需要死記硬背大量的命令,取而代之的是可用通過窗口、菜單、按鍵等方式來方便地進(jìn)行操作。而嵌入式GUI具有下面幾個(gè)方面的基本要求:輕型、占用資源少、高性能、高可靠性、便于移植、可配置等特點(diǎn)。</p><p> 圖形界面穩(wěn)定實(shí)用是前提,在穩(wěn)定的前提下要力求做好美觀,簡(jiǎn)潔,客戶端通過創(chuàng)建圖形界面,并通過代理調(diào)用服務(wù)器中的接口,再運(yùn)用QT的機(jī)制,通過點(diǎn)擊按鈕等方式獲取相應(yīng)響應(yīng),從而實(shí)
102、現(xiàn)相應(yīng)操作。</p><p> 4.4.1 連接窗體</p><p> 1、連接窗體:用以實(shí)現(xiàn)客戶端和服務(wù)器的連接。</p><p> 在連接窗體中,有兩個(gè)Button(按鈕(下同))和兩個(gè)LineEdit。</p><p> IP對(duì)應(yīng)的LineEdit響應(yīng)SaveIp函數(shù),用以保存Ip地址。</p><p>
103、;<b> 其實(shí)現(xiàn)如下:</b></p><p> void MainWindow::SaveIp()</p><p><b> {</b></p><p> QString qip;</p><p> qip.append(ui->text1->text());</p&
104、gt;<p> serip= qip.toStdString();</p><p><b> }</b></p><p> Port對(duì)應(yīng)的LineEdit響應(yīng)SavePort函數(shù),用以保存Port號(hào)。</p><p><b> 其實(shí)現(xiàn)如下:</b></p><p> void
105、 MainWindow::SavePort()</p><p><b> {</b></p><p> QString qip;</p><p> qip.append(ui->text2->text());</p><p> serport= qip.toStdString();</p>
106、<p><b> }</b></p><p> ‘OK’按鈕響應(yīng)響應(yīng)Loginuser函數(shù),目的是登陸服務(wù)器。</p><p><b> 其實(shí)現(xiàn)如下:</b></p><p> funcppPrx MainWindow::getfuncpp()</p><p><b>
107、; {</b></p><p> Ice::CommunicatorPtr ic;</p><p><b> try</b></p><p><b> {</b></p><p> ic = Ice::initialize();</p><p> Ic
108、e::PropertiesPtr props = ic->getProperties();</p><p> string configfile = CONFIG_FILE;</p><p> props->load(configfile);</p><p> string str="SimplePrinter:";</p
109、><p> if (serip=="default") str=str+serip+" -p "+serport; else str=str+" tcp -h "+serip+" -p "+serport;</p><p> cout<<str<<endl;</p><
110、;p> Ice::ObjectPrx base = ic->stringToProxy(str);</p><p> funcppPrx cbrx = funcppPrx::checked Cast(base);</p><p> return cbrx;</p><p><b> }</b></p><
111、p> catch (const Ice::Exception & ex)</p><p><b> {</b></p><p> car << ex << endl;</p><p><b> }</b></p><p> catch (const c
112、har * mug)</p><p><b> {</b></p><p> car << mug << endl;</p><p><b> }</b></p><p><b> if (ic)</b></p><p>
113、 ic->destroy();</p><p><b> }</b></p><p> 同時(shí),若連接服務(wù)器成功,還應(yīng)彈出新窗口。</p><p><b> 其實(shí)現(xiàn)如下:</b></p><p> void MainWindow::Loginuser()</p><
114、p><b> {</b></p><p> MainWindow::close();</p><p> if (serip.size()==0) { QMessageBox::about(NULL, "IP is NULL", "IP is set default");serip="default"
115、;;}</p><p> if (serport.size()==0) {QMessageBox::about(NULL, "Port is NULL", "Port is set 20000");serport="20000";}</p><p> loginusr.usrip=serip;</p><p
116、> loginusr.usrport=serport;</p><p> icefun=getfuncpp();</p><p> loginusr.loginicefun=icefun;</p><p> loginusr.exec();</p><p> while(loginusr.flag==0)</p>
117、<p><b> {</b></p><p> loginusr.loginicefun=icefun;</p><p> loginusr.exec();</p><p><b> }</b></p><p> usernm=loginusr.usrname;</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文--linux下基于c++開發(fā)的即時(shí)通訊軟件
- 基于vc的簡(jiǎn)單即時(shí)通信軟件開發(fā)【畢業(yè)設(shè)計(jì)】
- 基于vc的簡(jiǎn)單即時(shí)通信軟件開發(fā)【畢業(yè)設(shè)計(jì)+開題報(bào)告+文獻(xiàn)綜述】
- 基于vb的即時(shí)通信系統(tǒng)畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---局域網(wǎng)即時(shí)通信軟件設(shè)計(jì)
- 基于bs模式的即時(shí)通信軟件設(shè)計(jì)
- 基于Linux環(huán)境下即時(shí)通訊軟件的研究與實(shí)現(xiàn).pdf
- 畢業(yè)論文--基于java的即時(shí)通信軟件設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)論文--基于java的即時(shí)通信軟件設(shè)計(jì)與實(shí)現(xiàn)
- 基于cs結(jié)構(gòu)的即時(shí)通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 基于cs結(jié)構(gòu)的即時(shí)通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 局域網(wǎng)即時(shí)通信軟件畢業(yè)論文
- 畢業(yè)論文---基于j2se的即時(shí)通信軟件
- 基于Linux的網(wǎng)絡(luò)即時(shí)通訊軟件設(shè)計(jì)與實(shí)現(xiàn).pdf
- 畢業(yè)設(shè)計(jì)---基于bs模式即時(shí)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)
- 基于RTC技術(shù)的即時(shí)通信軟件的研究與設(shè)計(jì).pdf
- 基于bs方式的即時(shí)通信軟件的和實(shí)現(xiàn)
- 基于GPRS的即時(shí)通信系統(tǒng)協(xié)議設(shè)計(jì)與開發(fā).pdf
- 畢業(yè)設(shè)計(jì)(論文)基于web的im即時(shí)通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 基于c#的即時(shí)通訊軟件設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
評(píng)論
0/150
提交評(píng)論