2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目 錄</b></p><p>  1、課程設計目的 ------------------------------------------------------------------------------1</p><p>  2、學習目標----------------------------------------------

2、----------------------------------------1</p><p>  3、 背景介紹------------------------------------------------------------------------------------1</p><p>  3.1 業(yè)務背景---------------------------------

3、------------------2</p><p>  3.2 技術背景---------------------------------------------------3</p><p><b>  4. 需求分析</b></p><p>  4.1功能需求分析-------------------------------------

4、-----------5</p><p>  4.2 業(yè)務對象分析-----------------------------------------------8</p><p>  4.3 驗收測試要求-----------------------------------------------9</p><p><b>  5、系統(tǒng)設計</b&g

5、t;</p><p>  5.1 總體設計--------------------------------------------------11</p><p>  5.2 詳細設計--------------------------------------------------14</p><p><b>  系統(tǒng)實現(xiàn)</b></p

6、><p>  6.1客戶端實現(xiàn)-------------------------------------------------24</p><p>  6.2服務器實現(xiàn)-------------------------------------------------25</p><p>  7、 小結(jié)----------------------------------

7、-------------------------------------------------------28</p><p>  8、 展望-----------------------------------------------------------------------------------------28</p><p><b>  聊天室系統(tǒng)</b&

8、gt;</p><p><b>  一、課程設計目的</b></p><p>  《面向?qū)ο蟪绦蛟O計》是一門實踐性很強的計算機專業(yè)基礎課程,課程設計是學習完該課程后進行的一次較全面的綜合練習。其目的在于通過實踐加深學生對面向?qū)ο蟪绦蛟O計的理論、方法和基礎知識的理解,掌握使用Java語言進行面向?qū)ο笤O計的基本方法,提高運用面向?qū)ο笾R分析實際問題、解決實際問題的能力。&

9、lt;/p><p><b>  二、學習目標:</b></p><p>  1、理解基于網(wǎng)絡的C/S模式的軟件系統(tǒng)結(jié)構(gòu),掌握網(wǎng)絡編程的基本概念。2、了解Java 的多線程機制,掌握Java多線程技術的應用。3、熟練掌握基于TCP協(xié)議的Socket編程。4、了解Socket編程的協(xié)議約定,掌握簡單應用協(xié)議的開發(fā)。</p><p>  5、進一步

10、鞏固發(fā)展團隊協(xié)作能力。</p><p><b>  三、 背景介紹</b></p><p><b>  1、 業(yè)務背景</b></p><p>  隨著網(wǎng)絡社會的不斷發(fā)展,具有相同興趣的網(wǎng)民需要互相遠程交流,既要能省錢又要能即時交互,電話太貴、email又嫌慢,所以開發(fā)一個類似QQ 的及時通訊系統(tǒng)就變得非常有意義了?!癏a

11、ppy Chat”聊天系統(tǒng)應運而生,它較之QQ的唯一好處是自主開發(fā),用的放心,更適合在局域網(wǎng)內(nèi)使用。它提供的功能遠不如QQ豐富,但應具有如下功能:(1)與聊天室成員一起聊天;(2)可以與聊天室成員私聊;(3)用戶注冊、登錄;(4)服務器監(jiān)控聊天內(nèi)容;(5)服務器發(fā)送通知;(6)服務器踢人;(7)保存服務器日志。(8)保存用戶聊天信息。</p><p><b>  2、 技術背景</b><

12、;/p><p>  本系統(tǒng)要求使用java技術開發(fā),使用文件保存數(shù)據(jù),集成開發(fā)環(huán)境使用eclipse。開發(fā)者應有java程序設計語言、SWING基本GUI組件、多線程、文件使用、socket編程、使用eclipse的基本知識和技能。系統(tǒng)采用兩層C/S體系結(jié)構(gòu),C端負責通過GUI與客戶交互,實現(xiàn)注冊、登陸、收發(fā)信息、退出等功能; S端是聊天系統(tǒng)的應用服務器,主要有處理用戶注冊、登錄、用戶收發(fā)信息、用戶退出等功能。C端和

13、S端是通過網(wǎng)絡交互的,其基本原理如圖1所示:</p><p>  圖1 C/S通訊基本原理圖</p><p>  首先服務器啟動,它會建立一個專門用于接收客戶端連接請求的“傾聽Socket”(相當于總服務臺,有固定的IP地址和端口號),然后等待客戶的連接請求。</p><p>  當用戶想聊天時,從界面輸入信息,然后與服務器建立Socket連接(連接時應指定服務器的

14、IP地址和端口號,而客戶端socket的端口由本方操作系統(tǒng)從空閑端口中確定),服務器端的“傾聽Socket”收到連接請求后,一般會接受連接請求,并生成一個服務端socket(其端口號由服務端操作系統(tǒng)從空閑端口中確定),專門負責與此客戶端socket的通信。一旦連接請求成功,客戶端將信息及請求通過本方socket的輸出流發(fā)送給服務器端相應的socket,服務端則通過服務器端Socket的輸入流接受客戶端傳輸過來的信息及請求,分析是何請求,

15、然后根據(jù)請求類型,進行相應的處理(如登錄、轉(zhuǎn)發(fā)信息等)。服務方也可以根據(jù)需要,通過socket的輸出流發(fā)信息和請求給客戶端(公告)??蛻舴胶头辗蕉伎梢酝ㄟ^關閉本方的socket而結(jié)束一次通訊過程。</p><p>  不難發(fā)現(xiàn)服務器需要能同時接受多個客戶的請求,為了實現(xiàn)這一點,一般使用多線程機制來處理,對每一個客戶端連接通訊,服務器端都有一個線程專門負責處理(相當于一個服務員專門服務一個以IP地址和端口號唯一標

16、識的客戶)。</p><p>  上述方式兩個聊天者之間通信必須通過服務器進行轉(zhuǎn)發(fā),聊天者多時,顯然服務器是個性能瓶頸。能不能聊天者之間直接通信?當然可以,這是所謂的P2P聊天室,缺點是對聊天者缺乏集中監(jiān)管的手段。也有界于二者之間的,即有一服務器,接受注冊和登錄,實際聊天雙方通信時,仍然是直接通信,此時服務器相當于一個婚姻介紹所,只管牽線搭橋,具體談還是聊天者自己的事。</p><p> 

