即時聊天軟件的開發(fā)及實現(xiàn)_第1頁
即時聊天軟件的開發(fā)及實現(xiàn)_第2頁
即時聊天軟件的開發(fā)及實現(xiàn)_第3頁
即時聊天軟件的開發(fā)及實現(xiàn)_第4頁
即時聊天軟件的開發(fā)及實現(xiàn)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、重慶大學(xué)網(wǎng)絡(luò)教育學(xué)院 畢業(yè)設(shè)計(論文)題目 即時聊天軟件的開發(fā)與實現(xiàn) 學(xué)生所在校外學(xué)習(xí)中心 山西晉中煤炭系統(tǒng) 批次 層次 專業(yè) 131 專升本 計算機科學(xué)與技術(shù)學(xué) 號 W13119700 學(xué) 生 王 芳 指 導(dǎo) 教 師 胥 斌 起 止 日 期 2014年4月-2014年10月 目 錄摘 要II1 前言11.1 課題選題背景11.2即時通信的概念和特點11.3即時聊天系統(tǒng)的發(fā)展22 涉及的相關(guān)技術(shù)及協(xié)議22.1 Java語言22.2 C/S模式介紹32.3 Hibernate框架簡介43 系統(tǒng)需求分析43.1即時聊天消息的一般需求43.2 即時消息的協(xié)議需求53.3 即時消息的安全需求53.4

2、即時信息加密和鑒別53.5 即時通訊系統(tǒng)需求54 系統(tǒng)設(shè)計54.1即時聊天系統(tǒng)的實施原理64.2軟件設(shè)計流程74.3功能模塊劃分84.4 數(shù)據(jù)庫概要設(shè)計85 詳細設(shè)計95.1 服務(wù)器端的設(shè)計與實現(xiàn)95.1.2 主服務(wù)器類的設(shè)計95.1.2 登錄驗證模塊115.1.3 注冊處理模塊115.2 客戶端的設(shè)計與實現(xiàn)125.2.1 用戶注冊模塊125.2.2 用戶登錄135.2.3 在線用戶顯示設(shè)計145.2.4 聊天信息發(fā)送與接收155.3 數(shù)據(jù)庫設(shè)計166 結(jié)論17參考文獻19附錄1摘 要計算機網(wǎng)絡(luò)技術(shù)高速發(fā)展的今天,即時通訊方式日益受到人們的青睞。即時聊天工具在實現(xiàn)傳輸視頻與音頻信息,使協(xié)作成員

3、可以遠距離進行直觀、真實的視音交流的同時,利用多媒體的技術(shù),它還可以幫助使用者對工作中各種信息進行處理。本課題研究的是支持內(nèi)部網(wǎng)絡(luò)交流的系統(tǒng)網(wǎng)絡(luò)即時通訊系統(tǒng)。該系統(tǒng)使用Java語言進行編程。系統(tǒng)采用C/S結(jié)構(gòu)模式,支持局域網(wǎng)和Internet。該系統(tǒng)采用軟件工程的瀑布模型進行開發(fā),分別討論了系統(tǒng)的需求分析、概要設(shè)計、詳細設(shè)計和編碼、以及整個系統(tǒng)的運行和測試。關(guān)鍵詞:即時聊天 系統(tǒng) Java C/S II1 前言交流對于人類社會及其每個成員都至關(guān)重要。直接交流的方式包括語言、文字等,而遠程交流還需借助于一些先進的工具如電話、網(wǎng)絡(luò)等。本課題研究的是支持內(nèi)部網(wǎng)絡(luò)交流的系統(tǒng)網(wǎng)絡(luò)即時通訊系統(tǒng)。該課題在實

4、施的過程中需要使用Java語言。1.1 課題選題背景計算機技術(shù)、網(wǎng)絡(luò)技術(shù)高速發(fā)展的今天,即時通訊方式日益受到人們的青睞。即時通訊工具在實現(xiàn)傳輸視頻與音頻信息,使協(xié)作成員可以遠距離進行直觀、真實的視音交流的同時,利用多媒體的技術(shù),它還可以幫助使用者對工作中各種信息進行處理。大家都知道,網(wǎng)絡(luò)上常用的即時通訊工具之一有ICQ。其實,ICQ是英文“I seek you”的簡稱,中文意思是“我找你”。ICQ最大的功能便是即時信息交流,只要記得對方的號碼,上網(wǎng)時可以呼他,無論他在哪里,只要他上網(wǎng)打開ICQ,人們就可以隨時交流。目前即時聊天系統(tǒng)種類眾多,功能也較為齊全。該課題現(xiàn)在所研究的即時通訊系統(tǒng),其目標(biāo)

5、是定位于企業(yè)內(nèi)部網(wǎng)絡(luò),解決企業(yè)或單位的溝通及協(xié)同的問題,提高工作效率。企業(yè)內(nèi)部員工可以利用該通訊系統(tǒng)隨時隨地發(fā)送文字消息、進行多人群聊、消息群發(fā)、傳送文件、音頻視頻對話等。系統(tǒng)包括客戶端程序和服務(wù)器端程序,支持局域網(wǎng)和Internet。企業(yè)內(nèi)部員工之間可以在內(nèi)部網(wǎng)覆蓋的任何地點、任何時間進行即時交流,真正實現(xiàn)企業(yè)內(nèi)部協(xié)同工作。使您不必花費大量的時間、金錢聚集到一個地方,通過網(wǎng)絡(luò),就能實現(xiàn)面對面的溝通,提高了效率。MSN、QQ等公共消息系統(tǒng),由于聊天對象及內(nèi)容的不可控,若在企業(yè)內(nèi)部使用,可能會降低工作效率。而該即時通訊系統(tǒng)將自己的服務(wù)器端安裝在企業(yè)內(nèi),并且人員的創(chuàng)建是由系統(tǒng)管理員來完成,因此很好

