JAVA課程設(shè)計(jì)聊天室系統(tǒng)DOC_第1頁
JAVA課程設(shè)計(jì)聊天室系統(tǒng)DOC_第2頁
JAVA課程設(shè)計(jì)聊天室系統(tǒng)DOC_第3頁
JAVA課程設(shè)計(jì)聊天室系統(tǒng)DOC_第4頁
JAVA課程設(shè)計(jì)聊天室系統(tǒng)DOC_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、11111 1、 課程設(shè)計(jì)目的-1 12 2、 學(xué)習(xí)目標(biāo)-1 13、 背景介紹-1 13.1業(yè)務(wù)背景- 23.2技術(shù)背景- 34、需求分析4.1功能需求分析 - 54.2業(yè)務(wù)對象分析 - 84.3驗(yàn)收測試要求 - 95、 系統(tǒng)設(shè)計(jì)5.1總體設(shè)計(jì) - 115.2詳細(xì)設(shè)計(jì) - 146、 系統(tǒng)實(shí)現(xiàn)6.1客戶端實(shí)現(xiàn)- 246.2服務(wù)器實(shí)現(xiàn)- 257、 小結(jié) -28288、 展望 -2828聊天室系統(tǒng)一、課程設(shè)計(jì)目的面向?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ǔ)知識(shí)的理解,掌握使

2、用Java語言進(jìn)行面向?qū)ο笤O(shè)計(jì)的基本方法,提高運(yùn)用面向?qū)ο笾R(shí)分析實(shí)際問題、 解決實(shí)際問題 的能力。二、學(xué)習(xí)目標(biāo):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ā)。5、 進(jìn)一步鞏固發(fā)展團(tuán)隊(duì)協(xié)作能力。三、背景介紹1、業(yè)務(wù)背景隨著網(wǎng)絡(luò)社會(huì)的不斷發(fā)展,具有相同興趣的網(wǎng)民需要互相遠(yuǎn)程交流,既要能省錢又要能即時(shí)交互,電話太貴、email又嫌慢,所以開發(fā)一個(gè)類似 QQ的及時(shí) 通訊系統(tǒng)就變得非常有意義了。 “Happy

3、 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)保存用戶聊天信息。2、技術(shù)背景本系統(tǒng)要求使用java技術(shù)開發(fā),使用文件保存數(shù)據(jù),集成開發(fā)環(huán)境使用 eclipse。開發(fā)者應(yīng)有java程序設(shè)計(jì)語言、SWING基本GUI組件、多線程、文件 使用、socket編程、使用eclipse的基本知識(shí)和技能。系統(tǒng)采用兩層 C/S體系 結(jié)構(gòu)

4、,C端負(fù)責(zé)通過GUI與客戶交互,實(shí)現(xiàn)注冊、登陸、收發(fā)信息、退出等功能; S端是聊天系統(tǒng)的應(yīng)用服務(wù)器,主要有處理用戶注冊、登錄、用戶收發(fā)信息、用首先服務(wù)器啟動(dòng),它會(huì)建立一個(gè)專門用于接收客戶端連接請求的“傾聽 Socket” (相當(dāng)于總服務(wù)臺(tái),有固定的IP地址和端口號(hào)),然后等待客戶的連接 請求。當(dāng)用戶想聊天時(shí),從界面輸入信息,然后與服務(wù)器建立Socket連接(連接時(shí)應(yīng)指定服務(wù)器的IP地址和端口號(hào),而客戶端socket的端口由本方操作系統(tǒng)從空 閑端口中確定),服務(wù)器端的“傾聽Socket”收到連接請求后,一般會(huì)接受連接 請求,并生成一個(gè)服務(wù)端 socket (其端口號(hào)由服務(wù)端操作系統(tǒng)從空閑端口中確

5、 定),專門負(fù)責(zé)與此客戶端socket的通信。一旦連接請求成功,客戶端將信息及 請求通過本方socket的輸出流發(fā)送給服務(wù)器端相應(yīng)的 socket,服務(wù)端則通過服務(wù) 器端Socket的輸入流接受客戶端傳輸過來的信息及請求,分析是何請求,然后 根據(jù)請求類型,進(jìn)行相應(yīng)的處理(如登錄、轉(zhuǎn)發(fā)信息等)。服務(wù)方也可以根據(jù)需 要,通過socket的輸出流發(fā)信息和請求給客戶端(公告)。客戶方和服務(wù)方都可 以通過關(guān)閉本方的socket而結(jié)束一次通訊過程。不難發(fā)現(xiàn)服務(wù)器需要能同時(shí)接受多個(gè)客戶的請求,為了實(shí)現(xiàn)這一點(diǎn),一般使 用多線程機(jī)制來處理,對每一個(gè)客戶端連接通訊,服務(wù)器端都有一個(gè)線程專門負(fù) 責(zé)處理(相當(dāng)于一個(gè)服

6、務(wù)員專門服務(wù)一個(gè)以IP地址和端口號(hào)唯一標(biāo)識(shí)的客戶)。上述方式兩個(gè)聊天者之間通信必須通過服務(wù)器進(jìn)行轉(zhuǎn)發(fā),聊天者多時(shí),顯然 服務(wù)器是個(gè)性能瓶頸。能不能聊天者之間直接通信?當(dāng)然可以,這是所謂的P2P聊天室,缺點(diǎn)是對聊天者缺乏集中監(jiān)管的手段。也有界于二者之間的,即有一服務(wù)器,接受注冊和登錄,實(shí)際聊天雙方通信時(shí),仍然是直接通信,此時(shí)服務(wù)器相 當(dāng)于一個(gè)婚姻介紹所,只管牽線搭橋,具體談還是聊天者自己的事。本文主要采用聊天信息通過服務(wù)器轉(zhuǎn)發(fā)的方式,而且只支持一個(gè)聊天室。因 為其他典型系統(tǒng)如電子郵件系統(tǒng),F(xiàn)TP系統(tǒng)均采用類似結(jié)構(gòu),WEB服務(wù)系統(tǒng)本 質(zhì)上也是C/S系統(tǒng),只不過其客戶端是瀏覽器,采用了 HTTP通信

7、協(xié)議和HTML, 所以變成了 B/S結(jié)構(gòu),可以認(rèn)為是C/S的一個(gè)具體應(yīng)用,其機(jī)理是相似的。四、需求分析1、功能需求分析系統(tǒng)的主要功能已在業(yè)務(wù)分析中有所介紹,在這里需要對每個(gè)功能從使用者 角度作較為具體的分析。很明顯,整個(gè)系統(tǒng)的功能可以自然地分為客戶端和服務(wù) 器端。以下是主要用例描述一客戶端1 .注冊(1)客戶啟動(dòng)程序,顯示出登陸界面(2)客戶選擇其中的注冊按鈕,系統(tǒng)顯示注冊界面(3 )客戶填寫用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件,按確定 按鈕(4)系統(tǒng)驗(yàn)證密碼和確認(rèn)密碼是否相符、用戶名(不能重復(fù))、電子郵件格 式、年齡(大于10小于100)(5 )系統(tǒng)發(fā)送上述信息及“注冊請求”到服務(wù)端