17、 本文主要采用聊天信息通過服務器轉(zhuǎn)發(fā)的方式,而且只支持一個聊天室。因為其他典型系統(tǒng)如電子郵件系統(tǒng),F(xiàn)TP系統(tǒng)均采用類似結(jié)構(gòu),WEB服務系統(tǒng)本質(zhì)上也是C/S系統(tǒng),只不過其客戶端是瀏覽器,采用了HTTP通信協(xié)議和HTML,所以變成了B/S結(jié)構(gòu),可以認為是C/S的一個具體應用,其機理是相似的。</p><p><b>  四、需求分析</b></p><p><b&g

18、t;  1、功能需求分析</b></p><p>  系統(tǒng)的主要功能已在業(yè)務分析中有所介紹,在這里需要對每個功能從使用者角度作較為具體的分析。很明顯,整個系統(tǒng)的功能可以自然地分為客戶端和服務器端。以下是主要用例描述</p><p><b>  一 客戶端</b></p><p><b>  1 . 注冊</b>

19、</p><p>  (1)客戶啟動程序,顯示出登陸界面</p><p> ?。?)客戶選擇其中的注冊按鈕,系統(tǒng)顯示注冊界面</p><p> ?。?)客戶填寫用戶名、密碼、確認密碼、性別、年齡、電子郵件,按確定按鈕</p><p> ?。?)系統(tǒng)驗證密碼和確認密碼是否相符、用戶名(不能重復)、電子郵件格式、年齡(大于10小于100)<

20、/p><p> ?。?)系統(tǒng)發(fā)送上述信息及“注冊請求”到服務端,等待服務端返回“注冊成功”消息</p><p> ?。?)系統(tǒng)提示注冊成功</p><p> ?。?)系統(tǒng)返回登陸界面</p><p>  若驗證失敗,提示“重新輸入”</p><p>  若服務端返回“注冊失敗”,提示“注冊失敗”</p>&l

21、t;p>  若服務端返回“注冊失敗 用戶名重名”,則提示“注冊失敗 用戶重名”。</p><p><b>  2. 登錄</b></p><p>  (1)客戶啟動程序,顯示出登陸界面</p><p> ?。?)客戶填寫用戶名、密碼,服務器IP地址,按登陸按鈕</p><p> ?。?)系統(tǒng)驗證用戶名、密碼,不能

22、為空、密碼字符長度為6-10</p><p> ?。?)系統(tǒng)發(fā)送用戶名、密碼及“登陸請求”到服務端,等待服務端返回“登錄成功”消息</p><p> ?。?)若成功系統(tǒng)顯示客戶端主界面(收發(fā)消息界面)</p><p>  若用戶名、密碼驗證失敗,系統(tǒng)提示;“用戶名或密碼錯”,重復3次若仍不能通過驗證則客戶端程序退出。</p><p>  若服

23、務端返回“登錄失敗”,系統(tǒng)提示“用戶名或密碼錯”。</p><p><b>  3. 發(fā)送信息</b></p><p>  (1)在客戶端主界面,用戶輸入消息,選擇是群發(fā)還是私聊,若是私聊還要選擇對方用戶名,按發(fā)送按鈕</p><p> ?。?)系統(tǒng)驗證消息長度, 私聊要求目的方用戶名非空。</p><p> ?。?)系

24、統(tǒng)發(fā)送信息及“接收消息請求”到服務器端,等待服務端返回“接收成功”消息(等待返回消息可?。?。</p><p> ?。?)系統(tǒng)提示信息已發(fā)送</p><p>  若發(fā)送不成功,則系統(tǒng)提示“發(fā)送失敗”。</p><p><b>  4. 接收信息</b></p><p> ?。?)客戶端系統(tǒng)啟動,進入主界面后,會顯示消息接收

25、框</p><p> ?。?)其他客戶或服務端系統(tǒng)本身發(fā)送消息過來,系統(tǒng)接收,分析確認是”</p><p>  接收消息請求“,則分析提取出消息</p><p>  (3) 在消息接收框逐條顯示發(fā)送者姓名、發(fā)送的消息。</p><p><b>  5 退出</b></p><p> ?。?)用戶

26、請求退出,按退出按鈕</p><p> ?。?)系統(tǒng)確認用戶退出(對話框)</p><p>  (3)系統(tǒng)發(fā)“退出請求”到服務端,等待服務端返回“退出成功”(等待返回消息可?。?lt;/p><p>  (4)客戶端系統(tǒng)關閉連接,程序退出</p><p><b>  二 服務器端</b></p><p>

27、;<b>  1. 用戶注冊</b></p><p> ?。?)系統(tǒng)啟動后,等待客戶請求</p><p> ?。?)客戶請求到,接受請求,分析確認是“注冊請求”</p><p> ?。?)系統(tǒng)讀取信息,分析并再次驗證用戶名、密碼、確認密碼、性別、年齡、電子郵件。</p><p> ?。?)系統(tǒng)根據(jù)用戶名,在已有客戶記錄中