6、的解決了這個問題。即時通訊帶給了更大的互動性,人們在交流彼此的看法、意見時,發(fā)現(xiàn)采用你來我往的方式達到的效果最為明顯。這就體現(xiàn)了互動性。通過使用及時通訊系統(tǒng),大家不需要離開電腦,不需要借助其它額外的工具,就可以在線實時地交流工作。1.2即時通信的概念和特點即時通訊(IM)是一個允許兩人或多人使用網(wǎng)絡(luò)即時地傳遞文字信息、檔案、語音與視頻交流的終端服務(wù)。即時通訊不同于e-mail在于它的交談是即時的?!?】大部分的即時通訊服務(wù)提供了presence awareness的特性顯示聯(lián)絡(luò)人名單,聯(lián)絡(luò)人是否在在線與能否與聯(lián)絡(luò)人交談。在早期的即時通訊程序中,使用者輸入的每一個字符都會即時顯示在雙方的銀幕,且

7、每一個字符的刪除與修改都會即時的反應(yīng)在銀幕上。這種模式比起使用e-mail更像是電話交談,充分體現(xiàn)了其實時特性。在現(xiàn)在的即時通訊程序中,為了畫面的完整美觀和交流方便,交談中的另一方通常只會在本地端按下送出鍵(Enter或是Ctrl+Enter)后才會看到信息。1.3即時聊天系統(tǒng)的發(fā)展二十世紀(jì)七十年代早期,一種較早的即時通訊形式是柏拉圖系統(tǒng)(PLATO system)。八十年代,UNIX/Linux的交談即時信息被廣泛的使用于工程師與學(xué)術(shù)界,九十年代即時通訊更可跨越了操作系統(tǒng)平臺交流,1996年11月,首個廣泛被非UNIX/Linux使用者用于因特網(wǎng)的即時通訊軟件ICQ出現(xiàn)。通常認為ICQ是現(xiàn)在

8、流行使用的即時通訊軟件的開山之作。ICQ源于以色列特拉維夫的Mirabils公司。該公司成立于1996年月,也就是在這個時候,四個月后的1996年11月,互聯(lián)網(wǎng)上最出名,下載使用人數(shù)最多的免費軟件ICQ誕生了,她是由幾個以色列的年輕人制作的,在無人投資的情況下,他們向全球互聯(lián)網(wǎng)用戶提供免費下載使用,到了1998年,Mirabilis公司的ICQ用戶已經(jīng)發(fā)展到1200萬人,并以每月100萬用戶的速度增加。這時候,ICQ公司由于其潛在的巨大商業(yè)廣告價值,已經(jīng)成為許多大公司爭相購買的對象,1998年ICQ公司將自己開發(fā)的軟件連同用戶一起“賣”給了美國在線(AOL),售價2.87億美元。據(jù)美國在線19

9、99年底稱,ICQ使用者已達5000萬,其中超過三分之二的使用者居住在美國本土以外的世界各地。ICQ造就的實時通信成了互聯(lián)網(wǎng)世界中發(fā)展最快的一個領(lǐng)域。2 涉及的相關(guān)技術(shù)及協(xié)議為了保證課題能正常實施,先來分析一下課題所需要的相關(guān)技術(shù)和協(xié)議。2.1 Java語言經(jīng)過認真的討論分析,綜合各種計算機高級語言的特征和適應(yīng)范圍,最終決定選擇純面向?qū)ο蟮腏ava語言來完成畢業(yè)論文的設(shè)計,下面就技術(shù)可行性方面,對Java語言作一簡要介紹。Sun公司的口號就是“網(wǎng)絡(luò)就是計算機”,Java能使所有東西從桌面計算平穩(wěn)的轉(zhuǎn)變?yōu)榛诰W(wǎng)絡(luò)的計算,它是專門為此而建立的,并顯然是為了完成這個任務(wù)而來的。使用Java語言,可以

10、相對輕松的一天編寫一個有條理的網(wǎng)絡(luò)程序。今天,Java的網(wǎng)絡(luò)功能正在飛躍發(fā)展,不斷有新的特性增加到這個有價值的基礎(chǔ)上,JavaSoft實驗室正在不斷努力使Java更加完善。就Java語言的主要特點,本人歸納如下:Java程序設(shè)計的開發(fā)過程與運行環(huán)境Java是解釋型的高級編程語言,所以Java程序的開發(fā)通常需要經(jīng)過編寫源程序、編譯生成字節(jié)碼和運行三個過程。這里要提到,Java應(yīng)用程序的開發(fā)周期包括編譯、下載、解釋和執(zhí)行幾個部分。Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼字節(jié)碼。這一編譯過程同C/C+的編譯有些不同。當(dāng)C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬件平臺運行而

11、產(chǎn)生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉(zhuǎn)換為特定的內(nèi)存偏移量,以保證程序運行。Java編譯器卻不將對變量和方法的引用編譯為數(shù)值引用,也不確定程序執(zhí)行過程中的內(nèi)存布局,而是將這些符號引用信息保留在字節(jié)碼中,由解釋器在運行過程中創(chuàng)立內(nèi)存布局,然后再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性?!?】2.2 C/S模式介紹20世紀(jì)90年代出現(xiàn)并迅速占據(jù)主導(dǎo)地位的一種計算模式為客戶機/服務(wù)器模式,簡稱為C/S模式,它實際上就是把主機終端模式中原來全部集中在主機部分的任務(wù)一分為二,保留在主機上的部分負責(zé)集中處理和匯總運算,成為服務(wù)器;而下放到終端