8、,等待服務(wù)端返回“注冊 成功”消息(6)系統(tǒng)提示注冊成功(7)系統(tǒng)返回登陸界面若驗(yàn)證失敗,提示“重新輸入”若服務(wù)端返回“注冊失敗”,提示“注冊失敗”若服務(wù)端返回“注冊失敗 用戶名重名”,則提示“注冊失敗 用戶重名”。2.登錄(1)客戶啟動(dòng)程序,顯示出登陸界面(2)客戶填寫用戶名、密碼,服務(wù)器IP地址,按登陸按鈕(3) 系統(tǒng)驗(yàn)證用戶名、密碼,不能為空、密碼字符長度為6-10(4)系統(tǒng)發(fā)送用戶名、密碼及“登陸請求”到服務(wù)端,等待服務(wù)端返回“登錄成功”消息(5)若成功系統(tǒng)顯示客戶端主界面(收發(fā)消息界面)若用戶名、密碼驗(yàn)證失敗,系統(tǒng)提示;“用戶名或密碼錯(cuò)”,重復(fù)3次若仍 不能通過驗(yàn)證則客戶端程序退出。

9、若服務(wù)端返回“登錄失敗”,系統(tǒng)提示“用戶名或密碼錯(cuò)”。3.發(fā)送信息(1 )在客戶端主界面,用戶輸入消息,選擇是群發(fā)還是私聊,若是私聊還 要選擇對方用戶名,按發(fā)送按鈕(2)系統(tǒng)驗(yàn)證消息長度,私聊要求目的方用戶名非空。(3)系統(tǒng)發(fā)送信息及“接收消息請求”到服務(wù)器端,等待服務(wù)端返回“接收成功”消息(等待返回消息可?。?。(4)系統(tǒng)提示信息已發(fā)送若發(fā)送不成功,則系統(tǒng)提示“發(fā)送失敗”。4.接收信息(1)客戶端系統(tǒng)啟動(dòng),進(jìn)入主界面后,會(huì)顯示消息接收框(2) 其他客戶或服務(wù)端系統(tǒng)本身發(fā)送消息過來,系統(tǒng)接收,分析確認(rèn)是” 接收消息請求“,則分析提取出消息(3)在消息接收框逐條顯示發(fā)送者姓名、發(fā)送的消息。5退出(

10、1)用戶請求退出,按退出按鈕(2)系統(tǒng)確認(rèn)用戶退出(對話框)(3)系統(tǒng)發(fā)“退出請求”到服務(wù)端,等待服務(wù)端返回“退出成功” (等待 返回消息可?。?)客戶端系統(tǒng)關(guān)閉連接,程序退出服務(wù)器端1.用戶注冊(1)系統(tǒng)啟動(dòng)后,等待客戶請求(2)客戶請求到,接受請求,分析確認(rèn)是“注冊請求”(3)系統(tǒng)讀取信息,分析并再次驗(yàn)證用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件。(4)系統(tǒng)根據(jù)用戶名,在已有客戶記錄中查詢,確認(rèn)沒有重名(5)系統(tǒng)將用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件信息保存(6)系統(tǒng)向客戶端發(fā)送“注冊成功”消息(7)系統(tǒng)在監(jiān)控界面上寫信息:xx客戶名 已注冊 注冊時(shí)間若重名,向客戶端發(fā)“注冊重

11、名”消息若注冊失敗,向客戶端發(fā)“注冊失敗”消息2.用戶登錄(1)系統(tǒng)啟動(dòng)后,等待客戶請求(2)客戶請求到,接受請求,分析確認(rèn)是“登錄請求”(3)系統(tǒng)讀取信息,驗(yàn)證用戶名、密碼是否存在(4)系統(tǒng)驗(yàn)證是否已經(jīng)登錄(5)系統(tǒng)驗(yàn)證用戶是否已超過最大用戶數(shù)(6) 系統(tǒng)將客戶加入聊天室,通知其它客戶“新用戶加入”(7)系統(tǒng)向客戶端發(fā)送“登錄成功”消息(8) 系統(tǒng)在監(jiān)控界面上寫信息:客戶名:已登錄登錄時(shí)間若驗(yàn)證失敗,向客戶端發(fā)“驗(yàn)證失敗”消息3.發(fā)送信息(用于管理員向聊天者發(fā)送公告信息)(1)系統(tǒng)啟動(dòng)后,等待管理員請求(2) 管理員在監(jiān)控界面輸入消息,確定發(fā)送類型(群發(fā)還是私聊),若私聊還需指定目的用戶名,

12、按發(fā)送按鈕(3)系統(tǒng)讀取信息,分析并確認(rèn)是群發(fā)還是私聊(4 )若是群發(fā),則將信息發(fā)給聊天室內(nèi)其它所有用戶;若是私聊,則將消 息發(fā)給指定的用戶。(5)系統(tǒng)在監(jiān)控界面上寫信息:管理員-消息若出現(xiàn)異常,提示“發(fā)送失敗”。4接收信息(1)系統(tǒng)啟動(dòng)后,等待客戶請求(2)客戶請求到,接受請求,分析確認(rèn)是“接收信息請求”(3)系統(tǒng)讀取信息,分析并確認(rèn)是群發(fā)還是私聊(4)若是群發(fā),則將信息發(fā)給聊天室內(nèi)其它所有用戶(5)系統(tǒng)向客戶端發(fā)送“接收成功”消息(可?。?)系統(tǒng)在監(jiān)控界面上寫信息:xx客戶名-消息 群發(fā)/私聊若出現(xiàn)異常,向客戶端發(fā)“接收失敗”消息(可?。? 用戶退出(1)系統(tǒng)啟動(dòng)后,等待客戶請求(2)客

13、戶請求到,接受請求,分析確認(rèn)是“用戶退出請求”(3)系統(tǒng)從聊天室刪除客戶,并通知其它用戶“客戶退出”(4)系統(tǒng)向客戶端發(fā)“退出成功”(可?。P(guān)閉連接。聊天系統(tǒng)主要應(yīng)用在局域網(wǎng),在性能方面要求,客戶到客戶間消息傳輸時(shí)間 不大于5s,傳輸可靠性要求95%勺情況下,消息可以可靠傳到目的地,同時(shí)在線 用戶數(shù)量不小于200。友情提示:本需求分析只是分析了主要的用戶使用情況, 在對客戶端進(jìn)行分析時(shí), 聊天者是一個(gè)接口,服務(wù)方也是一個(gè)接口,在對服務(wù)端進(jìn)行分析時(shí),客戶端是一 個(gè)接口,服務(wù)方管理員是另一個(gè)接口。在接口處只關(guān)心接口處的輸入輸出, 并不 關(guān)心接口里面是如何實(shí)現(xiàn)的。例如客戶端登陸用例分析時(shí),客戶發(fā)“

14、登錄請求” 信息到服務(wù)端,此時(shí)只需關(guān)注服務(wù)方返回情況,所以只需等待獲取服務(wù)端返回信 息,而無需知道服務(wù)方是如何處理的。 服務(wù)方如何處理是在服務(wù)端登錄用例中描 述的。隱含需求的發(fā)現(xiàn)。在登錄用例中,客戶和服務(wù)方都有登錄用例,合作完成一 個(gè)完整的登錄過程,密碼和用戶名的驗(yàn)證一般都能想到,但限制用戶數(shù)量,同一用戶不能重復(fù)登錄則不太容易想到,這里經(jīng)驗(yàn)就會(huì)起作用,這是第一步,想到了就要向客戶提出(必要時(shí)解釋),具體要不要做由客戶決定,則是第二步。這里 還有一個(gè)度的把握,因?yàn)椴豢赡苋魏吻闆r都要向客戶解釋。 經(jīng)驗(yàn)如何來?學(xué)習(xí)前 人的經(jīng)驗(yàn)并運(yùn)用到自己的項(xiàng)目開發(fā)中,體會(huì)轉(zhuǎn)化為自己的東西應(yīng)該是個(gè)有效途 徑。優(yōu)先級(jí)的

15、劃分。作為聊天系統(tǒng),其主要功能就是聊天,客戶間互相發(fā)送消息, 所以優(yōu)先級(jí)最高的是客戶端的發(fā)送、接收、退出用例,服務(wù)器端的接收、退出用 例。注冊、登錄用例次之。而公告、踢人、保存日志及聊天記錄、個(gè)性化界面等 又次之。優(yōu)先級(jí)劃分后,設(shè)計(jì)實(shí)現(xiàn)時(shí),先做優(yōu)先級(jí)高的,例如本系統(tǒng),為了實(shí)現(xiàn) 上述全部功能,可以分3次迭代,第一次,實(shí)現(xiàn)高優(yōu)先級(jí)的基本聊天功能,第二 次實(shí)現(xiàn)注冊和登錄,第三次實(shí)現(xiàn)公告、踢人、保存日志及聊天記錄等。其核心是 先實(shí)現(xiàn)最重要(用戶觀點(diǎn))和最難的(開發(fā)者觀點(diǎn)),這一觀點(diǎn)和日常思維相反, 但卻是有效避免風(fēng)險(xiǎn)和損失的方法,因?yàn)楸匦璧暮碗y度大的一開始就實(shí)現(xiàn)不了的 話,項(xiàng)目可以及時(shí)改變,否則等到最

16、后才發(fā)現(xiàn)了難以解決而又必須解決的問題時(shí), 損失就會(huì)更大。當(dāng)然在攻克重難點(diǎn)時(shí),又可以采用由易到難的辦法,逐步解決。 一個(gè)是策略,一個(gè)是戰(zhàn)術(shù),思路相反,關(guān)鍵是要運(yùn)用得當(dāng)。2、業(yè)務(wù)對象分析從上述的分析中,運(yùn)用名詞法,可以發(fā)現(xiàn)出主要的業(yè)務(wù)對象: 1聊天者:屬性:用戶名、密碼、確認(rèn)密碼、性別、年齡、電子郵件 行為:登錄、注冊2聊天客戶端:屬性:消息、聊天者、界面行為:接收處理,發(fā)送處理、退出3消息屬性:消息類型、消息參數(shù)行為:創(chuàng)建消息、獲取消息類型、獲取消息參數(shù)4服務(wù)器(相當(dāng)于總服務(wù)臺(tái))屬性:IP、端口、服務(wù)監(jiān)控、消息處理者行為:監(jiān)聽、創(chuàng)建消息處理者、創(chuàng)建服務(wù)監(jiān)控5服務(wù)監(jiān)控屬性:服務(wù)狀態(tài),消息,聊天者列

17、表、界面行為:發(fā)送服務(wù)方消息、關(guān)閉服務(wù)器6消息處理者(相當(dāng)于服務(wù)員)屬性:連接(socket)、消息行為:處理消息(登錄、注冊、發(fā)送、接收、退出),收發(fā)消息友情提示:業(yè)務(wù)對象是系統(tǒng)中對象的初步提煉,其屬性和行為在后面還會(huì)修改、 變動(dòng),主要與業(yè)務(wù)相關(guān),和具體的實(shí)現(xiàn)關(guān)系不大,是后面設(shè)計(jì)中業(yè)務(wù)類的基礎(chǔ), 但實(shí)際類的數(shù)量也許會(huì)很多,因?yàn)樵谠O(shè)計(jì)甚至在實(shí)現(xiàn)時(shí)都可能需要建立新的類以 實(shí)現(xiàn)功能。不少講分析設(shè)計(jì)的書并不提到這一步,而是在設(shè)計(jì)中直接給出類圖, 結(jié)果是一樣的,但反映不出這些類是如何來的, 如果你注重過程,可以看一下本 節(jié),若果你注重結(jié)果,直接看設(shè)計(jì)實(shí)現(xiàn)中的相關(guān)內(nèi)容。3、驗(yàn)收測試要求測試環(huán)境:客戶及服