28、查詢,確認沒有重名</p><p> ?。?)系統(tǒng)將用戶名、密碼、確認密碼、性別、年齡、電子郵件信息保存</p><p> ?。?)系統(tǒng)向客戶端發(fā)送“注冊成功”消息</p><p>  (7)系統(tǒng)在監(jiān)控界面上寫信息:xx客戶名 已注冊 注冊時間</p><p>  若重名,向客戶端發(fā)“注冊重名”消息</p><p>

29、  若注冊失敗,向客戶端發(fā)“注冊失敗”消息</p><p><b>  2. 用戶登錄</b></p><p> ?。?)系統(tǒng)啟動后,等待客戶請求</p><p> ?。?)客戶請求到,接受請求,分析確認是“登錄請求”</p><p> ?。?)系統(tǒng)讀取信息,驗證用戶名、密碼是否存在</p><p&g

30、t; ?。?)系統(tǒng)驗證是否已經(jīng)登錄</p><p>  (5)系統(tǒng)驗證用戶是否已超過最大用戶數(shù)</p><p> ?。?) 系統(tǒng)將客戶加入聊天室,通知其它客戶“新用戶加入”</p><p> ?。?)系統(tǒng)向客戶端發(fā)送“登錄成功”消息</p><p>  (8)系統(tǒng)在監(jiān)控界面上寫信息:客戶名:已登錄 登錄時間</p><p&

31、gt;  若驗證失敗,向客戶端發(fā)“驗證失敗”消息</p><p>  3. 發(fā)送信息(用于管理員向聊天者發(fā)送公告信息)</p><p> ?。?)系統(tǒng)啟動后,等待管理員請求</p><p> ?。?)管理員在監(jiān)控界面輸入消息,確定發(fā)送類型(群發(fā)還是私聊),若私聊還需指定目的用戶名,按發(fā)送按鈕</p><p>  (3)系統(tǒng)讀取信息,分析并確認

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> ?。?)客戶請求到,接受請求,分析確認是“接收信息請求”</p><p> ?。?)系統(tǒng)讀取信息,分析并確認是群發(fā)還是私聊</p><p> ?。?)若是群發(fā),則將信息發(fā)給聊天室內(nèi)其它所有用戶</p><p>  (5)系統(tǒng)向客戶端發(fā)送“接收成功”消息(可省)</p&

34、gt;<p>  (6)系統(tǒng)在監(jiān)控界面上寫信息:xx客戶名--〉消息 群發(fā)/私聊</p><p>  若出現(xiàn)異常,向客戶端發(fā)“接收失敗”消息(可省)</p><p><b>  用戶退出</b></p><p> ?。?)系統(tǒng)啟動后,等待客戶請求</p><p> ?。?)客戶請求到,接受請求,分析確認是