12、的部分負責(zé)為用戶提供友好的交互界面,稱為客戶機。【3】相對于以前的模式,C/S模式最大的改進是不再把所有軟件都裝進一臺計算機,而是把應(yīng)用系統(tǒng)分成兩個不同的角色和兩個不同的地位:一般在運算能力較強的計算機上安裝服務(wù)器端程序,而在一般的PC上安裝客戶機程序。正是由于個人PC機的出現(xiàn)使客戶機/服務(wù)器模式成為可能,因為PC機具有一定的運算能力,用它代替了上面第一種模式的啞終端后,就可以把主機端的一部分工作放在客戶機端完成,從而減輕了主機的負擔(dān),也增加了系統(tǒng)對用戶的響應(yīng)速度和響應(yīng)能力??蛻魴C和服務(wù)器之間通過相應(yīng)的網(wǎng)絡(luò)協(xié)議來進行通訊??蛻魴C向服務(wù)器發(fā)出數(shù)據(jù)請求,服務(wù)器將數(shù)據(jù)傳送給客戶機進行計算,計算完畢,

13、計算結(jié)果可返回給服務(wù)器。這種模式的優(yōu)點充分利用了客戶機的性能,使計算能力大大提高;另外,由于客戶機和服務(wù)器之間的通訊是通過網(wǎng)絡(luò)協(xié)議進行的,是一種邏輯的聯(lián)系,因此物理上在客戶機和服務(wù)器兩端是易于擴充的。C/S模式是目前占主流的網(wǎng)絡(luò)計算模式。該模式在操作過程中采取的是主動請示方式:首先服務(wù)器方要先啟動,并根據(jù)請示提供相應(yīng)服務(wù)(過程如下):(1)打開一個通信通道同時通知本地主機,服務(wù)器愿意在某一個公認地址上接收客戶請求。(2)等待某個客戶請求到達該端口。(3)接收到重復(fù)服務(wù)請求,處理該請求并發(fā)送應(yīng)答信號。(4)返回第二步,等待另一客戶請求。(5)關(guān)閉該服務(wù)器??蛻舳耍?1)打開一個通信通道,并連接到

14、服務(wù)器所在主機的特定端口。(2)向服務(wù)器發(fā)送服務(wù)請求報文,等待并接收應(yīng)答;繼續(xù)提出請求。(3)請求結(jié)束后關(guān)閉通信通道并終止。分布運算和分布管理是客戶機/服務(wù)器模式的特點。最后選擇了C/S模式。2.3 Hibernate框架簡介Hibernate是一種Java語言下的對象關(guān)系映射解決方案。它是一種自由、開源的軟件。它用來把對象模型表示的對象映射到基于SQL 的關(guān)系模型結(jié)構(gòu)中去,為面向?qū)ο蟮念I(lǐng)域模型到傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的映射,提供了一個使用方便的框架。 主要作用有:Hibernate 不僅管理Java 類到數(shù)據(jù)庫表的映射(包括從Java數(shù)據(jù)類型到SQL數(shù)據(jù)類型的映射),還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方

15、法,可以大幅度減少開發(fā)時人工使用SQL 和JDBC 處理數(shù)據(jù)的時間。【4】它的設(shè)計目標(biāo)是將軟件開發(fā)人員從大量相同的數(shù)據(jù)持久層相關(guān)編程工作中解放出來。無論是從設(shè)計草案還是從一個遺留數(shù)據(jù)庫開始,開發(fā)人員都可以采用Hibernate。在應(yīng)用方面,Hibernate對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate可以應(yīng)用在任何使用JDBC的場合,它既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用。最具革命意義的是,Hibernate可以在應(yīng)用EJB(Enterprise JavaBeans是Jav

16、a應(yīng)用于企業(yè)計算的框架)的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。3 系統(tǒng)需求分析前面兩章介紹了課題的選題背景和相關(guān)的技術(shù)基礎(chǔ)和協(xié)議。在本章中將討論一下即時通訊系統(tǒng)的需求分析。3.1即時聊天消息的一般需求3.1.1一般即時消息格式需求(1)所有實體必須至少使用一種消息格式;(2)一般即時消息格式必須定義發(fā)信者和即時收件箱的標(biāo)識;(3)一般即時消息格式必須包含一個讓接收者可以回消息的地址;(4)一般即時信息格式必須允許對信息有效負載的編碼和鑒別(非ASCII內(nèi)容);(5)必須提供擴展和注冊即時消息格式的模式的機制。3.1.2可靠性需求協(xié)議必須存在機制,保證即時消息成功投遞或者投遞失敗的時

17、候,發(fā)信者獲得足夠的信息。3.1.3性能需求(1)即時消息的傳輸必須足夠的迅速;(2)即時消息的內(nèi)容必須足夠豐富;(3)即時消息的長度盡量足夠的長。3.2 即時消息的協(xié)議需求協(xié)議是一系列的步驟,它包括雙方或者多方,設(shè)計它的目的是要完成一項任務(wù)。即時通訊協(xié)議,參與的雙方或者多方是即時通訊的實體。協(xié)議必須是雙方或者多方參與的,一方單獨完成的就不算協(xié)議。這樣在協(xié)議動作的過程中,雙方必須交換信息,包括控制信息、狀態(tài)信息等等。這些信息的格式必須是協(xié)議參與方同意并且遵循的。好的協(xié)議要求清楚、完整,每一步都必須有明確的定義,并且不會引起誤解;對每種可能的情況必須規(guī)定具體的動作。3.3 即時消息的安全需求A發(fā)

