版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p> 1、課程設(shè)計(jì)目的 ------------------------------------------------------------------------------1</p><p> 2、學(xué)習(xí)目標(biāo)----------------------------------------------
2、----------------------------------------1</p><p> 3、 背景介紹------------------------------------------------------------------------------------1</p><p> 3.1 業(yè)務(wù)背景---------------------------------
3、------------------2</p><p> 3.2 技術(shù)背景---------------------------------------------------3</p><p><b> 4. 需求分析</b></p><p> 4.1功能需求分析-------------------------------------
4、-----------5</p><p> 4.2 業(yè)務(wù)對象分析-----------------------------------------------8</p><p> 4.3 驗(yàn)收測試要求-----------------------------------------------9</p><p><b> 5、系統(tǒng)設(shè)計(jì)</b&g
5、t;</p><p> 5.1 總體設(shè)計(jì)--------------------------------------------------11</p><p> 5.2 詳細(xì)設(shè)計(jì)--------------------------------------------------14</p><p><b> 系統(tǒng)實(shí)現(xiàn)</b></p
6、><p> 6.1客戶端實(shí)現(xiàn)-------------------------------------------------24</p><p> 6.2服務(wù)器實(shí)現(xiàn)-------------------------------------------------25</p><p> 7、 小結(jié)----------------------------------
7、-------------------------------------------------------28</p><p> 8、 展望-----------------------------------------------------------------------------------------28</p><p><b> 聊天室系統(tǒng)</b&
8、gt;</p><p><b> 一、課程設(shè)計(jì)目的</b></p><p> 《面向?qū)ο蟪绦蛟O(shè)計(jì)》是一門實(shí)踐性很強(qiáng)的計(jì)算機(jī)專業(yè)基礎(chǔ)課程,課程設(shè)計(jì)是學(xué)習(xí)完該課程后進(jìn)行的一次較全面的綜合練習(xí)。其目的在于通過實(shí)踐加深學(xué)生對面向?qū)ο蟪绦蛟O(shè)計(jì)的理論、方法和基礎(chǔ)知識的理解,掌握使用Java語言進(jìn)行面向?qū)ο笤O(shè)計(jì)的基本方法,提高運(yùn)用面向?qū)ο笾R分析實(shí)際問題、解決實(shí)際問題的能力。&
9、lt;/p><p><b> 二、學(xué)習(xí)目標(biāo):</b></p><p> 1、理解基于網(wǎng)絡(luò)的C/S模式的軟件系統(tǒng)結(jié)構(gòu),掌握網(wǎng)絡(luò)編程的基本概念。2、了解Java 的多線程機(jī)制,掌握J(rèn)ava多線程技術(shù)的應(yīng)用。3、熟練掌握基于TCP協(xié)議的Socket編程。4、了解Socket編程的協(xié)議約定,掌握簡單應(yīng)用協(xié)議的開發(fā)。</p><p> 5、進(jìn)一步
10、鞏固發(fā)展團(tuán)隊(duì)協(xié)作能力。</p><p><b> 三、 背景介紹</b></p><p><b> 1、 業(yè)務(wù)背景</b></p><p> 隨著網(wǎng)絡(luò)社會的不斷發(fā)展,具有相同興趣的網(wǎng)民需要互相遠(yuǎn)程交流,既要能省錢又要能即時交互,電話太貴、email又嫌慢,所以開發(fā)一個類似QQ 的及時通訊系統(tǒng)就變得非常有意義了?!癏a
11、ppy Chat”聊天系統(tǒng)應(yīng)運(yùn)而生,它較之QQ的唯一好處是自主開發(fā),用的放心,更適合在局域網(wǎng)內(nèi)使用。它提供的功能遠(yuǎn)不如QQ豐富,但應(yīng)具有如下功能:(1)與聊天室成員一起聊天;(2)可以與聊天室成員私聊;(3)用戶注冊、登錄;(4)服務(wù)器監(jiān)控聊天內(nèi)容;(5)服務(wù)器發(fā)送通知;(6)服務(wù)器踢人;(7)保存服務(wù)器日志。(8)保存用戶聊天信息。</p><p><b> 2、 技術(shù)背景</b><
12、;/p><p> 本系統(tǒng)要求使用java技術(shù)開發(fā),使用文件保存數(shù)據(jù),集成開發(fā)環(huán)境使用eclipse。開發(fā)者應(yīng)有java程序設(shè)計(jì)語言、SWING基本GUI組件、多線程、文件使用、socket編程、使用eclipse的基本知識和技能。系統(tǒng)采用兩層C/S體系結(jié)構(gòu),C端負(fù)責(zé)通過GUI與客戶交互,實(shí)現(xiàn)注冊、登陸、收發(fā)信息、退出等功能; S端是聊天系統(tǒng)的應(yīng)用服務(wù)器,主要有處理用戶注冊、登錄、用戶收發(fā)信息、用戶退出等功能。C端和
13、S端是通過網(wǎng)絡(luò)交互的,其基本原理如圖1所示:</p><p> 圖1 C/S通訊基本原理圖</p><p> 首先服務(wù)器啟動,它會建立一個專門用于接收客戶端連接請求的“傾聽Socket”(相當(dāng)于總服務(wù)臺,有固定的IP地址和端口號),然后等待客戶的連接請求。</p><p> 當(dāng)用戶想聊天時,從界面輸入信息,然后與服務(wù)器建立Socket連接(連接時應(yīng)指定服務(wù)器的
14、IP地址和端口號,而客戶端socket的端口由本方操作系統(tǒng)從空閑端口中確定),服務(wù)器端的“傾聽Socket”收到連接請求后,一般會接受連接請求,并生成一個服務(wù)端socket(其端口號由服務(wù)端操作系統(tǒng)從空閑端口中確定),專門負(fù)責(zé)與此客戶端socket的通信。一旦連接請求成功,客戶端將信息及請求通過本方socket的輸出流發(fā)送給服務(wù)器端相應(yīng)的socket,服務(wù)端則通過服務(wù)器端Socket的輸入流接受客戶端傳輸過來的信息及請求,分析是何請求,
15、然后根據(jù)請求類型,進(jìn)行相應(yīng)的處理(如登錄、轉(zhuǎn)發(fā)信息等)。服務(wù)方也可以根據(jù)需要,通過socket的輸出流發(fā)信息和請求給客戶端(公告)。客戶方和服務(wù)方都可以通過關(guān)閉本方的socket而結(jié)束一次通訊過程。</p><p> 不難發(fā)現(xiàn)服務(wù)器需要能同時接受多個客戶的請求,為了實(shí)現(xiàn)這一點(diǎn),一般使用多線程機(jī)制來處理,對每一個客戶端連接通訊,服務(wù)器端都有一個線程專門負(fù)責(zé)處理(相當(dāng)于一個服務(wù)員專門服務(wù)一個以IP地址和端口號唯一標(biāo)
16、識的客戶)。</p><p> 上述方式兩個聊天者之間通信必須通過服務(wù)器進(jìn)行轉(zhuǎn)發(fā),聊天者多時,顯然服務(wù)器是個性能瓶頸。能不能聊天者之間直接通信?當(dāng)然可以,這是所謂的P2P聊天室,缺點(diǎn)是對聊天者缺乏集中監(jiān)管的手段。也有界于二者之間的,即有一服務(wù)器,接受注冊和登錄,實(shí)際聊天雙方通信時,仍然是直接通信,此時服務(wù)器相當(dāng)于一個婚姻介紹所,只管牽線搭橋,具體談還是聊天者自己的事。</p><p>
17、 本文主要采用聊天信息通過服務(wù)器轉(zhuǎn)發(fā)的方式,而且只支持一個聊天室。因?yàn)槠渌湫拖到y(tǒng)如電子郵件系統(tǒng),F(xiàn)TP系統(tǒng)均采用類似結(jié)構(gòu),WEB服務(wù)系統(tǒng)本質(zhì)上也是C/S系統(tǒng),只不過其客戶端是瀏覽器,采用了HTTP通信協(xié)議和HTML,所以變成了B/S結(jié)構(gòu),可以認(rèn)為是C/S的一個具體應(yīng)用,其機(jī)理是相似的。</p><p><b> 四、需求分析</b></p><p><b&g
18、t; 1、功能需求分析</b></p><p> 系統(tǒng)的主要功能已在業(yè)務(wù)分析中有所介紹,在這里需要對每個功能從使用者角度作較為具體的分析。很明顯,整個系統(tǒng)的功能可以自然地分為客戶端和服務(wù)器端。以下是主要用例描述</p><p><b> 一 客戶端</b></p><p><b> 1 . 注冊</b>
19、</p><p> ?。?)客戶啟動程序,顯示出登陸界面</p><p> (2)客戶選擇其中的注冊按鈕,系統(tǒng)顯示注冊界面</p><p> (3)客戶填寫用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件,按確定按鈕</p><p> ?。?)系統(tǒng)驗(yàn)證密碼和確認(rèn)密碼是否相符、用戶名(不能重復(fù))、電子郵件格式、年齡(大于10小于100)<
20、/p><p> ?。?)系統(tǒng)發(fā)送上述信息及“注冊請求”到服務(wù)端,等待服務(wù)端返回“注冊成功”消息</p><p> ?。?)系統(tǒng)提示注冊成功</p><p> ?。?)系統(tǒng)返回登陸界面</p><p> 若驗(yàn)證失敗,提示“重新輸入”</p><p> 若服務(wù)端返回“注冊失敗”,提示“注冊失敗”</p>&l
21、t;p> 若服務(wù)端返回“注冊失敗 用戶名重名”,則提示“注冊失敗 用戶重名”。</p><p><b> 2. 登錄</b></p><p> ?。?)客戶啟動程序,顯示出登陸界面</p><p> ?。?)客戶填寫用戶名、密碼,服務(wù)器IP地址,按登陸按鈕</p><p> ?。?)系統(tǒng)驗(yàn)證用戶名、密碼,不能
22、為空、密碼字符長度為6-10</p><p> ?。?)系統(tǒng)發(fā)送用戶名、密碼及“登陸請求”到服務(wù)端,等待服務(wù)端返回“登錄成功”消息</p><p> (5)若成功系統(tǒng)顯示客戶端主界面(收發(fā)消息界面)</p><p> 若用戶名、密碼驗(yàn)證失敗,系統(tǒng)提示;“用戶名或密碼錯”,重復(fù)3次若仍不能通過驗(yàn)證則客戶端程序退出。</p><p> 若服
23、務(wù)端返回“登錄失敗”,系統(tǒng)提示“用戶名或密碼錯”。</p><p><b> 3. 發(fā)送信息</b></p><p> ?。?)在客戶端主界面,用戶輸入消息,選擇是群發(fā)還是私聊,若是私聊還要選擇對方用戶名,按發(fā)送按鈕</p><p> ?。?)系統(tǒng)驗(yàn)證消息長度, 私聊要求目的方用戶名非空。</p><p> ?。?)系
24、統(tǒng)發(fā)送信息及“接收消息請求”到服務(wù)器端,等待服務(wù)端返回“接收成功”消息(等待返回消息可?。?。</p><p> (4)系統(tǒng)提示信息已發(fā)送</p><p> 若發(fā)送不成功,則系統(tǒng)提示“發(fā)送失敗”。</p><p><b> 4. 接收信息</b></p><p> ?。?)客戶端系統(tǒng)啟動,進(jìn)入主界面后,會顯示消息接收
25、框</p><p> ?。?)其他客戶或服務(wù)端系統(tǒng)本身發(fā)送消息過來,系統(tǒng)接收,分析確認(rèn)是”</p><p> 接收消息請求“,則分析提取出消息</p><p> (3) 在消息接收框逐條顯示發(fā)送者姓名、發(fā)送的消息。</p><p><b> 5 退出</b></p><p> ?。?)用戶
26、請求退出,按退出按鈕</p><p> (2)系統(tǒng)確認(rèn)用戶退出(對話框)</p><p> ?。?)系統(tǒng)發(fā)“退出請求”到服務(wù)端,等待服務(wù)端返回“退出成功”(等待返回消息可?。?lt;/p><p> (4)客戶端系統(tǒng)關(guān)閉連接,程序退出</p><p><b> 二 服務(wù)器端</b></p><p>
27、;<b> 1. 用戶注冊</b></p><p> ?。?)系統(tǒng)啟動后,等待客戶請求</p><p> (2)客戶請求到,接受請求,分析確認(rèn)是“注冊請求”</p><p> ?。?)系統(tǒng)讀取信息,分析并再次驗(yàn)證用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件。</p><p> (4)系統(tǒng)根據(jù)用戶名,在已有客戶記錄中
28、查詢,確認(rèn)沒有重名</p><p> (5)系統(tǒng)將用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件信息保存</p><p> ?。?)系統(tǒng)向客戶端發(fā)送“注冊成功”消息</p><p> ?。?)系統(tǒng)在監(jiān)控界面上寫信息:xx客戶名 已注冊 注冊時間</p><p> 若重名,向客戶端發(fā)“注冊重名”消息</p><p>
29、 若注冊失敗,向客戶端發(fā)“注冊失敗”消息</p><p><b> 2. 用戶登錄</b></p><p> ?。?)系統(tǒng)啟動后,等待客戶請求</p><p> ?。?)客戶請求到,接受請求,分析確認(rèn)是“登錄請求”</p><p> ?。?)系統(tǒng)讀取信息,驗(yàn)證用戶名、密碼是否存在</p><p&g
30、t; ?。?)系統(tǒng)驗(yàn)證是否已經(jīng)登錄</p><p> ?。?)系統(tǒng)驗(yàn)證用戶是否已超過最大用戶數(shù)</p><p> ?。?) 系統(tǒng)將客戶加入聊天室,通知其它客戶“新用戶加入”</p><p> ?。?)系統(tǒng)向客戶端發(fā)送“登錄成功”消息</p><p> (8)系統(tǒng)在監(jiān)控界面上寫信息:客戶名:已登錄 登錄時間</p><p&
31、gt; 若驗(yàn)證失敗,向客戶端發(fā)“驗(yàn)證失敗”消息</p><p> 3. 發(fā)送信息(用于管理員向聊天者發(fā)送公告信息)</p><p> ?。?)系統(tǒng)啟動后,等待管理員請求</p><p> ?。?)管理員在監(jiān)控界面輸入消息,確定發(fā)送類型(群發(fā)還是私聊),若私聊還需指定目的用戶名,按發(fā)送按鈕</p><p> (3)系統(tǒng)讀取信息,分析并確認(rèn)
32、是群發(fā)還是私聊</p><p> ?。?)若是群發(fā),則將信息發(fā)給聊天室內(nèi)其它所有用戶;若是私聊,則將消息發(fā)給指定的用戶。</p><p> ?。?)系統(tǒng)在監(jiān)控界面上寫信息:管理員--〉消息 </p><p> 若出現(xiàn)異常,提示“發(fā)送失敗”。</p><p><b> 4 接收信息</b></p>&
33、lt;p> ?。?)系統(tǒng)啟動后,等待客戶請求</p><p> (2)客戶請求到,接受請求,分析確認(rèn)是“接收信息請求”</p><p> ?。?)系統(tǒng)讀取信息,分析并確認(rèn)是群發(fā)還是私聊</p><p> ?。?)若是群發(fā),則將信息發(fā)給聊天室內(nèi)其它所有用戶</p><p> ?。?)系統(tǒng)向客戶端發(fā)送“接收成功”消息(可省)</p&
34、gt;<p> ?。?)系統(tǒng)在監(jiān)控界面上寫信息:xx客戶名--〉消息 群發(fā)/私聊</p><p> 若出現(xiàn)異常,向客戶端發(fā)“接收失敗”消息(可省)</p><p><b> 用戶退出</b></p><p> ?。?)系統(tǒng)啟動后,等待客戶請求</p><p> ?。?)客戶請求到,接受請求,分析確認(rèn)是
35、“用戶退出請求”</p><p> (3)系統(tǒng)從聊天室刪除客戶,并通知其它用戶“客戶退出”</p><p> ?。?)系統(tǒng)向客戶端發(fā)“退出成功”(可?。?,關(guān)閉連接。</p><p> 聊天系統(tǒng)主要應(yīng)用在局域網(wǎng),在性能方面要求,客戶到客戶間消息傳輸時間不大于5s,傳輸可靠性要求95%的情況下,消息可以可靠傳到目的地,同時在線用戶數(shù)量不小于200。</p>
36、;<p> 友情提示:本需求分析只是分析了主要的用戶使用情況,在對客戶端進(jìn)行分析時,聊天者是一個接口,服務(wù)方也是一個接口,在對服務(wù)端進(jìn)行分析時,客戶端是一個接口,服務(wù)方管理員是另一個接口。在接口處只關(guān)心接口處的輸入輸出,并不關(guān)心接口里面是如何實(shí)現(xiàn)的。例如客戶端登陸用例分析時,客戶發(fā)“登錄請求”信息到服務(wù)端,此時只需關(guān)注服務(wù)方返回情況,所以只需等待獲取服務(wù)端返回信息,而無需知道服務(wù)方是如何處理的。服務(wù)方如何處理是在服務(wù)端登
37、錄用例中描述的。</p><p> 隱含需求的發(fā)現(xiàn)。在登錄用例中,客戶和服務(wù)方都有登錄用例,合作完成一個完整的登錄過程,密碼和用戶名的驗(yàn)證一般都能想到,但限制用戶數(shù)量,同一用戶不能重復(fù)登錄則不太容易想到,這里經(jīng)驗(yàn)就會起作用,這是第一步,想到了就要向客戶提出(必要時解釋),具體要不要做由客戶決定,則是第二步。這里還有一個度的把握,因?yàn)椴豢赡苋魏吻闆r都要向客戶解釋。經(jīng)驗(yàn)如何來?學(xué)習(xí)前人的經(jīng)驗(yàn)并運(yùn)用到自己的項(xiàng)目開發(fā)中
38、,體會轉(zhuǎn)化為自己的東西應(yīng)該是個有效途徑。</p><p> 優(yōu)先級的劃分。作為聊天系統(tǒng),其主要功能就是聊天,客戶間互相發(fā)送消息,所以優(yōu)先級最高的是客戶端的發(fā)送、接收、退出用例,服務(wù)器端的接收、退出用例。注冊、登錄用例次之。而公告、踢人、保存日志及聊天記錄、個性化界面等又次之。優(yōu)先級劃分后,設(shè)計(jì)實(shí)現(xiàn)時,先做優(yōu)先級高的,例如本系統(tǒng),為了實(shí)現(xiàn)上述全部功能,可以分3次迭代,第一次,實(shí)現(xiàn)高優(yōu)先級的基本聊天功能,第二次實(shí)現(xiàn)
39、注冊和登錄,第三次實(shí)現(xiàn)公告、踢人、保存日志及聊天記錄等。其核心是先實(shí)現(xiàn)最重要(用戶觀點(diǎn))和最難的(開發(fā)者觀點(diǎn)),這一觀點(diǎn)和日常思維相反,但卻是有效避免風(fēng)險和損失的方法,因?yàn)楸匦璧暮碗y度大的一開始就實(shí)現(xiàn)不了的話,項(xiàng)目可以及時改變,否則等到最后才發(fā)現(xiàn)了難以解決而又必須解決的問題時,損失就會更大。當(dāng)然在攻克重難點(diǎn)時,又可以采用由易到難的辦法,逐步解決。一個是策略,一個是戰(zhàn)術(shù),思路相反,關(guān)鍵是要運(yùn)用得當(dāng)。</p><p>
40、;<b> 2、業(yè)務(wù)對象分析</b></p><p> 從上述的分析中,運(yùn)用名詞法,可以發(fā)現(xiàn)出主要的業(yè)務(wù)對象:</p><p><b> 1 聊天者:</b></p><p> 屬性:用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件</p><p><b> 行為:登錄、注冊 <
41、;/b></p><p><b> 聊天客戶端:</b></p><p> 屬性:消息、聊天者、界面</p><p> 行為:接收處理,發(fā)送處理、退出</p><p><b> 消息</b></p><p> 屬性:消息類型、消息參數(shù)</p>&
42、lt;p> 行為:創(chuàng)建消息、獲取消息類型、獲取消息參數(shù)</p><p> 4 服務(wù)器(相當(dāng)于總服務(wù)臺)</p><p> 屬性:IP、端口、服務(wù)監(jiān)控、消息處理者</p><p> 行為:監(jiān)聽、創(chuàng)建消息處理者、創(chuàng)建服務(wù)監(jiān)控</p><p><b> 5 服務(wù)監(jiān)控</b></p><p
43、> 屬性:服務(wù)狀態(tài),消息,聊天者列表、界面</p><p> 行為:發(fā)送服務(wù)方消息、關(guān)閉服務(wù)器</p><p> 消息處理者(相當(dāng)于服務(wù)員)</p><p> 屬性:連接(socket)、消息</p><p> 行為:處理消息(登錄、注冊、發(fā)送、接收、退出),收發(fā)消息</p><p> 友情提示:業(yè)務(wù)
44、對象是系統(tǒng)中對象的初步提煉,其屬性和行為在后面還會修改、變動,主要與業(yè)務(wù)相關(guān),和具體的實(shí)現(xiàn)關(guān)系不大,是后面設(shè)計(jì)中業(yè)務(wù)類的基礎(chǔ),但實(shí)際類的數(shù)量也許會很多,因?yàn)樵谠O(shè)計(jì)甚至在實(shí)現(xiàn)時都可能需要建立新的類以實(shí)現(xiàn)功能。不少講分析設(shè)計(jì)的書并不提到這一步,而是在設(shè)計(jì)中直接給出類圖,結(jié)果是一樣的,但反映不出這些類是如何來的,如果你注重過程,可以看一下本節(jié),若果你注重結(jié)果,直接看設(shè)計(jì)實(shí)現(xiàn)中的相關(guān)內(nèi)容。</p><p><b&g
45、t; 3、驗(yàn)收測試要求</b></p><p><b> 測試環(huán)境:</b></p><p> 客戶及服務(wù)器機(jī)操作系統(tǒng):Window XP,內(nèi)存:512M。</p><p> 客戶端程序安裝在客戶機(jī)(至少2臺)上,通過以太網(wǎng)(網(wǎng)速至少10M)與服務(wù)器相連。</p><p><b> 前置條
46、件:</b></p><p> 1 注冊文件已創(chuàng)建但為空。</p><p> 2 客戶及服務(wù)程序安裝配置正確,能正常啟動運(yùn)行。</p><p> 3 客戶程序與服務(wù)程序能通過網(wǎng)絡(luò)互通。</p><p><b> 一 初始化數(shù)據(jù)</b></p><p> 1 客戶端啟動,進(jìn)入注
47、冊界面,輸入正確的注冊數(shù)據(jù),請求注冊,查看服務(wù)端,看是否正確注冊。</p><p> 2 重復(fù)1,在另一客戶端注冊用戶,注意不要重名。</p><p><b> 二 功能測試</b></p><p> 1 注冊測試。(1)測試重名注冊。進(jìn)入注冊界面輸入重名用戶名,其它正確,請求注冊。(2)測試空輸入,進(jìn)入注冊界面,直接按注冊按鈕。(3)測
48、試口令的一致性,口令長度,年齡及郵箱的數(shù)據(jù)有效性(具體測試用例設(shè)計(jì)可參考需求分析及詳細(xì)設(shè)計(jì)中的相關(guān)部分)。</p><p> 2 登錄測試。(1)輸入正確的口令和密碼,按登錄按鈕(2)空輸入,直接按登錄按鈕。(3)分別輸入用戶名不正確但密碼正確,用戶名正確但密碼不正確,用戶名和密碼均不正確,應(yīng)均不能正確登錄。(4)以同一用戶名重復(fù)登錄一次</p><p> 測試(1)(3)時要查看服務(wù)
49、端的顯示</p><p> 3 發(fā)送接收測試。(1)進(jìn)入收發(fā)界面,群發(fā)一條消息,觀察其它客戶是否收到消息,察看服務(wù)器有無相應(yīng)顯示 (2)私聊一條消息,察看指定用戶是否收到消息</p><p> (3)無任何輸入,直接按發(fā)送。(4)退出系統(tǒng),察看服務(wù)端顯示,察看其它客戶端是否已將該客戶名刪除。(5)再啟動客戶端,登錄進(jìn)入收發(fā)界面,連續(xù)群發(fā)(至少3次),連續(xù)私聊(至少3次),再連續(xù)群發(fā),觀
50、察其它客戶及服務(wù)方的顯示是否正確。</p><p><b> 三 可靠性測試</b></p><p> 1 切斷一客戶至服務(wù)器的網(wǎng)絡(luò)連接,分別進(jìn)行注冊、登錄消息,客戶端應(yīng)能給出提示,而不是死機(jī)或退出,在正常聊天過程中,切斷一客戶端網(wǎng)絡(luò)連接,客戶程序應(yīng)能給出提示。再接通網(wǎng)路,繼續(xù)發(fā)送信息,應(yīng)能正常運(yùn)行。至少關(guān)閉并重啟程序后,應(yīng)能正常收發(fā)。同時觀察其它客戶及服務(wù)器收發(fā)
51、、客戶列表是否正常。</p><p> 2 在正常收發(fā)中,強(qiáng)行關(guān)閉服務(wù)器,觀察各客戶端的反應(yīng)??蛻舳藨?yīng)給出發(fā)送異常提示,不應(yīng)退出或死機(jī)。</p><p> 四 性能測試(可選)</p><p> 編制一測試程序,作為客戶端,登錄進(jìn)系統(tǒng),向服務(wù)器按指定時間間隔群發(fā)消息??赏瑫r啟動多個發(fā)送線程(模擬多個客戶),同時向服務(wù)器群發(fā)消息。看在200個模擬客戶(200個
52、發(fā)送線程),每1s一個消息的情況下,服務(wù)器能否滿足客戶到客戶傳輸時間小于5s的要求。也可以考慮使用JMeter壓力測試工具。</p><p><b> 三、系統(tǒng)設(shè)計(jì)</b></p><p><b> 1、總體設(shè)計(jì)</b></p><p><b> 一 系統(tǒng)總體結(jié)構(gòu)</b></p>
53、<p> 總體設(shè)計(jì)階段主要是確定系統(tǒng)的體系結(jié)構(gòu)和主要模塊 ,顯然系統(tǒng)分客戶端子系統(tǒng)和服務(wù)器子系統(tǒng)。系統(tǒng)體系結(jié)構(gòu)如圖2所示:</p><p> 圖2 系統(tǒng)體系結(jié)構(gòu)圖</p><p> 客戶端可以劃分成三子層,服務(wù)端也可以劃分出三個子層,客戶和服務(wù)器間通信采用的是可靠的TCP協(xié)議?;镜牧奶爝^程如下:</p><p> 0 客戶端啟動注冊、登錄后,進(jìn)入
54、收發(fā)界面,此時C/S連接已建立,C處于接收狀態(tài)。</p><p> 1 客戶A從界面輸入消息,確定群發(fā),業(yè)務(wù)邏輯層從界面獲取信息并驗(yàn)證后生成“消息接收請求”消息,再將消息作為參數(shù)調(diào)用網(wǎng)絡(luò)通信層的發(fā)送函數(shù),發(fā)送函數(shù)將消息發(fā)往服務(wù)器,然后等待服務(wù)器的消息</p><p> 2 服務(wù)器收到消息,確定是客戶A發(fā)來的,從消息中分析出是群發(fā),然后從當(dāng)前客戶列表中取出除A以外的與每個客戶(B,C)
55、對應(yīng)的socket,然后通過socket將消息轉(zhuǎn)發(fā)給客戶B,C。</p><p> 3 服務(wù)器在監(jiān)控界面上顯示:客戶A—〉消息 群發(fā)</p><p> 4 服務(wù)器生成“消息接收成功”消息,向客戶A回發(fā)(可?。?。</p><p> 5 客戶A收到消息,確定是“消息接收成功”消息后,在界面上顯示發(fā)送成功。</p><p> 6 客戶B
56、/C的通訊模塊接收到消息,分析確認(rèn)是“消息接收請求”,則在界面上顯示:客戶A-〉消息 群發(fā)。不向服務(wù)器發(fā)送消息收到的確認(rèn)消息。</p><p> 消息收發(fā)的簡圖如下圖3所示:</p><p> 圖3 消息收發(fā)示意圖</p><p> 經(jīng)驗(yàn)共享:下面是本人在網(wǎng)絡(luò)編程方面多年積累的經(jīng)驗(yàn),感興趣的可以讀一讀。</p><p> 要不要回復(fù)
57、消息?由于使用的是TCP協(xié)議,可以保證點(diǎn)對點(diǎn)的可靠傳輸,所以最簡單的情況是無需回復(fù),在上圖中取消3也可以,客戶A將消息發(fā)到服務(wù)器就認(rèn)為已成功群發(fā)了消息,但若客戶B、C都斷線,顯然消息并沒有成功群發(fā)。最復(fù)雜的是客戶B、C收到消息后也回復(fù)給服務(wù)器,服務(wù)器確認(rèn)都收到回復(fù)后再向A回復(fù)。前者編程簡單、性能好,但對于某些異常情況不能可靠處理,后者編程復(fù)雜,性能差,但可靠性高。這就要根據(jù)情況在上述矛盾中折中,對于“聊天室系統(tǒng)”,對可靠性要求并不高,即
58、使消息有5%未收到,也沒有大的問題,另外聊天者是處理各種不可靠問題的最佳人選,實(shí)在不行,可由人重啟系統(tǒng)(不會帶來任何人身及財物損失),另外本系統(tǒng)主要應(yīng)用在局域網(wǎng),而局域網(wǎng)的可靠性是較高的。所以本文推薦采用無回復(fù)方式。這適用于其它消息的處理。</p><p> 消息的收發(fā)方式?主要分兩種,一種是推方式,例如客戶A有了消息就直接發(fā)給服務(wù)器,這是推方式,即由數(shù)據(jù)源方直接將消息發(fā)給接收方;另一種是拉方式,即接收方主動向
59、數(shù)據(jù)源請求獲取數(shù)據(jù),例如服務(wù)器通過定期詢問客戶A有無數(shù)據(jù)的方式,客戶A一旦有消息,就會發(fā)消息給服務(wù)器。顯然這兩種方式應(yīng)用的場合是不一樣的,上文中描述的是“推”方式,客戶A將消息發(fā)(推)給服務(wù)器,服務(wù)器將消息再轉(zhuǎn)發(fā)(推)給其它客戶。數(shù)據(jù)源(客戶A)的特點(diǎn)是消息的產(chǎn)生是不確定的(接收方難以知道發(fā)方何時有消息),產(chǎn)生就發(fā)是高效的方式,若服務(wù)器采用輪詢的方式,一方面在大多數(shù)情況下會產(chǎn)生許多無謂的詢問,另一方面會降低服務(wù)器的性能(特別是服務(wù)器可能
60、成為整個系統(tǒng)的性能瓶頸,這就尤為重要),這里還隱含了一個假設(shè):在聊天過程中,服務(wù)器一直等待消息的到來,B、C也隨時能接受消息,所以發(fā)送(推)一般是能成功的。服務(wù)器向客戶B,C推消息(相當(dāng)于客戶B、C接收消息),是基于B、C都在準(zhǔn)備接收的假設(shè),這一點(diǎn)較之服務(wù)器一直可靠運(yùn)行的假設(shè),其假設(shè)的有效性較低,因?yàn)榭蛻舴降男袨殡y以預(yù)料,可能客戶重啟了系統(tǒng),可能突然斷電等。服務(wù)器可能白發(fā)了消息(為保證消息發(fā)到客戶,服務(wù)</p><p
61、> 推薦的方式是“推”方式,因?yàn)椤癏appy Chat”應(yīng)用于局域網(wǎng),網(wǎng)絡(luò)條件較好,且基于可靠的TCP協(xié)議傳輸消息,本身對可靠性要求也不高,具體說就是服務(wù)器向客戶轉(zhuǎn)發(fā)消息時,不管成功與否只發(fā)一次,客戶向服務(wù)器發(fā)消息時,若出錯,不會自動重發(fā),但會給出提示,由聊天者決定是否重發(fā)(如再次按發(fā)送按鈕)。即認(rèn)為在多客戶聊天過程中服務(wù)器一直正常運(yùn)行,客戶端也一直正常。這樣做以后,簡化了設(shè)計(jì)編碼,性能也得到提高。</p><
62、;p> 結(jié)論:系統(tǒng)采用無回復(fù)的“推”方式收發(fā)消息。</p><p><b> 二 服務(wù)器結(jié)構(gòu)</b></p><p> 服務(wù)器端主要的模塊和結(jié)構(gòu)如圖4所示:</p><p> AppServer.java 為服務(wù)器端監(jiān)聽類,負(fù)責(zé)服務(wù)器的啟動,包括啟動監(jiān)聽端口、服務(wù)器監(jiān)控界面。</p><p> Se
63、rverFrame.java 為服務(wù)器監(jiān)控窗體,負(fù)責(zé)監(jiān)控服務(wù)器運(yùn)行狀態(tài),聊天內(nèi)容,發(fā)送公告,踢人……</p><p> Connection.java 為服務(wù)器連接處理的具體實(shí)現(xiàn)。</p><p> WordFilter.java 語言過濾類,處理非法聊天內(nèi)容的過濾。(可選)</p><p><b> 三 客戶端結(jié)構(gòu)</b><
64、;/p><p> 客戶端主要模塊和結(jié)構(gòu)如圖5所示:</p><p> ChatClient.java 為客戶端程序啟動類,負(fù)責(zé)客戶端的啟動和退出。</p><p> Login.java 為客戶端程序登錄界面,負(fù)責(zé)用戶帳號信息的驗(yàn)證與反饋。</p><p> Register.java 為客戶端程序注冊界面,負(fù)責(zé)用戶帳號信息的注冊驗(yàn)證與反
65、饋。</p><p> ChatRoom.java 為客戶端程序聊天室主界面,負(fù)責(zé)接收、發(fā)送聊天內(nèi)容與服務(wù)器端的Connection.java 親密合作。</p><p> Windowclose 為ChatRoom.java的內(nèi)部類,負(fù)責(zé)監(jiān)聽聊天室界面的操作,當(dāng)用戶退出時返回給服務(wù)器信息。</p><p> Clock.java 為客戶端程序的一個小程序,實(shí)
66、現(xiàn)的一個石英鐘功能。(可選)</p><p><b> 2、詳細(xì)設(shè)計(jì)</b></p><p><b> a 、客戶端設(shè)計(jì)</b></p><p><b> 一 注冊模塊</b></p><p> 程序?qū)⑼ㄟ^Register.java用戶注冊界面收集用戶的用戶名、密碼、
67、年齡、電子郵箱等。參考界面如圖6。</p><p> 圖6 客戶端注冊界面</p><p> 處理過程:當(dāng)用戶注冊時,客戶端的Register.java界面收集并驗(yàn)證了用戶的注冊信息后,封裝成Register_Customer類然后通過建立在Socket的連接之上的對象輸出流將用戶注冊信息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后
68、將驗(yàn)證數(shù)據(jù)的完整性并在數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊信息加入數(shù)據(jù)庫,最后將注冊結(jié)果返回給客戶端??蛻舳孙@示結(jié)果(重名、成功、失?。?,并斷開連接。</p><p><b> 驗(yàn)證要求如下:</b></p><p> 1 驗(yàn)證用戶名是否為空</p><p> 即用戶名的字符長度不為0,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回“用
69、戶名為空”錯誤。</p><p> 2 驗(yàn)證密碼是否為空</p><p> 即密碼的字符長度不為0,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回“用戶密碼為空”錯誤。</p><p> 3 驗(yàn)證密碼的一致性</p><p> 驗(yàn)證密碼兩次輸入是否一致,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回“密碼兩次輸入不一致,請重新輸入”錯誤。 &l
70、t;/p><p> 4 驗(yàn)證年齡是否為空</p><p> 即用戶年齡的字符長度不為0,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回“用戶名為空錯誤”</p><p> 5 驗(yàn)證年齡的合法性</p><p> 即用戶年齡介于10到100之間,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回“用戶年齡為空” </p><p>
71、; 6 驗(yàn)證電子郵箱的合法性</p><p> 即電子郵箱字符串必須有“@” ,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回“電子郵箱不合法”, </p><p><b> 二 登錄模塊</b></p><p> 程序?qū)⑼ㄟ^Login.java用戶登錄界面收集用戶的用戶名、密碼,如圖7所示。</p><p>
72、 圖7 客戶端登錄界面 </p><p><b> 登錄過程如下:</b></p><p> 當(dāng)用戶登錄時,客戶端由Login.java 界面收集并驗(yàn)證用戶登錄信息后,封裝成Customer對象類然后通過建立在Socket的連接之上的對象輸出流將用戶登錄信息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后將驗(yàn)證數(shù)據(jù)
73、的完整性并在對象型數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊用戶的信息與登錄請求信息進(jìn)行密碼驗(yàn)證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結(jié)果返回給客戶端。如果登錄成功,客戶端將繼續(xù)啟動聊天室主界面。</p><p><b> 驗(yàn)證要求:</b></p><p> 1 驗(yàn)證用戶名是否為空</p><p> 即用戶名的字符長度
74、不為0,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回“用戶名為空”錯誤,</p><p> 2 驗(yàn)證密碼是否為空</p><p> 即密碼的字符長度不為0,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回“用戶密碼為空”錯誤</p><p> 當(dāng)以上信息驗(yàn)證成功時,客戶端將打開與服務(wù)之間的Socket連接,用對象輸出流包裝后將用戶登錄的信息發(fā)送給服務(wù)器端,并接收
75、服務(wù)器處理完用戶登錄的信息。</p><p> 當(dāng)客戶端收到服務(wù)器返回的信息時,將會用信息對話框的形式告知用戶是否注冊成功,若成功則顯示收發(fā)主界面ChatRoom,關(guān)閉Socket連接。</p><p><b> 三 收發(fā)模塊</b></p><p> 當(dāng)用戶登錄成功后,用戶的登錄界面將會消失,然后創(chuàng)建用戶聊天室窗口(如圖),在界面的標(biāo)題
76、欄將會顯示當(dāng)前登錄用戶的用戶名,以防止一個機(jī)器上的用戶開多個帳號進(jìn)入聊天室后分不清哪個窗口是哪個用戶登錄的,界面第一行將顯示當(dāng)前服務(wù)器的在線人數(shù)。位于界面正中的兩個控件分別是List和TextBox用來顯示當(dāng)前服務(wù)器上的在線會員名單列表和公共聊天信息。</p><p> 位于界面下方的就是一些用于聊天的功能控件和聊天內(nèi)容個性化配置控件(可選)。包括聊天對象、聊天語氣、聊天內(nèi)容、聊天字體、風(fēng)格、大小、顏色……&l
77、t;/p><p><b> 1 用戶發(fā)送信息</b></p><p> 當(dāng)用戶需要發(fā)送聊天信息時,可以在在線列表中選中聊天對象或者“所有人”,選擇發(fā)言的語氣,和是否私聊就可以發(fā)送聊天信息了。</p><p> 當(dāng)用戶點(diǎn)擊完發(fā)送按鈕后,程序開始將當(dāng)前用戶名、聊天對象、聊天內(nèi)容、聊天語氣和是否私聊進(jìn)行封裝,然后獲取Socket連接,再用對象輸出流
78、包裝Socket的輸出流將聊天信息對象發(fā)送給服務(wù)器端。</p><p><b> 2 接收聊天信息</b></p><p> 接收用戶的聊天信息是用一個單獨(dú)的接收線程實(shí)現(xiàn)的,因?yàn)榭蛻舳吮仨氹S時接收服務(wù)器發(fā)來的消息,而讀取消息的方法采用的一般是讀直到有消息到來的“阻塞讀”方式,若在事件處理程序中讀(占用的是事件處理線程)則會使程序在此后無法響應(yīng)用戶操作,所以需要生成
79、一個單獨(dú)的線程專門用于讀取處理消息。而發(fā)送消息的方法則是將消息放入操作系統(tǒng)的發(fā)送緩沖區(qū)后就返回的,所以發(fā)送執(zhí)行的相當(dāng)快,可以在事件處理線程中直接調(diào)用。發(fā)送和接收可以同時進(jìn)行。</p><p> 當(dāng)每次用戶接收到聊天信息后將會開始分析聊天信息然后將適合自己的信息顯示在聊天信息界面上。收發(fā)界面如圖8所示。</p><p><b> 圖8 收發(fā)界面 </b></
80、p><p> 圖上的字體(個性化)、時鐘、保存等是可選的功能,聊天者列表、聊天信息顯示,聊天內(nèi)容、私聊等是必需的。</p><p><b> b、服務(wù)端設(shè)計(jì)</b></p><p><b> 功能描述:</b></p><p> 1.接受用戶注冊信息并保存在一個基于文件的對象型數(shù)據(jù)庫。</
81、p><p> 2.能夠允許注冊過的用戶登陸聊天界面并可以聊天。</p><p> 3.能夠接受私聊信息并發(fā)送給特定的用戶。</p><p> 4.服務(wù)器運(yùn)行在自定義的端口上1888。</p><p> 5.服務(wù)器監(jiān)控用戶列表和用戶聊天信息(私聊除外)。</p><p> 6.服務(wù)器踢人,發(fā)送通知(可選)。<
82、/p><p> 7.服務(wù)器保存日志(可選)。</p><p><b> 一 用戶注冊</b></p><p><b> 1.去數(shù)據(jù)庫讀數(shù)據(jù)</b></p><p> 首先創(chuàng)建一個File文件類,載入“user.txt”,再用對象輸入流ObjectInputStream包裝File文件類,將存儲
83、在“user.txt”得向量對象Vector中載入內(nèi)存中,現(xiàn)在系統(tǒng)中的向量就是對象型數(shù)據(jù)庫,存儲著每條用戶信息對象。</p><p> 2.判斷是否是第一個注冊用戶</p><p> 檢測內(nèi)存中的數(shù)據(jù)庫對象集的當(dāng)前容量是否為空,如果是,將收集的注冊用戶信息對象添加到數(shù)據(jù)庫對象集中,然后直接寫入數(shù)據(jù)庫,否則繼續(xù)進(jìn)行其他判斷。</p><p> 3.判斷用戶名是否
84、已經(jīng)存在</p><p> 檢測內(nèi)存中的數(shù)據(jù)庫對象集的中有沒有和當(dāng)前收集的注冊用戶名相同的記錄,如果有,就退出檢測,否則繼續(xù)下一個檢測。</p><p> 4.判斷用戶名是否為系統(tǒng)關(guān)鍵字</p><p> 檢測當(dāng)前收集的用戶名是否為“所有人”,如果是,就退出檢測,否則繼續(xù)下一個檢測。因?yàn)椤八腥恕边@個名字會和系統(tǒng)發(fā)生沖突,用戶發(fā)給所有人的信息將會使用“所有人”
85、這個特殊用戶名。</p><p> 5.用戶名有效后 寫入數(shù)據(jù)庫</p><p> 當(dāng)前面的驗(yàn)證全部都通過的時候,將用戶的注冊信息對象添加到用戶數(shù)據(jù)庫中,然后創(chuàng)建文件輸出流,再用對象輸出流包裝后寫入本地文件將其持久化。最后關(guān)閉對象輸出流和文件輸入流。</p><p> 6.給客戶端返回信息</p><p> 將用戶注冊成功或失敗的信息
86、用打印流包裝Socket以后,輸出給客戶端注冊結(jié)果的詳細(xì)信息。</p><p> 7 在監(jiān)管界面上顯示信息,如圖9所示。</p><p> 8.關(guān)閉Socket連接</p><p> 當(dāng)以上的程序都正常運(yùn)行后,需要關(guān)閉Socket連接,否則將會浪費(fèi)服務(wù)器與客戶端之間的資源。</p><p><b> 二 用戶登錄</
87、b></p><p> 1.去數(shù)據(jù)庫讀用戶數(shù)據(jù)</p><p> 打開用戶數(shù)據(jù)庫文件“user.txt”,將用戶數(shù)據(jù)對象集載入內(nèi)存,以供下面的程序使用。</p><p> 2.驗(yàn)證用戶名是否存在</p><p> 在對象數(shù)據(jù)庫中查找是否有與登陸用戶的用戶名相同的記錄,如果有繼續(xù)驗(yàn)證,否則退出驗(yàn)證處理,返回“沒有此用戶”錯誤。&l
88、t;/p><p> 3.驗(yàn)證用戶密碼是否正確</p><p> 如果有與登錄用戶的用戶名相同的記錄,接著判斷密碼是否正確。如果密碼正確,繼續(xù)驗(yàn)證,否則退出驗(yàn)證處理,返回“用戶密碼錯誤”。</p><p> 4.驗(yàn)證用戶是否已經(jīng)登錄</p><p> 在服務(wù)器的已登錄用戶列表中查找是否有該用戶,如果有該用戶,退出驗(yàn)證處理返回“該用戶已經(jīng)登錄
89、”錯誤。否則繼續(xù)下面的驗(yàn)證。</p><p> 5.驗(yàn)證是否已經(jīng)超過最大登錄人數(shù)</p><p> 檢測服務(wù)器的在線人數(shù)是否已經(jīng)達(dá)到限制的最大人數(shù),如果是,退出驗(yàn)證處理返回“當(dāng)前服務(wù)器人數(shù)已滿,請稍后再試”錯誤。否則繼續(xù)下面的驗(yàn)證。</p><p><b> 6.返回客戶端信息</b></p><p> 如果以上
90、驗(yàn)證全部正確,就返回客戶端“用戶登錄成功”。</p><p> 7 在監(jiān)控界面顯示信息,如圖9所示</p><p> 8.關(guān)閉Socket連接</p><p> 當(dāng)以上的程序都正常運(yùn)行后,需要關(guān)閉Socket連接,否則將會浪費(fèi)服務(wù)器與</p><p> 圖9 服務(wù)器管理界面</p><p><b>
91、 客戶端之間的資源。</b></p><p><b> 三 用戶退出</b></p><p><b> 1.接收退出信息</b></p><p> 當(dāng)用戶退出時,客戶端將會用基于Socket的對象輸出流發(fā)給服務(wù)器退出對象。</p><p> 2.在線列表中刪除用戶</p&
92、gt;<p> 用戶退出后應(yīng)該把用戶從在線列表中刪除,否則用戶退出用戶還在在線列表中,那么該用戶下次將會無法登錄。</p><p><b> 3.更新在線列表</b></p><p> 用戶退出后將服務(wù)器端監(jiān)控界面的用戶列表更新。否則用戶數(shù)據(jù)將會不同步。</p><p> 圖10 服務(wù)器用戶信息管理界面</p>
93、;<p> 四 接收轉(zhuǎn)發(fā)用戶聊天信息</p><p> 1.接收用戶聊天信息</p><p> 當(dāng)用戶發(fā)送聊天信息時,服務(wù)端將會收到客戶端用Socket傳輸過來的聊天信息對象,然后將其強(qiáng)制轉(zhuǎn)換為Message對象。</p><p> 2.過濾用戶聊天內(nèi)容的非法信息(可選)</p><p> 分析聊天信息對象的聊天內(nèi)容,
94、用語言過濾類將非法字符過濾掉。語言過濾的時候?qū)蜷_“badword.txt”文件,不允許出現(xiàn)的關(guān)鍵詞將會存儲在文件中,關(guān)鍵字之間以逗號分割。當(dāng)聊天內(nèi)容中出現(xiàn)要過濾的關(guān)鍵字是 將會被系統(tǒng)屏蔽,而聊天內(nèi)容也將替換成“非法內(nèi)容,系統(tǒng)屏蔽”。 </p><p><b> 3 返回聊天信息</b></p><p> 然后系統(tǒng)從Messag
95、e中提出消息類型,再根據(jù)類型將消息強(qiáng)制轉(zhuǎn)化ChatMessage,調(diào)用ChatMeaage中方法,獲取目的客戶名稱列表,根據(jù)目的地用戶名從用戶名、socket鍵值表中獲取socket,再通過socket將Message轉(zhuǎn)發(fā)到目的客戶。</p><p> Message定義如下:</p><p><b> 1消息類型</b></p><p>
96、 接收消息請求,登錄請求,登錄響應(yīng),注冊請求,注冊響應(yīng)</p><p> 2 獲取類型方法getType</p><p> ChatMessage繼承自Message,增加如下屬性:(1).目的用戶名列表</p><p> (2). 用戶聊天內(nèi)容;相應(yīng)的還有LoginMessage、LoginACKMessage、RegisterMessage,Regist
97、erACKMessage. LogoutMessage(客戶退出)等</p><p> 圖11 通信協(xié)議交互圖</p><p> 友情提示:服務(wù)端采用一個“監(jiān)聽線程”負(fù)責(zé)監(jiān)聽連接請求,收到連接請求則創(chuàng)建socket及相應(yīng)的處理線程,該線程在一個循環(huán)中通過socket讀取消息,分析處理消息,直到遇到“退出”消息或管理員命令,線程才退出。所以服務(wù)端是“單線程監(jiān)聽,多線程處理”的模式。&l
98、t;/p><p> 經(jīng)驗(yàn)共享:具體設(shè)計(jì)時應(yīng)用協(xié)議的設(shè)計(jì)是難點(diǎn),要根據(jù)需要確定具體的消息種類,分清客戶端發(fā)出哪些消息,接收哪些消息,服務(wù)端又發(fā)出哪些消息,接收哪些消息。然后將這些消息構(gòu)成一個完整的聊天業(yè)務(wù)過程??梢杂脠D11描述。整個過程分注冊,登錄,收發(fā),退出四個階段。其中LogoutMsg為客戶聲明自己離線,其它客戶收到后將該用戶信息刪除,而QuitMsg是服務(wù)方發(fā)出的要求客戶離線的消息,收到的客戶一般需要關(guān)閉連接
99、。</p><p> 協(xié)議格式的設(shè)計(jì)也很重要,有基于文本格式和二進(jìn)制格式兩類。文本格式的協(xié)議有HTTP,SMTP(簡單電子郵件傳輸協(xié)議)等,二進(jìn)制的協(xié)議如java 的RMI、CORBA,windows的DCOM等。文本形式的協(xié)議簡單,可跨平臺,例如使用HTTP協(xié)議的WEB應(yīng)用,客戶端可以是Window,服務(wù)器端可以是Linux,Web服務(wù)器既可以是用C開發(fā)的Apache,也可以是用其它語言開發(fā)的,只要他們遵守協(xié)
100、議。其缺點(diǎn)是性能不好,特別是傳輸大信息量消息時,其次是名文傳輸,很容易被破解。二進(jìn)制方式的特點(diǎn)和文本方式相反,缺點(diǎn)是難以實(shí)現(xiàn)不同平臺不同語言間的傳輸,優(yōu)點(diǎn)是高效,有一定的保密性。對于聊天室系統(tǒng),若用文本格式傳輸,建議采用以下格式: 消息類型+分隔符+參數(shù)1+參數(shù)分隔符+參數(shù)2+參數(shù)分隔符+ …</p><p> 分隔符可用‘:’,并保證‘:’不出現(xiàn)在參數(shù)及消息類型字符串中,參數(shù)分隔符可用‘\0’,也需要保證其不
101、出現(xiàn)在參數(shù)及消息類型字符串中。若采用二進(jìn)制形式,直接將相關(guān)消息對象序列化后即可。</p><p><b> 六、 系統(tǒng)實(shí)現(xiàn)</b></p><p><b> 1、 客戶端實(shí)現(xiàn)</b></p><p> 客戶端實(shí)現(xiàn)的關(guān)鍵在于接收線程的實(shí)現(xiàn),部分原型參考代碼如下:</p><p> class
102、ReadMessageThread extends Thread{</p><p> public void run(){</p><p> String line="";</p><p> //循環(huán)讀并處理消息</p><p> while(true){</p><p><b>
103、 try{</b></p><p> line=cin.readLine();</p><p> }catch(IOException ex){</p><p> System.out.println("輸入輸出異常\n");</p><p><b> }</b></p&g
104、t;<p> //提取消息中的消息類型</p><p> StringTokenizer st=new StringTokenizer(line,":");</p><p> String keyword=st.nextToken();</p><p> //根據(jù)類型處理消息</p><p> if
105、(keyword.equalsIgnoreCase("quit")){ //服務(wù)方指令退出</p><p><b> try{</b></p><p> socket.close();</p><p> jTextArea1.append("接收到服務(wù)器同意端口信息,套節(jié)字關(guān)閉\n");</p
106、><p> break; //jump out of read thread</p><p> }catch(Exception ex){</p><p> jTextArea1.append("關(guān)閉套接字異常");</p><p><b> }</b></p><p>&
107、lt;b> }//新用戶加入</b></p><p> else if(keyword.equalsIgnoreCase("Login")){</p><p> Vector imessage=new Vector();</p><p> while(st.hasMoreTokens()){</p><
108、;p> imessage.addElement(st.nextToken());</p><p><b> }</b></p><p> jList1.setListData(imessage);</p><p><b> }//接收的消息</b></p><p> else if(
109、keyword.equalsIgnoreCase("AcceptMsg")){</p><p> String message=st.nextToken("\0");</p><p> message=message.substring(1);</p><p> jTextArea1.append(message+&qu
110、ot;\n");</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
111、t;/b></p><p> 注:本例中通信協(xié)議的格式,為文本格式,基本格式為:類型:用戶名/用戶消息,較之設(shè)計(jì)中使用的二進(jìn)制消息對象形式,好處是簡單、可讀,可移植性好,即使C/S采用不同語言開發(fā),只要遵守此文本格式協(xié)議,都可以互相通信,HTTP協(xié)議就是這方面的例子。</p><p><b> 2 、服務(wù)器實(shí)現(xiàn)</b></p><p>
112、; 服務(wù)器端的關(guān)鍵在于接收處理線程和監(jiān)聽線程,基本代碼如下:</p><p> //監(jiān)聽線程,實(shí)現(xiàn)多客戶聊天,解決只能處理單客戶問題</p><p> class ConnectSocket extends Thread{</p><p> Socket socket;</p><p> public void run(){<
113、/p><p> while(true){</p><p><b> try {</b></p><p> socket = serverSocket.accept();//接收連接,返回連接socket</p><p><b> }</b></p><p> catch
114、 (IOException ex) {</p><p> jTextArea2.append("創(chuàng)建套接字連接錯誤\n");</p><p><b> }</b></p><p> if(socket!=null){</p><p><b> try{</b></p
115、><p> Client client=new Client(socket);//創(chuàng)建客戶處理線程</p><p> clients.addElement(client);//clients是Vector,存儲客戶對象</p><p> if(checkName(client)){ //在clients中判斷客戶是否存在</p><p>
116、 client.start();//啟動處理線程</p><p> notifyRoom();//通知其它客戶,有客戶加入</p><p><b> }</b></p><p><b> else{</b></p><p> disconnect(client);</p>&l
117、t;p><b> }</b></p><p> }catch(Exception ex){</p><p> jTextArea2.append("信息讀取錯誤!\n");</p><p><b> }</b></p><p><b> }</b&
118、gt;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //使用客戶處理線程來實(shí)現(xiàn)信息的讀取,解決程
119、序死鎖的問題</p><p> class Client extends Thread{</p><p> String name;</p><p> BufferedReader in;</p><p> PrintStream out;</p><p> Socket socket;</p>
120、<p> public Client(Socket client){</p><p> this.socket=client;</p><p><b> try{</b></p><p> in=new BufferedReader(new InputStreamReader(socket.getInputStream())
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)---聊天室系統(tǒng)
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)
- java課程設(shè)計(jì)之簡單聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-java聊天室
- java課程設(shè)計(jì)---java聊天室的系統(tǒng)的設(shè)計(jì)與開發(fā)
- java課程設(shè)計(jì)報告---利用java實(shí)現(xiàn)簡單聊天室
- java聊天室設(shè)計(jì)
- java課程設(shè)計(jì)---java聊天室的系統(tǒng)的設(shè)計(jì)與開發(fā)(含代碼)
- java課程設(shè)計(jì)---java聊天室的系統(tǒng)的設(shè)計(jì)與開發(fā)(含代碼)
- web課程設(shè)計(jì)—— 聊天室
- Java課程設(shè)計(jì)---JAVA聊天室的系統(tǒng)的設(shè)計(jì)與開發(fā)(含代碼).doc
- java聊天室程序(java)
- tcp課程設(shè)計(jì)--網(wǎng)絡(luò)聊天室
- java網(wǎng)絡(luò)聊天室畢業(yè)課程設(shè)計(jì)報告(內(nèi)附代碼)
- 基于java聊天室系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)——課程論文
- java聊天室系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 基于java網(wǎng)絡(luò)聊天室設(shè)計(jì)
- 聊天室課程設(shè)計(jì)---聊天程序的設(shè)計(jì)和實(shí)現(xiàn)
- jsp課程設(shè)計(jì)報告--在線聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
評論
0/150
提交評論