35、“用戶退出請求”</p><p> ?。?)系統(tǒng)從聊天室刪除客戶,并通知其它用戶“客戶退出”</p><p> ?。?)系統(tǒng)向客戶端發(fā)“退出成功”(可?。?,關閉連接。</p><p>  聊天系統(tǒng)主要應用在局域網(wǎng),在性能方面要求,客戶到客戶間消息傳輸時間不大于5s,傳輸可靠性要求95%的情況下,消息可以可靠傳到目的地,同時在線用戶數(shù)量不小于200。</p>

36、;<p>  友情提示:本需求分析只是分析了主要的用戶使用情況,在對客戶端進行分析時,聊天者是一個接口,服務方也是一個接口,在對服務端進行分析時,客戶端是一個接口,服務方管理員是另一個接口。在接口處只關心接口處的輸入輸出,并不關心接口里面是如何實現(xiàn)的。例如客戶端登陸用例分析時,客戶發(fā)“登錄請求”信息到服務端,此時只需關注服務方返回情況,所以只需等待獲取服務端返回信息,而無需知道服務方是如何處理的。服務方如何處理是在服務端登

37、錄用例中描述的。</p><p>  隱含需求的發(fā)現(xiàn)。在登錄用例中,客戶和服務方都有登錄用例,合作完成一個完整的登錄過程,密碼和用戶名的驗證一般都能想到,但限制用戶數(shù)量,同一用戶不能重復登錄則不太容易想到,這里經(jīng)驗就會起作用,這是第一步,想到了就要向客戶提出(必要時解釋),具體要不要做由客戶決定,則是第二步。這里還有一個度的把握,因為不可能任何情況都要向客戶解釋。經(jīng)驗如何來?學習前人的經(jīng)驗并運用到自己的項目開發(fā)中

38、,體會轉(zhuǎn)化為自己的東西應該是個有效途徑。</p><p>  優(yōu)先級的劃分。作為聊天系統(tǒng),其主要功能就是聊天,客戶間互相發(fā)送消息,所以優(yōu)先級最高的是客戶端的發(fā)送、接收、退出用例,服務器端的接收、退出用例。注冊、登錄用例次之。而公告、踢人、保存日志及聊天記錄、個性化界面等又次之。優(yōu)先級劃分后,設計實現(xiàn)時,先做優(yōu)先級高的,例如本系統(tǒng),為了實現(xiàn)上述全部功能,可以分3次迭代,第一次,實現(xiàn)高優(yōu)先級的基本聊天功能,第二次實現(xiàn)

39、注冊和登錄,第三次實現(xiàn)公告、踢人、保存日志及聊天記錄等。其核心是先實現(xiàn)最重要(用戶觀點)和最難的(開發(fā)者觀點),這一觀點和日常思維相反,但卻是有效避免風險和損失的方法,因為必需的和難度大的一開始就實現(xiàn)不了的話,項目可以及時改變,否則等到最后才發(fā)現(xiàn)了難以解決而又必須解決的問題時,損失就會更大。當然在攻克重難點時,又可以采用由易到難的辦法,逐步解決。一個是策略,一個是戰(zhàn)術,思路相反,關鍵是要運用得當。</p><p>

40、;<b>  2、業(yè)務對象分析</b></p><p>  從上述的分析中,運用名詞法,可以發(fā)現(xiàn)出主要的業(yè)務對象:</p><p><b>  1 聊天者:</b></p><p>  屬性:用戶名、密碼、確認密碼、性別、年齡、電子郵件</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 服務器(相當于總服務臺)</p><p>  屬性:IP、端口、服務監(jiān)控、消息處理者</p><p>  行為:監(jiān)聽、創(chuàng)建消息處理者、創(chuàng)建服務監(jiān)控</p><p><b>  5 服務監(jiān)控</b></p><p

43、>  屬性:服務狀態(tài),消息,聊天者列表、界面</p><p>  行為:發(fā)送服務方消息、關閉服務器</p><p>  消息處理者(相當于服務員)</p><p>  屬性:連接(socket)、消息</p><p>  行為:處理消息(登錄、注冊、發(fā)送、接收、退出),收發(fā)消息</p><p>  友情提示:業(yè)務

44、對象是系統(tǒng)中對象的初步提煉,其屬性和行為在后面還會修改、變動,主要與業(yè)務相關,和具體的實現(xiàn)關系不大,是后面設計中業(yè)務類的基礎,但實際類的數(shù)量也許會很多,因為在設計甚至在實現(xiàn)時都可能需要建立新的類以實現(xiàn)功能。不少講分析設計的書并不提到這一步,而是在設計中直接給出類圖,結(jié)果是一樣的,但反映不出這些類是如何來的,如果你注重過程,可以看一下本節(jié),若果你注重結(jié)果,直接看設計實現(xiàn)中的相關內(nèi)容。</p><p><b&g

45、t;  3、驗收測試要求</b></p><p><b>  測試環(huán)境:</b></p><p>  客戶及服務器機操作系統(tǒng):Window XP,內(nèi)存:512M。</p><p>  客戶端程序安裝在客戶機(至少2臺)上,通過以太網(wǎng)(網(wǎng)速至少10M)與服務器相連。</p><p><b>  前置條

46、件:</b></p><p>  1 注冊文件已創(chuàng)建但為空。</p><p>  2 客戶及服務程序安裝配置正確,能正常啟動運行。</p><p>  3 客戶程序與服務程序能通過網(wǎng)絡互通。</p><p><b>  一 初始化數(shù)據(jù)</b></p><p>  1 客戶端啟動,進入注

47、冊界面,輸入正確的注冊數(shù)據(jù),請求注冊,查看服務端,看是否正確注冊。</p><p>  2 重復1,在另一客戶端注冊用戶,注意不要重名。</p><p><b>  二 功能測試</b></p><p>  1 注冊測試。(1)測試重名注冊。進入注冊界面輸入重名用戶名,其它正確,請求注冊。(2)測試空輸入,進入注冊界面,直接按注冊按鈕。(3)測

48、試口令的一致性,口令長度,年齡及郵箱的數(shù)據(jù)有效性(具體測試用例設計可參考需求分析及詳細設計中的相關部分)。</p><p>  2 登錄測試。(1)輸入正確的口令和密碼,按登錄按鈕(2)空輸入,直接按登錄按鈕。(3)分別輸入用戶名不正確但密碼正確,用戶名正確但密碼不正確,用戶名和密碼均不正確,應均不能正確登錄。(4)以同一用戶名重復登錄一次</p><p>  測試(1)(3)時要查看服務

49、端的顯示</p><p>  3 發(fā)送接收測試。(1)進入收發(fā)界面,群發(fā)一條消息,觀察其它客戶是否收到消息,察看服務器有無相應顯示 (2)私聊一條消息,察看指定用戶是否收到消息</p><p> ?。?)無任何輸入,直接按發(fā)送。(4)退出系統(tǒng),察看服務端顯示,察看其它客戶端是否已將該客戶名刪除。(5)再啟動客戶端,登錄進入收發(fā)界面,連續(xù)群發(fā)(至少3次),連續(xù)私聊(至少3次),再連續(xù)群發(fā),觀

50、察其它客戶及服務方的顯示是否正確。</p><p><b>  三 可靠性測試</b></p><p>  1 切斷一客戶至服務器的網(wǎng)絡連接,分別進行注冊、登錄消息,客戶端應能給出提示,而不是死機或退出,在正常聊天過程中,切斷一客戶端網(wǎng)絡連接,客戶程序應能給出提示。再接通網(wǎng)路,繼續(xù)發(fā)送信息,應能正常運行。至少關閉并重啟程序后,應能正常收發(fā)。同時觀察其它客戶及服務器收發(fā)

51、、客戶列表是否正常。</p><p>  2 在正常收發(fā)中,強行關閉服務器,觀察各客戶端的反應??蛻舳藨o出發(fā)送異常提示,不應退出或死機。</p><p>  四 性能測試(可選)</p><p>  編制一測試程序,作為客戶端,登錄進系統(tǒng),向服務器按指定時間間隔群發(fā)消息。可同時啟動多個發(fā)送線程(模擬多個客戶),同時向服務器群發(fā)消息??丛?00個模擬客戶(200個

52、發(fā)送線程),每1s一個消息的情況下,服務器能否滿足客戶到客戶傳輸時間小于5s的要求。也可以考慮使用JMeter壓力測試工具。</p><p><b>  三、系統(tǒng)設計</b></p><p><b>  1、總體設計</b></p><p><b>  一 系統(tǒng)總體結(jié)構(gòu)</b></p>

53、<p>  總體設計階段主要是確定系統(tǒng)的體系結(jié)構(gòu)和主要模塊 ,顯然系統(tǒng)分客戶端子系統(tǒng)和服務器子系統(tǒng)。系統(tǒng)體系結(jié)構(gòu)如圖2所示:</p><p>  圖2 系統(tǒng)體系結(jié)構(gòu)圖</p><p>  客戶端可以劃分成三子層,服務端也可以劃分出三個子層,客戶和服務器間通信采用的是可靠的TCP協(xié)議?;镜牧奶爝^程如下:</p><p>  0 客戶端啟動注冊、登錄后,進入