18、送即時消息M給B,有以下幾種情況和相關(guān)需求:(1)如果無法發(fā)送,A必須接到確認;(2)如果M被投遞了,B只能接受M一次;(3)協(xié)議必須為B提供方法檢查A發(fā)送了這條信息;(4)協(xié)議必須允許B使用另一條即時信息,回復(fù)信息;(5)協(xié)議必須為A提供方法保證沒有其他個體C可以篡改M;3.4 即時信息加密和鑒別(1)協(xié)議必須提供方法保證通知和即時消息的置信度,未被監(jiān)聽或者破壞;(2)協(xié)議必須提供方法保證通知和即時消息的置信度,未被重排序或者回放;(3)協(xié)議必須提供方法保證通知和即時消息被正確的實體閱讀;(4)協(xié)議必須允許客戶自己使用方法確保信息的不被截獲,不被重放和解密。3.5 即時通訊系統(tǒng)需求3.5.1

19、 注冊需求(1)即時通訊系統(tǒng)擁有多個賬戶,允許多個用戶注冊;(2)一個用戶可以注冊多個ID;(3)注冊所使用的帳號類型為字母ID。3.5.2 通訊需求(1)用戶可以傳輸文本消息;(2)用戶可以傳輸RTF格式消息;(3)用戶可以加密/解密消息等。4 系統(tǒng)設(shè)計在這里我們將該即時通訊系統(tǒng)命名為CHAT,現(xiàn)在對該系統(tǒng)進行總體設(shè)計。采用客戶機/服務(wù)器(C/S)的模式來設(shè)計,是一個2層的C/S結(jié)構(gòu):應(yīng)用程序服務(wù)器應(yīng)用程序客戶端,其分層機構(gòu)如圖1所示。圖1 2層C/S結(jié)構(gòu)示意圖客戶層也叫做應(yīng)用表示層,也就是我們說的客戶端,這是應(yīng)用程序的用戶接口部分。給即時通訊工具設(shè)計一個客戶層具有很多優(yōu)點,這是因為客戶層擔(dān)

20、負著用戶與應(yīng)用間的對話功能。它用于檢查用戶的輸入數(shù)據(jù),顯示應(yīng)用的輸出數(shù)據(jù)。為了使用戶能直接地進行操作,客戶層需要使用圖形用戶接口。若通訊用戶變更,系統(tǒng)只需要改寫顯示控制和數(shù)據(jù)檢查程序就可以了,而不會影響其他兩層。服務(wù)層又叫做功能層,相當(dāng)于應(yīng)用的本體,它是將具體的業(yè)務(wù)處理邏輯編入程序中。例如,用戶需要檢查數(shù)據(jù),系統(tǒng)設(shè)法將有關(guān)檢索要求的信息一次性地傳送給功能層;而用戶登錄后,聊天登錄信息是由功能層處理過的檢索結(jié)果數(shù)據(jù),它也是一次性傳送給表示層的。在應(yīng)用設(shè)計中,必須避免在表示層和功能層之間進行多次的數(shù)據(jù)交換,這就需要盡可能進行一次性的業(yè)務(wù)處理,達到優(yōu)化整體設(shè)計的目的。4.1即時聊天系統(tǒng)的實施原理4.

21、1.1 工作方式和技術(shù)原理典型的IM工作方式如下:登陸CHAT通訊服務(wù)器,獲取一個自建立的歷史的交流對象列表(同事列表),然后自身標(biāo)志為在線狀態(tài),當(dāng)好友列表中的某人在任何時候登錄上線并試圖通過你的計算機聯(lián)系你時,IM系統(tǒng)會發(fā)一個消息提醒你,然后你能與他建立一個聊天會話通道進行各種消息如鍵入文字、通過語音等的交流,從技術(shù)上來說,聊天系統(tǒng)的基本技術(shù)原理如下:第一步,用戶A輸入自己的用戶名和密碼登錄IM服務(wù)器,服務(wù)器通過讀取用戶數(shù)據(jù)庫來驗證用戶身份,如果驗證通過,登記用戶A的IP地址、IM客戶端軟件的版本號及使用的TCP/UDP端口號,然后返回用戶A登錄成功的標(biāo)志,此時用戶A在IM系統(tǒng)中的狀態(tài)為在線

22、(Online Presence)。第二步,根據(jù)用戶A存儲在IM服務(wù)器上的好友列表(Buddy List),服務(wù)器將用戶A在線的相關(guān)信息發(fā)送給也同時在線的IM好友的PC機,這些信息包括在線狀態(tài)、IP地址、IM客戶端使用的TCP端口(Port)號等,IM好友的客戶端收到此信息后將在予以提示。第三步是IM服務(wù)器把用戶A存儲在服務(wù)器上的好友列表及相關(guān)信息回送到他的客戶端機,這些信息包括也在線狀態(tài)、IP地址、IM客戶端使用的TCP端口(Port)號等信息,用戶A的IM客戶端收到后將顯示這些好友列表及其在線狀態(tài)。4.1.2 通訊方式(1)在線直接通訊如果用戶A想與他的在線好友用戶B聊天,他將直接通過服務(wù)

23、器發(fā)送過來的用戶B的IP地址、TCP端口號等信息,直接向用戶B的PC機發(fā)出聊天信息,用戶B的IM客戶端軟件收到后顯示在屏幕上,然后用戶B再直接回復(fù)到用戶A的PC機,這樣雙方的即時文字消息就不再IM服務(wù)器中轉(zhuǎn),而是直接通過網(wǎng)絡(luò)進行點對點的通訊,即對等通訊方式(Peer To Peer)。【5】(2)在線代理通訊用戶A與用戶B的點對點通訊由于防火墻、網(wǎng)絡(luò)速度等原因難以建立或者速度很慢,IM服務(wù)器將會主動提供消息中轉(zhuǎn)服務(wù),即用戶A和用戶B的即時消息全部先發(fā)送到IM服務(wù)器,再由服務(wù)器轉(zhuǎn)發(fā)給對方。4.2軟件設(shè)計流程因為該系統(tǒng)其需求是十分明確的,所以該系統(tǒng)的開發(fā)流程采用瀑布模型進行設(shè)計,分為幾大步驟:先進