18、務(wù)器機(jī)操作系統(tǒng): Window XP內(nèi)存:512M客戶端程序安裝在客戶機(jī)(至少 2臺(tái))上,通過以太網(wǎng)(網(wǎng)速至少10M與服 務(wù)器相連。前置條件:1注冊文件已創(chuàng)建但為空。2客戶及服務(wù)程序安裝配置正確,能正常啟動(dòng)運(yùn)行。3客戶程序與服務(wù)程序能通過網(wǎng)絡(luò)互通。一初始化數(shù)據(jù)1客戶端啟動(dòng),進(jìn)入注冊界面,輸入正確的注冊數(shù)據(jù),請求注冊,查看服務(wù)端, 看是否正確注冊。2重復(fù)1,在另一客戶端注冊用戶,注意不要重名。二功能測試1注冊測試。(1)測試重名注冊。進(jìn)入注冊界面輸入重名用戶名,其它正確,請求注冊。(2)測試空輸入,進(jìn)入注冊界面,直接按注冊按鈕。(3)測試口令的一 致性,口令長度,年齡及郵箱的數(shù)據(jù)有效性(具體測試

19、用例設(shè)計(jì)可參考需求分析 及詳細(xì)設(shè)計(jì)中的相關(guān)部分)。2登錄測試。(1)輸入正確的口令和密碼,按登錄按鈕(2)空輸入,直接按登 錄按鈕。(3)分別輸入用戶名不正確但密碼正確,用戶名正確但密碼不正確,用 戶名和密碼均不正確,應(yīng)均不能正確登錄。(4)以同一用戶名重復(fù)登錄一次 測試(1)( 3)時(shí)要查看服務(wù)端的顯示3發(fā)送接收測試。(1)進(jìn)入收發(fā)界面,群發(fā)一條消息,觀察其它客戶是否收到消 息,察看服務(wù)器有無相應(yīng)顯示 (2)私聊一條消息,察看指定用戶是否收到消息(3)無任何輸入,直接按發(fā)送。(4)退出系統(tǒng),察看服務(wù)端顯示,察看其它客 戶端是否已將該客戶名刪除。(5)再啟動(dòng)客戶端,登錄進(jìn)入收發(fā)界面,連續(xù)群發(fā)(

20、至少3次),連續(xù)私聊(至少3次),再連續(xù)群發(fā),觀察其它客戶及服務(wù)方的顯 示是否正確。三可靠性測試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ā)。同時(shí)觀察其它客戶及服務(wù)器收發(fā)、客戶列表是否正常。2在正常收發(fā)中,強(qiáng)行關(guān)閉服務(wù)器,觀察各客戶端的反應(yīng)??蛻舳藨?yīng)給出發(fā) 送異常提示,不應(yīng)退出或死機(jī)。四性能測試(可選)編制一測試程序,作為客戶端,登錄進(jìn)系統(tǒng),向服務(wù)器按指定時(shí)間間隔群發(fā) 消息??赏瑫r(shí)啟動(dòng)多個(gè)發(fā)送線程(模擬多

21、個(gè)客戶),同時(shí)向服務(wù)器群發(fā)消息???在200個(gè)模擬客戶(200個(gè)發(fā)送線程),每1s 一個(gè)消息的情況下,服務(wù)器能否滿 足客戶到客戶傳輸時(shí)間小于 5s的要求。也可以考慮使用JMeter壓力測試工具。三、系統(tǒng)設(shè)計(jì)1、總體設(shè)計(jì)一系統(tǒng)總體結(jié)構(gòu)總體設(shè)計(jì)階段主要是確定系統(tǒng)的體系結(jié)構(gòu)和主要模塊,顯然系統(tǒng)分客戶端子系統(tǒng)和服務(wù)器子系統(tǒng)。系統(tǒng)體系結(jié)構(gòu)如圖 2所示:圖2系統(tǒng)體系結(jié)構(gòu)圖客戶端可以劃分成三子層,服務(wù)端也可以劃分出三個(gè)子層,客戶和服務(wù)器間通信 采用的是可靠的TCP協(xié)議?;镜牧奶爝^程如下:0客戶端啟動(dòng)注冊、登錄后,進(jìn)入收發(fā)界面,此時(shí) C/S連接已建立,C處于接 收狀態(tài)。1客戶A從界面輸入消息,確定群發(fā),業(yè)務(wù)