54、收發(fā)界面,此時C/S連接已建立,C處于接收狀態(tài)。</p><p>  1 客戶A從界面輸入消息,確定群發(fā),業(yè)務邏輯層從界面獲取信息并驗證后生成“消息接收請求”消息,再將消息作為參數(shù)調(diào)用網(wǎng)絡通信層的發(fā)送函數(shù),發(fā)送函數(shù)將消息發(fā)往服務器,然后等待服務器的消息</p><p>  2 服務器收到消息,確定是客戶A發(fā)來的,從消息中分析出是群發(fā),然后從當前客戶列表中取出除A以外的與每個客戶(B,C)

55、對應的socket,然后通過socket將消息轉(zhuǎn)發(fā)給客戶B,C。</p><p>  3 服務器在監(jiān)控界面上顯示:客戶A—〉消息 群發(fā)</p><p>  4 服務器生成“消息接收成功”消息,向客戶A回發(fā)(可省)。</p><p>  5 客戶A收到消息,確定是“消息接收成功”消息后,在界面上顯示發(fā)送成功。</p><p>  6 客戶B

56、/C的通訊模塊接收到消息,分析確認是“消息接收請求”,則在界面上顯示:客戶A-〉消息 群發(fā)。不向服務器發(fā)送消息收到的確認消息。</p><p>  消息收發(fā)的簡圖如下圖3所示:</p><p>  圖3 消息收發(fā)示意圖</p><p>  經(jīng)驗共享:下面是本人在網(wǎng)絡編程方面多年積累的經(jīng)驗,感興趣的可以讀一讀。</p><p>  要不要回復

57、消息?由于使用的是TCP協(xié)議,可以保證點對點的可靠傳輸,所以最簡單的情況是無需回復,在上圖中取消3也可以,客戶A將消息發(fā)到服務器就認為已成功群發(fā)了消息,但若客戶B、C都斷線,顯然消息并沒有成功群發(fā)。最復雜的是客戶B、C收到消息后也回復給服務器,服務器確認都收到回復后再向A回復。前者編程簡單、性能好,但對于某些異常情況不能可靠處理,后者編程復雜,性能差,但可靠性高。這就要根據(jù)情況在上述矛盾中折中,對于“聊天室系統(tǒng)”,對可靠性要求并不高,即

58、使消息有5%未收到,也沒有大的問題,另外聊天者是處理各種不可靠問題的最佳人選,實在不行,可由人重啟系統(tǒng)(不會帶來任何人身及財物損失),另外本系統(tǒng)主要應用在局域網(wǎng),而局域網(wǎng)的可靠性是較高的。所以本文推薦采用無回復方式。這適用于其它消息的處理。</p><p>  消息的收發(fā)方式?主要分兩種,一種是推方式,例如客戶A有了消息就直接發(fā)給服務器,這是推方式,即由數(shù)據(jù)源方直接將消息發(fā)給接收方;另一種是拉方式,即接收方主動向