24、行需求分析,再是系統(tǒng)設(shè)計,然后是詳細設(shè)計與編碼,其次是軟件的測試,最后是軟件的運行和維護?!?】在實際過程中這些步驟經(jīng)常是重疊和彼此間有信息交換,它不是一個簡單線性過程,而是包括開發(fā)步驟的多個反復(fù)。如圖2所示。需求分析系統(tǒng)設(shè)計詳細設(shè)計與編碼軟件測試軟件運行與維護圖2 即時通訊系統(tǒng)開發(fā)流程圖4.3功能模塊劃分該即時聊天工具按如下過程完成通信:(1)客戶向服務(wù)器注冊,告知服務(wù)器該客戶監(jiān)聽某主題;(2)客戶注冊之后,向服務(wù)器發(fā)送消息;(3)服務(wù)器再把消息發(fā)送給所有監(jiān)聽此主題的客戶。根據(jù)以上描述,該系統(tǒng)功能模塊圖請見圖3。即時聊天系統(tǒng)服務(wù)器端客戶端建立連接存儲數(shù)據(jù)監(jiān)聽用戶新建用戶登 錄通訊交流圖3 通

25、訊系統(tǒng)的功能模塊4.3.1 服務(wù)器端由圖3可知服務(wù)器端完成至少3大功能:建立連接、存儲數(shù)據(jù)和監(jiān)聽客戶。這3大功能的具體含義如下:(1)建立一個ServerSocket連接,不斷偵聽是否有客戶端連接或者斷開連接。(2)服務(wù)器端是一個信息發(fā)送中心,所有客戶端的信息都傳到服務(wù)器端,再由服務(wù)器根據(jù)要求分發(fā)出去。(3)數(shù)據(jù)庫數(shù)據(jù)操作包括將用戶信息存儲到數(shù)據(jù)庫等。4.3.2 客戶端客戶端要完成4大功能:新建立用戶、用戶登錄、通信交流。這些功能的含義如下:(1)新建立用戶:客戶端與服務(wù)器端建立通信信道,向服務(wù)器端發(fā)送新建用戶的信息,接收來自服務(wù)器的信息進行注冊。(2)用戶登錄:客戶端與服務(wù)器端建立通信信道,

26、向服務(wù)器端發(fā)送信息,完成用戶登錄。(3)通信交流:客戶端可完成的信息的編輯、發(fā)送和接收等功能。4.4 數(shù)據(jù)庫概要設(shè)計因為本系統(tǒng)采用的是2級C/S結(jié)構(gòu)模式,所以,為了減少服務(wù)器的存儲量,方便程序設(shè)計,本系統(tǒng)只對用戶信息進行存儲。利用JAVA中的hibernate框架技術(shù)進行存儲。在Hibernate中,各表的映射文件.hbm.xml可以通過工具生成,在本系統(tǒng)中,用戶表信息可以用Xml代碼實現(xiàn)。用戶表(user)表1 用戶信息表名稱字段名稱類別主鍵非空用戶編號id數(shù)字是是登錄名CustName文本否是登錄密碼CustPassword文本否是年齡Age文本否是性別Sex文本否是電子郵箱email文本

27、否是5 詳細設(shè)計5.1 服務(wù)器端的設(shè)計與實現(xiàn)作為C/S模式下的系統(tǒng)開發(fā),很顯然服務(wù)器端程序的設(shè)計是非常重要的。下面就服務(wù)器端的相關(guān)程序模塊進行設(shè)計,并一定程度上實現(xiàn)了相關(guān)功能。5.1.2 主服務(wù)器類的設(shè)計設(shè)計服務(wù)器時需要考慮如下幾個因素:(1)服務(wù)器的運行速度;(2)服務(wù)器的響應(yīng)速度,包括新建連接和發(fā)送數(shù)據(jù)的響應(yīng)速度;(3)I/O吞吐量;(4)其他:流量控制(QoS)、安全性。針對TCP/IP協(xié)議的數(shù)據(jù)結(jié)構(gòu),設(shè)計服務(wù)器的程序結(jié)構(gòu)需要考慮以下的因素:(1)多線程;(2)多進程;(3)單線程。主服務(wù)器類實現(xiàn)了服務(wù)器端的多線程,使用SeverSocket s=newServerSocket(1001

28、)語句在1001端口創(chuàng)建套接口;使用new ServerThread(socket)語句創(chuàng)建新的線程。主服務(wù)器類調(diào)用ServerThread類,而每個ServerThread實體就是一個獨立的線程,剛好對應(yīng)于客戶端的連接請求響應(yīng)線程。服務(wù)器端有一個(或多個)進程在指定的端口等待客戶的連接信息,一旦連接成功,就可以按設(shè)計的數(shù)據(jù)交換方法和格式進行數(shù)據(jù)傳輸??蛻舳酥辉谛枰臅r候向服務(wù)器端發(fā)出連接請求。實現(xiàn)界面如圖4。圖4 服務(wù)器啟動界面現(xiàn)就其中一些核心代碼進行講解。public class AppServer extends Thread其中public是JAVA的關(guān)鍵字,用來表示該類是共有,在整個