22、邏輯層從界面獲取信息并驗(yàn)證后生 成“消息接收請求”消息,再將消息作為參數(shù)調(diào)用網(wǎng)絡(luò)通信層的發(fā)送函數(shù),發(fā)送 函數(shù)將消息發(fā)往服務(wù)器,然后等待服務(wù)器的消息2服務(wù)器收到消息,確定是客戶A發(fā)來的,從消息中分析出是群發(fā),然后從當(dāng) 前客戶列表中取出除A以外的與每個(gè)客戶(B, C)對應(yīng)的socket,然后通過socket 將消息轉(zhuǎn)發(fā)給客戶B,Co3服務(wù)器在監(jiān)控界面上顯示:客戶 A消息 群發(fā)4服務(wù)器生成“消息接收成功”消息,向客戶 A回發(fā)(可省)。5客戶A收到消息,確定是“消息接收成功”消息后,在界面上顯示發(fā)送成功。6客戶B/C的通訊模塊接收到消息,分析確認(rèn)是“消息接收請求”,則在界面上 顯示:客戶A-消息 群發(fā)

23、。不向服務(wù)器發(fā)送消息收到的確認(rèn)消息。消息收發(fā)的簡圖如下圖3所示:發(fā)送1接收消息請求2.1接收消息請求客戶A客戶B3接收消息成功-聊天服務(wù)接收-(可以不要)器客戶C* -接收2.2接收消息請求圖3消息收發(fā)示意圖經(jīng)驗(yàn)共享:下面是本人在網(wǎng)絡(luò)編程方面多年積累的經(jīng)驗(yàn),感興趣的可以讀一讀要不要回復(fù)消息?由于使用的是 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ù)。前者編程簡單、性能好,但

24、對于某些異常情況不能可靠處理,后者編 程復(fù)雜,性能差,但可靠性高。這就要根據(jù)情況在上述矛盾中折中,對于“聊天 室系統(tǒng)”,對可靠性要求并不高,即使消息有 5淋收到,也沒有大的問題,另外 聊天者是處理各種不可靠問題的最佳人選,實(shí)在不行,可由人重啟系統(tǒng)(不會(huì)帶來任何人身及財(cái)物損失),另外本系統(tǒng)主要應(yīng)用在局域網(wǎng),而局域網(wǎng)的可靠性是 較高的。所以本文推薦采用無回復(fù)方式。這適用于其它消息的處理。消息的收發(fā)方式?主要分兩種,一種是推方式,例如客戶A有了消息就直接 發(fā)給服務(wù)器,這是推方式,即由數(shù)據(jù)源方直接將消息發(fā)給接收方; 另一種是拉方 式,即接收方主動(dòng)向數(shù)據(jù)源請求獲取數(shù)據(jù), 例如服務(wù)器通過定期詢問客戶 A有