59、數(shù)據(jù)源請求獲取數(shù)據(jù),例如服務器通過定期詢問客戶A有無數(shù)據(jù)的方式,客戶A一旦有消息,就會發(fā)消息給服務器。顯然這兩種方式應用的場合是不一樣的,上文中描述的是“推”方式,客戶A將消息發(fā)(推)給服務器,服務器將消息再轉(zhuǎn)發(fā)(推)給其它客戶。數(shù)據(jù)源(客戶A)的特點是消息的產(chǎn)生是不確定的(接收方難以知道發(fā)方何時有消息),產(chǎn)生就發(fā)是高效的方式,若服務器采用輪詢的方式,一方面在大多數(shù)情況下會產(chǎn)生許多無謂的詢問,另一方面會降低服務器的性能(特別是服務器可能

60、成為整個系統(tǒng)的性能瓶頸,這就尤為重要),這里還隱含了一個假設:在聊天過程中,服務器一直等待消息的到來,B、C也隨時能接受消息,所以發(fā)送(推)一般是能成功的。服務器向客戶B,C推消息(相當于客戶B、C接收消息),是基于B、C都在準備接收的假設,這一點較之服務器一直可靠運行的假設,其假設的有效性較低,因為客戶方的行為難以預料,可能客戶重啟了系統(tǒng),可能突然斷電等。服務器可能白發(fā)了消息(為保證消息發(fā)到客戶,服務</p><p

61、>  推薦的方式是“推”方式,因為“Happy Chat”應用于局域網(wǎng),網(wǎng)絡條件較好,且基于可靠的TCP協(xié)議傳輸消息,本身對可靠性要求也不高,具體說就是服務器向客戶轉(zhuǎn)發(fā)消息時,不管成功與否只發(fā)一次,客戶向服務器發(fā)消息時,若出錯,不會自動重發(fā),但會給出提示,由聊天者決定是否重發(fā)(如再次按發(fā)送按鈕)。即認為在多客戶聊天過程中服務器一直正常運行,客戶端也一直正常。這樣做以后,簡化了設計編碼,性能也得到提高。</p><

62、;p>  結(jié)論:系統(tǒng)采用無回復的“推”方式收發(fā)消息。</p><p><b>  二 服務器結(jié)構(gòu)</b></p><p>  服務器端主要的模塊和結(jié)構(gòu)如圖4所示:</p><p>  AppServer.java 為服務器端監(jiān)聽類,負責服務器的啟動,包括啟動監(jiān)聽端口、服務器監(jiān)控界面。</p><p>  Se

63、rverFrame.java 為服務器監(jiān)控窗體,負責監(jiān)控服務器運行狀態(tài),聊天內(nèi)容,發(fā)送公告,踢人……</p><p>  Connection.java 為服務器連接處理的具體實現(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 為客戶端程序啟動類,負責客戶端的啟動和退出。</p><p>  Login.java 為客戶端程序登錄界面,負責用戶帳號信息的驗證與反饋。</p><p>  Register.java 為客戶端程序注冊界面,負責用戶帳號信息的注冊驗證與反

65、饋。</p><p>  ChatRoom.java 為客戶端程序聊天室主界面,負責接收、發(fā)送聊天內(nèi)容與服務器端的Connection.java 親密合作。</p><p>  Windowclose 為ChatRoom.java的內(nèi)部類,負責監(jiān)聽聊天室界面的操作,當用戶退出時返回給服務器信息。</p><p>  Clock.java 為客戶端程序的一個小程序,實

66、現(xiàn)的一個石英鐘功能。(可選)</p><p><b>  2、詳細設計</b></p><p><b>  a 、客戶端設計</b></p><p><b>  一 注冊模塊</b></p><p>  程序?qū)⑼ㄟ^Register.java用戶注冊界面收集用戶的用戶名、密碼、

67、年齡、電子郵箱等。參考界面如圖6。</p><p>  圖6 客戶端注冊界面</p><p>  處理過程:當用戶注冊時,客戶端的Register.java界面收集并驗證了用戶的注冊信息后,封裝成Register_Customer類然后通過建立在Socket的連接之上的對象輸出流將用戶注冊信息發(fā)送給服務器端,服務器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后

68、將驗證數(shù)據(jù)的完整性并在數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊信息加入數(shù)據(jù)庫,最后將注冊結(jié)果返回給客戶端。客戶端顯示結(jié)果(重名、成功、失?。?,并斷開連接。</p><p><b>  驗證要求如下:</b></p><p>  1 驗證用戶名是否為空</p><p>  即用戶名的字符長度不為0,如果驗證通過,就繼續(xù)下面驗證,否則返回“用

69、戶名為空”錯誤。</p><p>  2 驗證密碼是否為空</p><p>  即密碼的字符長度不為0,如果驗證通過,就繼續(xù)下面驗證,否則返回“用戶密碼為空”錯誤。</p><p>  3 驗證密碼的一致性</p><p>  驗證密碼兩次輸入是否一致,如果驗證通過,就繼續(xù)下面驗證,否則返回“密碼兩次輸入不一致,請重新輸入”錯誤。 &l

70、t;/p><p>  4 驗證年齡是否為空</p><p>  即用戶年齡的字符長度不為0,如果驗證通過,就繼續(xù)下面驗證,否則返回“用戶名為空錯誤”</p><p>  5 驗證年齡的合法性</p><p>  即用戶年齡介于10到100之間,如果驗證通過,就進行繼續(xù)下面驗證,否則返回“用戶年齡為空” </p><p>

71、;  6 驗證電子郵箱的合法性</p><p>  即電子郵箱字符串必須有“@” ,如果驗證通過,就進行繼續(xù)下面驗證,否則返回“電子郵箱不合法”, </p><p><b>  二 登錄模塊</b></p><p>  程序?qū)⑼ㄟ^Login.java用戶登錄界面收集用戶的用戶名、密碼,如圖7所示。</p><p> 

72、 圖7 客戶端登錄界面 </p><p><b>  登錄過程如下:</b></p><p>  當用戶登錄時,客戶端由Login.java 界面收集并驗證用戶登錄信息后,封裝成Customer對象類然后通過建立在Socket的連接之上的對象輸出流將用戶登錄信息發(fā)送給服務器端,服務器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后將驗證數(shù)據(jù)

73、的完整性并在對象型數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊用戶的信息與登錄請求信息進行密碼驗證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結(jié)果返回給客戶端。如果登錄成功,客戶端將繼續(xù)啟動聊天室主界面。</p><p><b>  驗證要求:</b></p><p>  1 驗證用戶名是否為空</p><p>  即用戶名的字符長度

74、不為0,如果驗證通過,就進行繼續(xù)下面驗證,否則返回“用戶名為空”錯誤,</p><p>  2 驗證密碼是否為空</p><p>  即密碼的字符長度不為0,如果驗證通過,就進行繼續(xù)下面驗證,否則返回“用戶密碼為空”錯誤</p><p>  當以上信息驗證成功時,客戶端將打開與服務之間的Socket連接,用對象輸出流包裝后將用戶登錄的信息發(fā)送給服務器端,并接收

75、服務器處理完用戶登錄的信息。</p><p>  當客戶端收到服務器返回的信息時,將會用信息對話框的形式告知用戶是否注冊成功,若成功則顯示收發(fā)主界面ChatRoom,關閉Socket連接。</p><p><b>  三 收發(fā)模塊</b></p><p>  當用戶登錄成功后,用戶的登錄界面將會消失,然后創(chuàng)建用戶聊天室窗口(如圖),在界面的標題

76、欄將會顯示當前登錄用戶的用戶名,以防止一個機器上的用戶開多個帳號進入聊天室后分不清哪個窗口是哪個用戶登錄的,界面第一行將顯示當前服務器的在線人數(shù)。位于界面正中的兩個控件分別是List和TextBox用來顯示當前服務器上的在線會員名單列表和公共聊天信息。</p><p>  位于界面下方的就是一些用于聊天的功能控件和聊天內(nèi)容個性化配置控件(可選)。包括聊天對象、聊天語氣、聊天內(nèi)容、聊天字體、風格、大小、顏色……&l

77、t;/p><p><b>  1 用戶發(fā)送信息</b></p><p>  當用戶需要發(fā)送聊天信息時,可以在在線列表中選中聊天對象或者“所有人”,選擇發(fā)言的語氣,和是否私聊就可以發(fā)送聊天信息了。</p><p>  當用戶點擊完發(fā)送按鈕后,程序開始將當前用戶名、聊天對象、聊天內(nèi)容、聊天語氣和是否私聊進行封裝,然后獲取Socket連接,再用對象輸出流

78、包裝Socket的輸出流將聊天信息對象發(fā)送給服務器端。</p><p><b>  2 接收聊天信息</b></p><p>  接收用戶的聊天信息是用一個單獨的接收線程實現(xiàn)的,因為客戶端必須隨時接收服務器發(fā)來的消息,而讀取消息的方法采用的一般是讀直到有消息到來的“阻塞讀”方式,若在事件處理程序中讀(占用的是事件處理線程)則會使程序在此后無法響應用戶操作,所以需要生成

79、一個單獨的線程專門用于讀取處理消息。而發(fā)送消息的方法則是將消息放入操作系統(tǒng)的發(fā)送緩沖區(qū)后就返回的,所以發(fā)送執(zhí)行的相當快,可以在事件處理線程中直接調(diào)用。發(fā)送和接收可以同時進行。</p><p>  當每次用戶接收到聊天信息后將會開始分析聊天信息然后將適合自己的信息顯示在聊天信息界面上。收發(fā)界面如圖8所示。</p><p><b>  圖8 收發(fā)界面 </b></

80、p><p>  圖上的字體(個性化)、時鐘、保存等是可選的功能,聊天者列表、聊天信息顯示,聊天內(nèi)容、私聊等是必需的。</p><p><b>  b、服務端設計</b></p><p><b>  功能描述:</b></p><p>  1.接受用戶注冊信息并保存在一個基于文件的對象型數(shù)據(jù)庫。</

81、p><p>  2.能夠允許注冊過的用戶登陸聊天界面并可以聊天。</p><p>  3.能夠接受私聊信息并發(fā)送給特定的用戶。</p><p>  4.服務器運行在自定義的端口上1888。</p><p>  5.服務器監(jiān)控用戶列表和用戶聊天信息(私聊除外)。</p><p>  6.服務器踢人,發(fā)送通知(可選)。<

82、/p><p>  7.服務器保存日志(可選)。</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ù)庫對象集的當前容量是否為空,如果是,將收集的注冊用戶信息對象添加到數(shù)據(jù)庫對象集中,然后直接寫入數(shù)據(jù)庫,否則繼續(xù)進行其他判斷。</p><p>  3.判斷用戶名是否