29、程序里都可以訪問到它;Class表示類定義,它后面接著用戶定義的類的類名為AppServer;extends表示繼承的意思,他后面的類Thread是子類,能夠繼承父類AppServer所定義的一些變量。這條語言表示的意思就是聲明一個公共類AppServer,用子類Thread繼承父類AppServer中的一些變量。static boolean newMessage。其中,static是關(guān)鍵字,表示靜態(tài)變量,Boolean表示變量類型為布爾型,變量名為newMessage。這條語句的意思是定義一個靜態(tài)變量newMessage,它的類型為布爾型。值得強調(diào)的是布爾型數(shù)據(jù)只有兩個值true和false

30、,并且它們不對應(yīng)人數(shù)整數(shù)值。if(start) sFrame.txtStatus.setText(已啟動.);log(null,服務(wù)器已啟動. );else sFrame.txtStatus.setText(關(guān)閉中.);這是一條if條件判斷語句,它表示變量start如果不為空,那么執(zhí)行語句第一個大括號中的語句,如果為空,則執(zhí)行else中的語句。其中,log為輸出語句,表示在窗口中輸出“服務(wù)器已啟動”信息。public void run() try while (start) Socket client = serverSocket.accept();Connection con = new C

31、onnection(client, u, v, userInfo); catch (IOException e) log(e, 不能監(jiān)聽!);這個函數(shù)的作用是監(jiān)聽用戶信息,void表示定義的函數(shù)不需要返回值,while是循環(huán)語句關(guān)鍵字,在語句中的意思為直到start的值不為空,將循環(huán)執(zhí)行后面括號的語句,直到start值為空后,循環(huán)才結(jié)束。Connection con表示連接用戶信息。Catch是對java中的異常進行捕獲,并且能夠拋出異常,便于程序能夠正常運行。5.1.2 登錄驗證模塊系統(tǒng)的登錄模塊是比較重要的,這是用戶的一個身份驗證,是通訊系統(tǒng)必須的一個功能模塊。如果客戶端輸入的字符串表方式

32、需要登錄,那么服務(wù)器在接收到該信息后連接數(shù)據(jù)庫,準(zhǔn)備從數(shù)據(jù)庫選擇昵稱和密碼。服務(wù)器接收到客戶端發(fā)送過來的號碼和密碼信息后,設(shè)定數(shù)據(jù)庫查尋條件,并執(zhí)行數(shù)據(jù)庫查尋,通過比較輸入的用戶名和密碼數(shù)據(jù)庫信息來卻請用戶的登錄是否成功。以下為登陸驗證的流程圖。符合不符合登陸系統(tǒng)輸入信息驗證進入系統(tǒng)圖5 用戶登錄流程圖5.1.3 注冊處理模塊新建用戶是即時通訊工具的一個基本功能。用戶新建過程也在線程監(jiān)聽函數(shù)run()中。新建用戶的過程是這樣的:首先使用Register_Customer()方法加載數(shù)據(jù)庫驅(qū)動類;然后使用dao.getUser()方法獲取數(shù)據(jù);在獲取注冊名時,進行判斷,查看用戶名是否重復(fù),如果重

33、復(fù),則向客戶端彈出提示信息,見圖6;如果不重復(fù),服務(wù)器接收客戶端用戶發(fā)送的昵稱、密碼、用戶E-mail等信息,執(zhí)行數(shù)據(jù)庫添加操作完成用戶的創(chuàng)建;最后向用戶反饋注冊成功信息。圖6 注冊名重復(fù)提示信息5.2 客戶端的設(shè)計與實現(xiàn)前一章介紹了服務(wù)器端的設(shè)計與實現(xiàn),對于C/S模式的系統(tǒng)而言,還必須對系統(tǒng)的客戶端進行設(shè)計和實現(xiàn)。下面就來解決這樣一個問題。客戶端通過Socket與服務(wù)器建立連接。服務(wù)器與客戶都通過構(gòu)造BufferedReader、PrintWriter來建立輸入流和輸出流,雙方通過該輸入流和輸出流來相互傳遞信息。只要收到客戶端的連接請求,服務(wù)器利用accept()函數(shù)返回一個新建的Socke

34、t對象,隨后客戶端向服務(wù)器發(fā)送消息,諸如注冊、登錄和查找同事等請求,服務(wù)器收到請求后,針對不同的消息處理請求。5.2.1 用戶注冊模塊當(dāng)用戶向服務(wù)器端發(fā)出注冊請求后,客戶端將向服務(wù)器發(fā)送客戶傳遞的信息,諸如客戶的昵稱、性別、個人資料等信息。等服務(wù)器接收完畢后,服務(wù)器會通過hibernate框架讀取數(shù)據(jù)庫信息,并進行判斷,最后在客戶端收到服務(wù)器的反饋信息?,F(xiàn)對部分關(guān)鍵語句進行講解。public class Register extends JFrame implements ActionListener Toolkit toolkit=Toolkit.getDefaultToolkit();JB