25、無 數(shù)據(jù)的方式,客戶A一旦有消息,就會(huì)發(fā)消息給服務(wù)器。 顯然這兩種方式應(yīng)用的 場合是不一樣的,上文中描述的是“推”方式,客戶A將消息發(fā)(推)給服務(wù)器, 服務(wù)器將消息再轉(zhuǎn)發(fā)(推)給其它客戶。數(shù)據(jù)源(客戶A)的特點(diǎn)是消息的產(chǎn)生是不確定的(接收方難以知道發(fā)方何時(shí)有消息),產(chǎn)生就發(fā)是高效的方式,若服 務(wù)器采用輪詢的方式,一方面在大多數(shù)情況下會(huì)產(chǎn)生許多無謂的詢問,另一方面會(huì)降低服務(wù)器的性能(特別是服務(wù)器可能成為整個(gè)系統(tǒng)的性能瓶頸,這就尤為重 要),這里還隱含了一個(gè)假設(shè):在聊天過程中,服務(wù)器一直等待消息的到來,B、C也隨時(shí)能接受消息,所以發(fā)送(推)一般是能成功的。服務(wù)器向客戶B,C推消息(相當(dāng)于客戶B C

26、接收消息),是基于B、C都在準(zhǔn)備接收的假設(shè),這一點(diǎn)較 之服務(wù)器一直可靠運(yùn)行的假設(shè),其假設(shè)的有效性較低,因?yàn)榭蛻舴降男袨殡y以預(yù) 料,可能客戶重啟了系統(tǒng),可能突然斷電等。服務(wù)器可能白發(fā)了消息(為保證消 息發(fā)到客戶,服務(wù)器會(huì)重復(fù)發(fā)送消息,造成性能損失),因?yàn)樗恢揽蛻羰欠?在等著接收消息,這時(shí)可以考慮客戶方主動(dòng)接收消息,通過定期輪詢的方式,向服務(wù)器要數(shù)據(jù),這時(shí)服務(wù)器就知道客戶一定能接收消息,所以就發(fā)消息給客戶, 這種方式是“拉”方式。此方式較之服務(wù)器直接推,服務(wù)器性能上有所損失,主 要用于處理客戶的輪詢消息(較之重發(fā)消息,開支一般較?。?,客戶方因?yàn)橐営?,也損失性能,但這對于客戶端并不重要(其計(jì)算

27、能力絕大部分情況下都足夠), 編碼量上C/S均增加了,它的好處是如果多數(shù)情況下不能保證客戶方一直在線, 則服務(wù)方可以處理多次輪詢,但只發(fā)一次消息給客戶,較之不斷的重發(fā)消息給客 戶(尤其是大量用戶群發(fā)時(shí))總體性能上是提高的。輪詢時(shí)間的確定主要是在消 息收發(fā)的及時(shí)性和性能影響之間取得平衡,周期過小,服務(wù)器處理壓力大,周期過長,客戶不能及時(shí)收到消息,一般可取 25秒。推薦的方式是“推”方式,因?yàn)椤?Happy Chat ”應(yīng)用于局域網(wǎng),網(wǎng)絡(luò)條件 較好,且基于可靠的TCP協(xié)議傳輸消息,本身對可靠性要求也不高, 具體說就是 服務(wù)器向客戶轉(zhuǎn)發(fā)消息時(shí),不管成功與否只發(fā)一次,客戶向服務(wù)器發(fā)消息時(shí),若出錯(cuò),不會(huì)

28、自動(dòng)重發(fā),但會(huì)給出提示,由聊天者決定是否重發(fā)(如再次按發(fā)送按 鈕)0即認(rèn)為在多客戶聊天過程中服務(wù)器一直正常運(yùn)行,客戶端也一直正常。這 樣做以后,簡化了設(shè)計(jì)編碼,性能也得到提高。結(jié)論:系統(tǒng)采用無回復(fù)的“推”方式收發(fā)消息。服務(wù)器結(jié)構(gòu)耳(3 3 Corm&tionCorm&tionWordFiltcrWordFiltcr切天內(nèi)容辻建斎 服務(wù)器端主要的模塊和結(jié)構(gòu)如圖 4所示:圖4服務(wù)器端結(jié)構(gòu)圖AppServer.java為服務(wù)器端監(jiān)聽類,負(fù)責(zé)服務(wù)器的啟動(dòng),包括啟動(dòng)監(jiān)聽端 口、服務(wù)器監(jiān)控界面。ServerFrame.java為服務(wù)器監(jiān)控窗體,負(fù)責(zé)監(jiān)控服務(wù)器運(yùn)行狀態(tài),聊天內(nèi)容, 發(fā)送公告,踢人 .Conn

29、ection.java為服務(wù)器連接處理的具體實(shí)現(xiàn)。WordFilter.java語言過濾類,處理非法聊天內(nèi)容的過濾。(可選)三客戶端結(jié)構(gòu)客戶端主要模塊和結(jié)構(gòu)如圖5所示:圖5客戶端結(jié)構(gòu)圖ChatClie nt.java為客戶端程序啟動(dòng)類,負(fù)責(zé)客戶端的啟動(dòng)和退出。Login.java為客戶端程序登錄界面,負(fù)責(zé)用戶帳號(hào)信息的驗(yàn)證與反饋。 Register.java為客戶端程序注冊界面,負(fù)責(zé)用戶帳號(hào)信息的注冊驗(yàn)證與反饋。ChatRoom.java為客戶端程序聊天室主界面,負(fù)責(zé)接收、發(fā)送聊天內(nèi)容與服 務(wù)器端的Connection.java親密合作。Windowclose為ChatRoom.java的內(nèi)部

30、類,負(fù)責(zé)監(jiān)聽聊天室界面的操作,當(dāng) 用戶退出時(shí)返回給服務(wù)器信息。Clock.java為客戶端程序的一個(gè)小程序,實(shí)現(xiàn)的一個(gè)石英鐘功能。(可選)2、詳細(xì)設(shè)計(jì)a 、客戶端設(shè)計(jì) 一注冊模塊程序?qū)⑼ㄟ^Register.java用戶注冊界面收集用戶的用戶名、密碼、年齡、電 子郵箱等。參考界面如圖6。圖6客戶端注冊界面處理過程:當(dāng)用戶注冊時(shí),客戶端的Register.java界面收集并驗(yàn)證了用戶的注冊信息后,封裝成Register_Customer類然后通過建立在Socket的連接之上的 對象輸出流將用戶注冊信息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Conn ection 處理,Connection在收到信息后