84、已經(jīng)存在</p><p>  檢測內(nèi)存中的數(shù)據(jù)庫對象集的中有沒有和當前收集的注冊用戶名相同的記錄,如果有,就退出檢測,否則繼續(xù)下一個檢測。</p><p>  4.判斷用戶名是否為系統(tǒng)關鍵字</p><p>  檢測當前收集的用戶名是否為“所有人”,如果是,就退出檢測,否則繼續(xù)下一個檢測。因為“所有人”這個名字會和系統(tǒng)發(fā)生沖突,用戶發(fā)給所有人的信息將會使用“所有人”

85、這個特殊用戶名。</p><p>  5.用戶名有效后 寫入數(shù)據(jù)庫</p><p>  當前面的驗證全部都通過的時候,將用戶的注冊信息對象添加到用戶數(shù)據(jù)庫中,然后創(chuàng)建文件輸出流,再用對象輸出流包裝后寫入本地文件將其持久化。最后關閉對象輸出流和文件輸入流。</p><p>  6.給客戶端返回信息</p><p>  將用戶注冊成功或失敗的信息

86、用打印流包裝Socket以后,輸出給客戶端注冊結(jié)果的詳細信息。</p><p>  7 在監(jiān)管界面上顯示信息,如圖9所示。</p><p>  8.關閉Socket連接</p><p>  當以上的程序都正常運行后,需要關閉Socket連接,否則將會浪費服務器與客戶端之間的資源。</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.驗證用戶名是否存在</p><p>  在對象數(shù)據(jù)庫中查找是否有與登陸用戶的用戶名相同的記錄,如果有繼續(xù)驗證,否則退出驗證處理,返回“沒有此用戶”錯誤。&l

88、t;/p><p>  3.驗證用戶密碼是否正確</p><p>  如果有與登錄用戶的用戶名相同的記錄,接著判斷密碼是否正確。如果密碼正確,繼續(xù)驗證,否則退出驗證處理,返回“用戶密碼錯誤”。</p><p>  4.驗證用戶是否已經(jīng)登錄</p><p>  在服務器的已登錄用戶列表中查找是否有該用戶,如果有該用戶,退出驗證處理返回“該用戶已經(jīng)登錄

89、”錯誤。否則繼續(xù)下面的驗證。</p><p>  5.驗證是否已經(jīng)超過最大登錄人數(shù)</p><p>  檢測服務器的在線人數(shù)是否已經(jīng)達到限制的最大人數(shù),如果是,退出驗證處理返回“當前服務器人數(shù)已滿,請稍后再試”錯誤。否則繼續(xù)下面的驗證。</p><p><b>  6.返回客戶端信息</b></p><p>  如果以上

90、驗證全部正確,就返回客戶端“用戶登錄成功”。</p><p>  7 在監(jiān)控界面顯示信息,如圖9所示</p><p>  8.關閉Socket連接</p><p>  當以上的程序都正常運行后,需要關閉Socket連接,否則將會浪費服務器與</p><p>  圖9 服務器管理界面</p><p><b> 