35、utton btnOk,btnCancel,btnClear;public Register(String ip) btnOk=new JButton(確定(O); btnOk.setMnemonic(O); btnOk.setToolTipText(保存注冊信息); btnOk.setBounds(250,135,80,25);Implement繼承于接口類時用的關(guān)鍵詞【7】,在數(shù)據(jù)接口位置使用,在這里表示類ActionListen類繼承類Register。JButton btnOk,btnCancel,btnClear。這條語句中,JButton其實是一個類,名為JButton按鈕類,它是

36、JAVA中自帶的一種控件,當(dāng)鼠標(biāo)移入、移出、被點擊所定義的3個變量時,會觸發(fā)JButton類,從而執(zhí)行相應(yīng)的操作。如在類Register中,當(dāng)鼠標(biāo)點擊“確定”按鈕時,則會觸發(fā)類JButton定義的變量btnOk,并且為其賦值,進而調(diào)用setToolTipText方法,將注冊信息進行保存。而setBounds類是JAVA自帶類,他能夠設(shè)置組件位置【8】,即確定注冊窗口位置。見圖7。圖7 用戶注冊界面5.2.2 用戶登錄當(dāng)用戶點擊登錄時,客戶端發(fā)起請求與服務(wù)端建立連接,登錄信息首先在客戶端做驗證,然后通過填寫的服務(wù)器IP地址申請與服務(wù)端建立連接。而在服務(wù)器端,有一個主線程專門創(chuàng)建SOCKET服務(wù),

37、等待客戶端的連接,每當(dāng)客戶端發(fā)起連接的申請時,與之建立連接,并創(chuàng)建一個線程,將建立的連接交給這個線程處理,并將連接存入一個集合中,用于后續(xù)業(yè)務(wù)的處理。然后服務(wù)器將反序列化客戶端傳輸過來的數(shù)據(jù),生成一個用戶對象。從中獲取登錄填寫的信息,根據(jù)用戶名和密碼在數(shù)據(jù)庫中查找數(shù)據(jù),如果能夠找到表示登錄成功,反之,登錄不成功。最后將登錄的結(jié)果通過文本發(fā)送給客戶端發(fā)送給服務(wù)端。最后,如果通過驗證,得到一個標(biāo)志,進入聊天主窗體,否則彈出登錄失敗的對話框,讓用戶重新登錄。登陸界面見圖8圖8 用戶登陸界面現(xiàn)對部分關(guān)鍵代碼進行講解:public void actionPerformed(ActionEvent ae)

38、Object source=ae.getSource();if (source.equals(btnLogin) if(txtUserName.getText().equals() | pwdPassword.getText().equals() JOptionPane op1=new JOptionPane(); op1.showMessageDialog(null,用戶名或密碼不能為空); else strServerIp=txtServer.getText(); login(); 該語句表示的意思為接受用戶登陸信息,如果用戶名或者密碼為空,則彈出提示信息,如果不為空,則調(diào)用login方法

39、。這里equals表示接受變量的值;“|”表示“或”的意思,;showMessageDialog是JAVA的自帶控件,作用是在當(dāng)前界面彈出對話框;關(guān)鍵字new,是一種調(diào)用方法,表示能夠直接調(diào)用類的構(gòu)造方法。5.2.3 在線用戶顯示設(shè)計用戶完成登錄后,客戶端與服務(wù)器端建立連接。連接建立成功后,客戶向服務(wù)器請求讀取在線人員名單;服務(wù)器收到該請求,開始讀取數(shù)據(jù)庫中的user表并得到同事的號碼,向客戶端發(fā)送這些信息;客戶收到服務(wù)器信息后,在主窗口顯示顯現(xiàn)成員的昵稱。其實現(xiàn)代碼如下:for (int i=0;imessobj.userOnLine.size();i+) String User=(Stri

40、ng)messobj.userOnLine.elementAt(i); lstUserList.addItem(User); 這里采用了for循環(huán),定義變量i,初值為0,只要i滿足;imessobj.userOnLine.size()這個條件,循環(huán)將執(zhí)行一次。執(zhí)行完一次循環(huán)后i的值自動加1,這里的messobj.userOnLine.size()表示在線用戶的人數(shù),lstUserList.addItem(User)表示顯示用戶的昵稱。5.2.4 聊天信息發(fā)送與接收聊天信息的發(fā)送與接收都是通過Socket類實現(xiàn)的。使用Socket對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會

41、話;會話完成后,關(guān)閉Socket。也就是說,在服務(wù)端開啟socket服務(wù),客戶端每一次連接成功時也都會同時創(chuàng)建一個線程來處理這次連接的請求,而該連接會被保存在一個集合中,直到服務(wù)結(jié)束,連接關(guān)閉,該線程也會結(jié)束,同時從連接的集合中移除該連接。(1)信息發(fā)送用戶在每次發(fā)送信息時,首先向服務(wù)器發(fā)送的是自己信息和發(fā)送對象信息,然后再通過Socket類向服務(wù)器發(fā)送信息。當(dāng)然,在每次輸入信息后,輸入信息框的內(nèi)容將會被清空。關(guān)鍵代碼如下: public void sendMessage() chatobj.chatUser=strLoginName; chatobj.chatMessage=txtMessa

42、ge.getText(); chatobj.chatToUser=String.valueOf(cmbUser.getSelectedItem(); chatobj.whisper=chPrivateChat.isSelected()?true:false;/向服務(wù)器發(fā)送信息 trySocket toServer=new Socket(strServerIp,1001); ObjectOutputStream outObj=new ObjectOutputStream(toServer.getOutputStream(); outObj.writeObject(chatobj); txtMes

43、sage.setText(); /清空文本框 outObj.close(); catch(Exception e)其中,方法中的前三句表示系統(tǒng)獲取發(fā)送信息者的昵稱,發(fā)送信息內(nèi)容以及發(fā)送對象的昵稱;chPrivateChat.isSelected()?true:false這是一個判斷語句,表示信息值是否為空,如果isSelected方法有值,那么將true賦給chatobj.whisper,如果為空,則賦false。在上文中,我們講到了catch有拋出異常的作用,而trycatch也是具有相同的功能,try 塊塊是需要捕獲異常的,因為文件有可能不存在,會導(dǎo)致程序崩潰,所以直接捕獲,也可以直接th

44、rows 出去,讓調(diào)用該方法的方法去捕獲,從而使程序能夠正常進行。此外,函數(shù)Socket(strServerIp,1001) 用來創(chuàng)建一個能夠進行網(wǎng)絡(luò)通信的套接字。參數(shù)strServerIp為通信協(xié)議的協(xié)議族,1001則為服務(wù)器IP。而outObj.writeObject(chatobj)的作用則是把調(diào)用writeObject方法,將信息發(fā)送到服務(wù)器。(2)信息輸出本即時聊天系統(tǒng)的信息輸出原理是將所有輸入信息通過socket類向服務(wù)器發(fā)送,然后直接從服務(wù)器中突出信息。關(guān)鍵代碼如下:Socket toServer;toServer=new Socket(strServerIp,1001);/將信

45、息發(fā)往服務(wù)器Message messobj=new Message();messobj.username = strLoginName;ObjectOutputStream streamtoserver=new ObjectOutputStream (toServer.getOutputStream();streamtoserver.writeObject(Message)messobj);/收來自服務(wù)器的信息由于上文以對很多方法進行講解,現(xiàn)主要對ObjectOutputStream進行講解。ObjectOutputStream 將 Java 對象的基本數(shù)據(jù)類型和圖形寫入 OutputStre

46、am。可以使用 ObjectInputStream 讀?。ㄖ貥?gòu))對象。通過在流中使用文件可以實現(xiàn)對象的持久存儲。如果流是網(wǎng)絡(luò)套接字流,則可以在另一臺主機上或另一個進程中重構(gòu)對象。也就是說通過ObjectOutputStream 將toServer.getOutputStream()進行重構(gòu),從而將服務(wù)器接受的信息重構(gòu)到客戶機上,最后通過streamtoserver.writeObject()方法將信息寫在客戶端上。5.3 數(shù)據(jù)庫設(shè)計在前文我們已經(jīng)分析了數(shù)據(jù)庫的實現(xiàn)是采用了hibernate框架中的.XML映射。以下則為實現(xiàn)的關(guān)鍵代碼:- 其中,package=org.seler.bean表示調(diào)

47、用該框架bean中的數(shù)據(jù)包;auto-import=true表示hibernate框架中的將映射文件實體;property表示元素定義,name表示字段名;not-null表示是否設(shè)置該字段為空;unique表示是否設(shè)置該字段為唯一值;optimistic-lock指定此屬性做更新操作時是否需要樂觀鎖定; lazy指定是否采用延遲加載及加載策略,設(shè)置為false,表示此關(guān)聯(lián)對象不采用延遲加載。6 結(jié)論眾所周知,互聯(lián)網(wǎng)從誕生以來,就開始影響著地球的每一個角落,給予了人類一種全新的生活方式,隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,新興的技術(shù)也層出不窮,即時通信系統(tǒng)就是這么一種以聊天形式為主的廣受歡迎的互聯(lián)網(wǎng)技術(shù)

48、。當(dāng)然,該課題討論的即時通訊系統(tǒng)是定位于內(nèi)部局域網(wǎng),供班級內(nèi)部人員使用的通訊系統(tǒng)。即時通信中最基本的功能就是通過計算機之間的文本數(shù)據(jù)的互換的形式實現(xiàn)思想的交流和溝通,它的優(yōu)點是方便快捷,為人們之間創(chuàng)建了一種新型的、廉價的、快速的、簡便的溝通方式。首先,本系統(tǒng)完全按照軟件工程的瀑布模型進行開發(fā),雖然缺少部分開發(fā)文檔,但本論文則是按照需求分析,概要設(shè)計,詳細設(shè)計,軟件的運行和測試等的結(jié)構(gòu)進行安排的。其次,本即時聊天系統(tǒng)采用了C/S模型。服務(wù)器在C/S模型中處于一個中心地位。服務(wù)器一般同時為多個客戶提供服務(wù),這就造成了服務(wù)器設(shè)計的復(fù)雜性。即時通訊服務(wù)器是數(shù)據(jù)中心,它是客戶活動的中介,需要同時應(yīng)對眾多

49、客戶的請求。再次,本文并沒有采用復(fù)雜的SQL,ORICLE等數(shù)據(jù)庫,而是通過hibernate框架對數(shù)據(jù)進行映射,然后利用*.hbm.xml將數(shù)據(jù)進行存儲。最后,在編寫這個聊天程序時遇到許許多多的問題,比如JAVA的圖形化界面如何編寫,該怎樣布局。這是java的一個弱項,不像VB,DELPHI等語言可以使用已有的控件。后來也在網(wǎng)上找到一些setBounds類,雖然調(diào)用起來比較麻煩,但是熟悉后也覺得不是那么難。經(jīng)過一段時間的學(xué)習(xí)和工作,該即時聊天系統(tǒng)已經(jīng)初具雛形,實現(xiàn)了網(wǎng)絡(luò)即時通信工具的主要功能,為實現(xiàn)一個嶄新的可跨平臺的Java即時聊天工具打下了基礎(chǔ)。目前該即時聊天系統(tǒng)的1.0版本已經(jīng)投入試運行中。參考文獻1 尹治本.計算機網(wǎng)絡(luò)及應(yīng)用教程M.成都:西南交通大學(xué)出版社.2002.8. 2熊曉敏,劉瑛,陳惠清.基于Java的網(wǎng)絡(luò)即時通訊系統(tǒng)的設(shè)計與實現(xiàn)J.計算機與現(xiàn)代化,2005(12): 89-92. 3 羅軍舟,黎波濤,楊明,吳俊,黃健.TCP/IP協(xié)議及網(wǎng)絡(luò)編程技術(shù).北京:清華大學(xué)出版社.2005.8. 4 Bruce Eckel著,侯捷翻譯.Java編程思想M.北京:機械工業(yè)出版社出版,2000.9. 5

溫馨提示

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

評論

0/150

提交評論