31、將驗(yàn)證數(shù)據(jù)的完整性并在數(shù)據(jù)庫中查找該用戶名 是否已經(jīng)注冊,然后將注冊信息加入數(shù)據(jù)庫,最后將注冊結(jié)果返回給客戶端???戶端顯示結(jié)果(重名、成功、失?。嚅_連接。驗(yàn)證要求如下:1驗(yàn)證用戶名是否為空用戶名:丄.頭像:2口 令:確認(rèn)口會(huì):性別:應(yīng)男R女年 齡:電子郵件:即用戶名的字符長度不為0,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回“用 戶名為空”錯(cuò)誤。2 驗(yàn)證密碼是否為空即密碼的字符長度不為 0,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回“用 戶密碼為空”錯(cuò)誤。3驗(yàn)證密碼的一致性驗(yàn)證密碼兩次輸入是否一致,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回“密 碼兩次輸入不一致,請重新輸入”錯(cuò)誤。4驗(yàn)證年齡是否為

32、空即用戶年齡的字符長度不為 0,如果驗(yàn)證通過,就繼續(xù)下面驗(yàn)證,否則返回 “用戶名為空錯(cuò)誤”5驗(yàn)證年齡的合法性即用戶年齡介于10到100之間,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則返 回“用戶年齡為空”6驗(yàn)證電子郵箱的合法性即電子郵箱字符串必須有“ ” ,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則 返回“電子郵箱不合法”,登錄模塊程序?qū)⑼ㄟ^Login.java用戶登錄界面收集用戶的用戶名、密碼,如圖7所示。圖7客戶端登錄界面登錄過程如下:當(dāng)用戶登錄時(shí),客戶端由Login.java界面收集并驗(yàn)證用戶登錄信息后,封裝 成Customer對象類然后通過建立在Socket的連接之上的對象輸出流將用戶登錄 信

33、息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection在收到信息后將驗(yàn)證數(shù)據(jù)的完整性并在對象型數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注 冊,然后將注冊用戶的信息與登錄請求信息進(jìn)行密碼驗(yàn)證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結(jié)果返回給客戶端。如果登錄成功,客戶端將繼續(xù)啟動(dòng)聊天室主界面。驗(yàn)證要求:1驗(yàn)證用戶名是否為空即用戶名的字符長度不為 0,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回“用戶名為空”錯(cuò)誤,2驗(yàn)證密碼是否為空即密碼的字符長度不為0,如果驗(yàn)證通過,就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回“用戶密碼為空”錯(cuò)誤當(dāng)以上信息驗(yàn)證成功時(shí),客戶端將打開與服務(wù)之間的Socke

34、t連接,用對象輸 出流包裝后將用戶登錄的信息發(fā)送給服務(wù)器端,并接收服務(wù)器處理完用戶登錄的信息。當(dāng)客戶端收到服務(wù)器返回的信息時(shí),將會(huì)用信息對話框的形式告知用戶是否注冊成功,若成功則顯示收發(fā)主界面 ChatRoom,關(guān)閉Socket連接。三收發(fā)模塊當(dāng)用戶登錄成功后,用戶的登錄界面將會(huì)消失,然后創(chuàng)建用戶聊天室窗口 (如 圖),在界面的標(biāo)題欄將會(huì)顯示當(dāng)前登錄用戶的用戶名,以防止一個(gè)機(jī)器上的用 戶開多個(gè)帳號(hào)進(jìn)入聊天室后分不清哪個(gè)窗口是哪個(gè)用戶登錄的,界面第一行將顯示當(dāng)前服務(wù)器的在線人數(shù)。位于界面正中的兩個(gè)控件分別是 List和TextBox用來 顯示當(dāng)前服務(wù)器上的在線會(huì)員名單列表和公共聊天信息。位于界面

35、下方的就是一些用于聊天的功能控件和聊天內(nèi)容個(gè)性化配置控件(可選)。包括聊天對象、聊天語氣、聊天內(nèi)容、聊天字體、風(fēng)格、大小、顏色 1用戶發(fā)送信息當(dāng)用戶需要發(fā)送聊天信息時(shí),可以在在線列表中選中聊天對象或者“所有人”,選擇發(fā)言的語氣,和是否私聊就可以發(fā)送聊天信息了當(dāng)用戶點(diǎn)擊完發(fā)送按鈕后,程序開始將當(dāng)前用戶名、聊天對象、聊天內(nèi)容、聊天語氣和是否私聊進(jìn)行封裝,然后獲取Socket連接,再用對象輸出流包裝Socket的輸出流將聊天信息對象發(fā)送給服務(wù)器端。2接收聊天信息接收用戶的聊天信息是用一個(gè)單獨(dú)的接收線程實(shí)現(xiàn)的,因?yàn)榭蛻舳吮仨氹S 時(shí)接收服務(wù)器發(fā)來的消息,而讀取消息的方法采用的一般是讀直到有消息到來的“阻

36、塞讀”方式,若在事件處理程序中讀(占用的是事件處理線程)則會(huì)使程序 在此后無法響應(yīng)用戶操作,所以需要生成一個(gè)單獨(dú)的線程專門用于讀取處理消 息。而發(fā)送消息的方法則是將消息放入操作系統(tǒng)的發(fā)送緩沖區(qū)后就返回的,所以發(fā)送執(zhí)行的相當(dāng)快,可以在事件處理線程中直接調(diào)用。發(fā)送和接收可以同時(shí)進(jìn)行。當(dāng)每次用戶接收到聊天信息后將會(huì)開始分析聊天信息然后將適合自己的信 息顯示在聊天信息界面上。收發(fā)界面如圖 8所示。圖8收發(fā)界面圖上的字體(個(gè)性化)、時(shí)鐘、保存等是可選的功能,聊天者列表、聊天信息顯 示,聊天內(nèi)容、私聊等是必需的。b、服務(wù)端設(shè)計(jì)功能描述:1接受用戶注冊信息并保存在一個(gè)基于文件的對象型數(shù)據(jù)庫。2.能夠允許注冊

37、過的用戶登陸聊天界面并可以聊天。3.能夠接受私聊信息并發(fā)送給特定的用戶。4.服務(wù)器運(yùn)行在自定義的端口上1888。5. 服務(wù)器監(jiān)控用戶列表和用戶聊天信息(私聊除外)。6.服務(wù)器踢人,發(fā)送通知(可選)。7.服務(wù)器保存日志(可選)。一用戶注冊1.去數(shù)據(jù)庫讀數(shù)據(jù)首先創(chuàng)建一個(gè)File文件類,載入“ user.tx”再用對象輸入流 ObjectlnputStream 包裝File文件類,將存儲(chǔ)在“ user.txt”得向量對象Vector中載入內(nèi)存中,現(xiàn)在系 統(tǒng)中的向量就是對象型數(shù)據(jù)庫,存儲(chǔ)著每條用戶信息對象。2.判斷是否是第一個(gè)注冊用戶檢測內(nèi)存中的數(shù)據(jù)庫對象集的當(dāng)前容量是否為空,如果是,將收集的注冊用戶