91、 客戶端之間的資源。</b></p><p><b>  三 用戶退出</b></p><p><b>  1.接收退出信息</b></p><p>  當用戶退出時,客戶端將會用基于Socket的對象輸出流發(fā)給服務器退出對象。</p><p>  2.在線列表中刪除用戶</p&

92、gt;<p>  用戶退出后應該把用戶從在線列表中刪除,否則用戶退出用戶還在在線列表中,那么該用戶下次將會無法登錄。</p><p><b>  3.更新在線列表</b></p><p>  用戶退出后將服務器端監(jiān)控界面的用戶列表更新。否則用戶數(shù)據(jù)將會不同步。</p><p>  圖10 服務器用戶信息管理界面</p>

93、;<p>  四 接收轉(zhuǎn)發(fā)用戶聊天信息</p><p>  1.接收用戶聊天信息</p><p>  當用戶發(fā)送聊天信息時,服務端將會收到客戶端用Socket傳輸過來的聊天信息對象,然后將其強制轉(zhuǎn)換為Message對象。</p><p>  2.過濾用戶聊天內(nèi)容的非法信息(可選)</p><p>  分析聊天信息對象的聊天內(nèi)容,

94、用語言過濾類將非法字符過濾掉。語言過濾的時候?qū)蜷_“badword.txt”文件,不允許出現(xiàn)的關鍵詞將會存儲在文件中,關鍵字之間以逗號分割。當聊天內(nèi)容中出現(xiàn)要過濾的關鍵字是 將會被系統(tǒng)屏蔽,而聊天內(nèi)容也將替換成“非法內(nèi)容,系統(tǒng)屏蔽”。 </p><p><b>  3 返回聊天信息</b></p><p>  然后系統(tǒng)從Messag

95、e中提出消息類型,再根據(jù)類型將消息強制轉(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、  接收消息請求,登錄請求,登錄響應,注冊請求,注冊響應</p><p>  2 獲取類型方法getType</p><p>  ChatMessage繼承自Message,增加如下屬性:(1).目的用戶名列表</p><p>  (2). 用戶聊天內(nèi)容;相應的還有LoginMessage、LoginACKMessage、RegisterMessage,Regist

97、erACKMessage. LogoutMessage(客戶退出)等</p><p>  圖11 通信協(xié)議交互圖</p><p>  友情提示:服務端采用一個“監(jiān)聽線程”負責監(jiān)聽連接請求,收到連接請求則創(chuàng)建socket及相應的處理線程,該線程在一個循環(huán)中通過socket讀取消息,分析處理消息,直到遇到“退出”消息或管理員命令,線程才退出。所以服務端是“單線程監(jiān)聽,多線程處理”的模式。&l

98、t;/p><p>  經(jīng)驗共享:具體設計時應用協(xié)議的設計是難點,要根據(jù)需要確定具體的消息種類,分清客戶端發(fā)出哪些消息,接收哪些消息,服務端又發(fā)出哪些消息,接收哪些消息。然后將這些消息構(gòu)成一個完整的聊天業(yè)務過程。可以用圖11描述。整個過程分注冊,登錄,收發(fā),退出四個階段。其中LogoutMsg為客戶聲明自己離線,其它客戶收到后將該用戶信息刪除,而QuitMsg是服務方發(fā)出的要求客戶離線的消息,收到的客戶一般需要關閉連接

99、。</p><p>  協(xié)議格式的設計也很重要,有基于文本格式和二進制格式兩類。文本格式的協(xié)議有HTTP,SMTP(簡單電子郵件傳輸協(xié)議)等,二進制的協(xié)議如java 的RMI、CORBA,windows的DCOM等。文本形式的協(xié)議簡單,可跨平臺,例如使用HTTP協(xié)議的WEB應用,客戶端可以是Window,服務器端可以是Linux,Web服務器既可以是用C開發(fā)的Apache,也可以是用其它語言開發(fā)的,只要他們遵守協(xié)

100、議。其缺點是性能不好,特別是傳輸大信息量消息時,其次是名文傳輸,很容易被破解。二進制方式的特點和文本方式相反,缺點是難以實現(xiàn)不同平臺不同語言間的傳輸,優(yōu)點是高效,有一定的保密性。對于聊天室系統(tǒng),若用文本格式傳輸,建議采用以下格式: 消息類型+分隔符+參數(shù)1+參數(shù)分隔符+參數(shù)2+參數(shù)分隔符+ …</p><p>  分隔符可用‘:’,并保證‘:’不出現(xiàn)在參數(shù)及消息類型字符串中,參數(shù)分隔符可用‘\0’,也需要保證其不

101、出現(xiàn)在參數(shù)及消息類型字符串中。若采用二進制形式,直接將相關消息對象序列化后即可。</p><p><b>  六、 系統(tǒng)實現(xiàn)</b></p><p><b>  1、 客戶端實現(xiàn)</b></p><p>  客戶端實現(xiàn)的關鍵在于接收線程的實現(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")){ //服務方指令退出</p><p><b>  try{</b></p><p>  socket.close();</p><p>  jTextArea1.append("接收到服務器同意端口信息,套節(jié)字關閉\n");</p

106、><p>  break; //jump out of read thread</p><p>  }catch(Exception ex){</p><p>  jTextArea1.append("關閉套接字異常");</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é)議的格式,為文本格式,基本格式為:類型:用戶名/用戶消息,較之設計中使用的二進制消息對象形式,好處是簡單、可讀,可移植性好,即使C/S采用不同語言開發(fā),只要遵守此文本格式協(xié)議,都可以互相通信,HTTP協(xié)議就是這方面的例子。</p><p><b>  2 、服務器實現(xiàn)</b></p><p>

112、;  服務器端的關鍵在于接收處理線程和監(jiān)聽線程,基本代碼如下:</p><p>  //監(jiān)聽線程,實現(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>  //使用客戶處理線程來實現(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論