38、 信息對象添加到數(shù)據(jù)庫對象集中,然后直接寫入數(shù)據(jù)庫,否則繼續(xù)進(jìn)行其他判斷。3.判斷用戶名是否已經(jīng)存在檢測內(nèi)存中的數(shù)據(jù)庫對象集的中有沒有和當(dāng)前收集的注冊用戶名相同的記 錄,如果有,就退出檢測,否則繼續(xù)下一個(gè)檢測。4.判斷用戶名是否為系統(tǒng)關(guān)鍵字檢測當(dāng)前收集的用戶名是否為“所有人”,如果是,就退出檢測,否則繼續(xù) 下一個(gè)檢測。因?yàn)椤八腥恕边@個(gè)名字會(huì)和系統(tǒng)發(fā)生沖突,用戶發(fā)給所有人的信 息將會(huì)使用“所有人”這個(gè)特殊用戶名。5.用戶名有效后寫入數(shù)據(jù)庫當(dāng)前面的驗(yàn)證全部都通過的時(shí)候,將用戶的注冊信息對象添加到用戶數(shù)據(jù)庫 中,然后創(chuàng)建文件輸出流,再用對象輸出流包裝后寫入本地文件將其持久化。最后關(guān)閉對象輸出流和文

39、件輸入流。6.給客戶端返回信息將用戶注冊成功或失敗的信息用打印流包裝Socket以后,輸出給客戶端注冊結(jié)果的詳細(xì)信息。7在監(jiān)管界面上顯示信息,如圖9所示。8.關(guān)閉Socket連接當(dāng)以上的程序都正常運(yùn)行后,需要關(guān)閉Socket連接,否則將會(huì)浪費(fèi)服務(wù)器與客戶端之間的資源。二用戶登錄1.去數(shù)據(jù)庫讀用戶數(shù)據(jù)打開用戶數(shù)據(jù)庫文件“ user.txt”,將用戶數(shù)據(jù)對象集載入內(nèi)存,以供下面的 程序使用。2.驗(yàn)證用戶名是否存在在對象數(shù)據(jù)庫中查找是否有與登陸用戶的用戶名相同的記錄,如果有繼續(xù)驗(yàn) 證,否則退出驗(yàn)證處理,返回“沒有此用戶”錯(cuò)誤。3.驗(yàn)證用戶密碼是否正確如果有與登錄用戶的用戶名相同的記錄,接著判斷密碼是

40、否正確。如果密碼 正確,繼續(xù)驗(yàn)證,否則退出驗(yàn)證處理,返回“用戶密碼錯(cuò)誤”。4.驗(yàn)證用戶是否已經(jīng)登錄在服務(wù)器的已登錄用戶列表中查找是否有該用戶,如果有該用戶,退出驗(yàn)證 處理返回“該用戶已經(jīng)登錄”錯(cuò)誤。否則繼續(xù)下面的驗(yàn)證。5.驗(yàn)證是否已經(jīng)超過最大登錄人數(shù)檢測服務(wù)器的在線人數(shù)是否已經(jīng)達(dá)到限制的最大人數(shù),如果是,退出驗(yàn)證處 理返回“當(dāng)前服務(wù)器人數(shù)已滿,請稍后再試”錯(cuò)誤。否則繼續(xù)下面的驗(yàn)證。6.返回客戶端信息如果以上驗(yàn)證全部正確,就返回客戶端“用戶登錄成功”。7在監(jiān)控界面顯示信息,如圖9所示8.關(guān)閉Socket連接當(dāng)以上的程序都正常運(yùn)行后,需要關(guān)閉Socket連接,否則將會(huì)浪費(fèi)服務(wù)器與圖9服務(wù)器管理界面

41、客戶端之間的資源 三用戶退出1接收退出信息當(dāng)用戶退出時(shí),客戶端將會(huì)用基于Socket的對象輸出流發(fā)給服務(wù)器退出對象。2在線列表中刪除用戶用戶退出后應(yīng)該把用戶從在線列表中刪除,否則用戶退出用戶還在在線列表 中,那么該用戶下次將會(huì)無法登錄。3更新在線列表用戶退出后將服務(wù)器端監(jiān)控界面的用戶列表更新。否則用戶數(shù)據(jù)將會(huì)不同 IEIE叫圖10服務(wù)器用戶信息管理界面四接收轉(zhuǎn)發(fā)用戶聊天信息1接收用戶聊天信息當(dāng)用戶發(fā)送聊天信息時(shí),服務(wù)端將會(huì)收到客戶端用Socket傳輸過來的聊天信 息對象,然后將其強(qiáng)制轉(zhuǎn)換為 Message對象。2.過濾用戶聊天內(nèi)容的非法信息(可選)分析聊天信息對象的聊天內(nèi)容,用語言過濾類將非法

42、字符過濾掉。語言過濾 的時(shí)候?qū)?huì)打開“ badword.txt”文件,不允許出現(xiàn)的關(guān)鍵詞將會(huì)存儲(chǔ)在文件中, 關(guān)鍵字之間以逗號(hào)分割。當(dāng)聊天內(nèi)容中出現(xiàn)要過濾的關(guān)鍵字是將會(huì)被系統(tǒng)屏蔽,而聊天內(nèi)容也將替換成“非法內(nèi)容,系統(tǒng)屏蔽”。3返回聊天信息然后系統(tǒng)從Message中提出消息類型,再根據(jù)類型將消息強(qiáng)制轉(zhuǎn)化 ChatMessage調(diào)用ChatMeaage中方法,獲取目的客戶名稱列表,根據(jù)目的地用 戶名從用戶名、socket鍵值表中獲取socket,再通過socket將Message轉(zhuǎn)發(fā)到目 的客戶。I竊器管理誦戶信息管建Message定義如下:1消息類型接收消息請求,登錄請求,登錄響應(yīng),注冊請求,注冊

43、響應(yīng)2獲取類型方法getTypeChatMessage繼承自Message增加如下屬性:(1).目的用戶名列表(2).用戶聊天內(nèi)容;相應(yīng)的還有 Log in Message、Logi nACKMessage、RegisterMessage RegisterACKMessage. LogoutMessage(客戶退出)等圖11通信協(xié)議交互圖友情提示:服務(wù)端采用一個(gè)“監(jiān)聽線程”負(fù)責(zé)監(jiān)聽連接請求,收到連接請求則創(chuàng) 建socket及相應(yīng)的處理線程,該線程在一個(gè)循環(huán)中通過socket讀取消息,分析處 理消息,直到遇到“退出”消息或管理員命令,線程才退出。所以服務(wù)端是“單 線程監(jiān)聽,多線程處理”的模式。經(jīng)

44、驗(yàn)共享:具體設(shè)計(jì)時(shí)應(yīng)用協(xié)議的設(shè)計(jì)是難點(diǎn),要根據(jù)需要確定具體的消息種類, 分清客戶端發(fā)出哪些消息,接收哪些消息,服務(wù)端又發(fā)出哪些消息,接收哪些消息。然后將這些消息構(gòu)成一個(gè)完整的聊天業(yè)務(wù)過程。可以用圖11描述。整個(gè)過程分注冊,登錄,收發(fā),退出四個(gè)階段。其中LogoutMsg為客戶聲明自己離線,其它客戶收到后將該用戶信息刪除,而QuitMsg是服務(wù)方發(fā)出的要求客戶離線的 消息,收到的客戶一般需要關(guān)閉連接。協(xié)議格式的設(shè)計(jì)也很重要,有基于文本格式和二進(jìn)制格式兩類。 文本格式的協(xié)議有HTTP SMTR簡單電子郵件傳輸協(xié)議)等,二進(jìn)制的協(xié)議如java的RMI CORBAwindows的DCOM等。文本形式的

45、協(xié)議簡單,可跨平臺(tái),例如使用HTTP協(xié)議的WE應(yīng)用,客戶端可以是 Window服務(wù)器端可以是Linux , Web!務(wù)器既 可以是用C開發(fā)的Apache,也可以是用其它語言開發(fā)的,只要他們遵守協(xié)議。 其缺點(diǎn)是性能不好,特別是傳輸大信息量消息時(shí),其次是名文傳輸,很容易被破解。二進(jìn)制方式的特點(diǎn)和文本方式相反,缺點(diǎn)是難以實(shí)現(xiàn)不同平臺(tái)不同語言間的 傳輸,優(yōu)點(diǎn)是高效,有一定的保密性。對于聊天室系統(tǒng),若用文本格式傳輸,建 議采用以下格式:消息類型+分隔符+ 參數(shù)1+參數(shù)分隔符+參數(shù)2+參數(shù)分隔符+ 分隔符可用:并保證:不出現(xiàn)在參數(shù)及消息類型字符串中,參數(shù)分隔符 可用 0 ,也需要保證其不出現(xiàn)在參數(shù)及消息類

46、型字符串中。若采用二進(jìn)制形 式,直接將相關(guān)消息對象序列化后即可。六、系統(tǒng)實(shí)現(xiàn)1、客戶端實(shí)現(xiàn)客戶端實(shí)現(xiàn)的關(guān)鍵在于接收線程的實(shí)現(xiàn),部分原型參考代碼如下:class ReadMessageThread exte nds Threadpublic void run()Stri ng lin e=;/循環(huán)讀并處理消息while(true)tryli ne=ci n.readLi ne();catch(IOExcepti on ex)System.out.println(”輸入輸出異常 n);/提取消息中的消息類型Stri ngToke nizer st=new Stri ngToke nizer(li

47、ne,:);Stri ng keyword=st. nextToke n();/根據(jù)類型處理消息if(keyword.equalslg noreCase(quit) /服務(wù)方指令退出try socket.close();jTextArea1.appe nd(”接收到服務(wù)器同意端口信息,套節(jié)字關(guān)閉n);break; /jump out of read threadcatch(Exceptio n ex)jTextArea1.append(”關(guān)閉套接字異常);/新用戶加入else if(keyword.equalslg no reCase(Log in)Vector imessage=new Ve

48、ctor();while(st.hasMoreToke ns()imessage.addEleme nt(st. nextToke n();jList1.setListData(imessage);/ 接收的消息else if(keyword.equalslg no reCase(AcceptMsg)Stri ng message=st. nextToke n(0);message=message.substri ng(1);jTextArea1.appe nd(message+n);創(chuàng)建客戶處理線程是Vector,存儲(chǔ)客戶對象在clie nts中判斷客戶是否存在 啟動(dòng)處理線程通知其它客戶,有

49、客戶加入信息讀取錯(cuò)誤! n);注:本例中通信協(xié)議的格式,為文本格式,基本格式為:類型:用戶名 /用戶消 息,較之設(shè)計(jì)中使用的二進(jìn)制消息對象形式,好處是簡單、可讀,可移植性好, 即使C/S采用不同語言開發(fā),只要遵守此文本格式協(xié)議,都可以互相通信,HTTP協(xié)議就是這方面的例子。2、服務(wù)器實(shí)現(xiàn)服務(wù)器端的關(guān)鍵在于接收處理線程和監(jiān)聽線程,基本代碼如下:/監(jiān)聽線程,實(shí)現(xiàn)多客戶聊天,解決只能處理單客戶問題class Conn ectSocket exte nds Thread Socket socket;public void run()while(true)try socket = serverSocke

50、t.accept();接收連接,返回連接 socketcatch (IOExcepti on ex) jTextArea2.append(”創(chuàng)建套接字連接錯(cuò)誤n);if(socket!=null)tryClie nt clie nt=new Clie nt(socket);/ clie nts.addEleme nt(clie nt);/clie ntsif(checkName(clie nt) / clie nt.start(); n otifyRoom();elsedisco nn ect(clie nt);catch(Exceptio n ex) jTextArea2.appe nd(”

51、/使用客戶處理線程來實(shí)現(xiàn)信息的讀取,解決程序死鎖的問題class Clie nt exte nds ThreadStri ng n ame;BufferedReader in;Prin tStream out;Socket socket;public Clie nt(Socket clie nt)this.socket=clie nt;tryin=new BufferedReader( newIn putStreamReader(socket.getl nputStream();out=new Prin tStream(socket.getOutputStream();Stri ng in f

52、o=i n.readLi ne();Stri ngToke nizer st info=new Stri ngToke nizer(i nfo,:);Stri ng head=sti nfo.n extToke n();n ame=sti nfo.n extToke n();jTextArea1.appe nd(”系統(tǒng)消息:+n ame+已經(jīng)連接 n);catch(IOExcepti on ex)System.out.pri ntln(”創(chuàng)建網(wǎng)絡(luò)輸入輸出流錯(cuò)誤!);/發(fā)送方法public void sen d(Stri ng msg)out.pri ntl n( msg);out.flush(

53、);/線程運(yùn)行部分public void run()Stri ng str=;while(true)trystr=i n.readLi ne();讀消息catch(IOExcepti on ex)jTextArea2.append(”輸入輸出異常 n);disc onn ect(this);no tifyRoom();return;/解析、處理消息Stri ngToke nizer st=new Stri ngToke nizer(str,:);Stri ng keyword=st. nextToke n();if(keyword.equals(Logout)客戶退出請求trysen d(Logout);no tifyRoom();this.stop();jTextAreal.append(”連接關(guān)閉);catch(Excepti

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論