簡(jiǎn)易聊天工具詳細(xì)設(shè)計(jì)報(bào)告_第1頁(yè)
簡(jiǎn)易聊天工具詳細(xì)設(shè)計(jì)報(bào)告_第2頁(yè)
簡(jiǎn)易聊天工具詳細(xì)設(shè)計(jì)報(bào)告_第3頁(yè)
簡(jiǎn)易聊天工具詳細(xì)設(shè)計(jì)報(bào)告_第4頁(yè)
簡(jiǎn)易聊天工具詳細(xì)設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

.PAGE.>簡(jiǎn)易聊天工具總體設(shè)計(jì)報(bào)告班級(jí):網(wǎng)絡(luò)工程10-1班:**:08103609指導(dǎo)教師:目錄一、引言111.2課題現(xiàn)狀11.3開發(fā)平臺(tái)介紹1二、需求分析22.1編寫目標(biāo)22.2可行性分析22.3分析需求2功能需求分析2數(shù)據(jù)需求分析2性能需求分析3系統(tǒng)運(yùn)行需求3:3效勞器端模塊3客戶端模塊32.5數(shù)據(jù)流圖4頂層數(shù)據(jù)流圖4一層數(shù)據(jù)流圖4二層數(shù)據(jù)流圖5三、概要設(shè)計(jì)667效勞器端模塊7.1用戶上下線識(shí)別及顯示模塊7.2信息識(shí)別轉(zhuǎn)發(fā)模塊7客戶端模塊7.1用戶注冊(cè)模塊7.2用戶登陸模塊7.3用戶密碼修改模塊73.3兩大模塊工作流程89數(shù)據(jù)邏輯設(shè)計(jì)9數(shù)據(jù)字典9四、詳細(xì)設(shè)計(jì)與編碼實(shí)現(xiàn)1010效勞器界面設(shè)計(jì)10效勞器程序類11效勞器端連接用戶的線程設(shè)計(jì)12效勞器端線程的管理1313界面包的設(shè)計(jì)〔view包〕14.1用戶登錄界面14.2用戶好友列表界面15.3用戶聊天界面18模塊包的設(shè)計(jì)〔model包〕19.1客戶端連接效勞器類19.2客戶檢查使用者類20用戶端工具包的設(shè)計(jì)〔tools包〕21.1客戶端連接效勞器線程類21.2管理客戶端連接效勞器線程類22.3管理用戶的聊天界面的類23.4管理好友列表、黑名單界面類2323User類23包的種類定義類24傳輸包定義類24五、運(yùn)行測(cè)試26262628六、完畢語(yǔ)29參考文獻(xiàn)30..>一、引言隨著計(jì)算機(jī)科學(xué)技術(shù)的飛速開展,網(wǎng)絡(luò)越來(lái)越深刻的改變著人們生活方方面面。各種基于網(wǎng)絡(luò)的應(yīng)用技術(shù)在人們的政治、經(jīng)濟(jì)、生活等的各個(gè)方面都發(fā)揮著重要的作用。例如QQ,MSN等基于Internet的即時(shí)聊天工具。這些工具通過(guò)網(wǎng)絡(luò)這個(gè)新興的媒介進(jìn)展信息交流相比其他傳統(tǒng)媒介具有數(shù)據(jù)量大,實(shí)時(shí)性強(qiáng),操作簡(jiǎn)單,本錢低廉等優(yōu)點(diǎn)。不僅如此即時(shí)聊工具還具備許多傳統(tǒng)媒介不具備的強(qiáng)大功能,它們能傳送文字、聲音、影像和文檔,而且能更加人性化的顯示聯(lián)絡(luò)人的名單和通信狀態(tài)。因而它們?cè)诂F(xiàn)實(shí)生活中受到了廣泛的歡迎,這是有目共睹的。目前基于Internet的即時(shí)聊天工具已經(jīng)做的非常完美,然而基于局域網(wǎng)的即時(shí)聊天工具卻不如人意。而在高等教育方面,網(wǎng)絡(luò)展現(xiàn)出不可替代的作用。為了適應(yīng)現(xiàn)代信息化,教學(xué)局域網(wǎng)就應(yīng)運(yùn)而生。而教學(xué)局域網(wǎng)內(nèi)的即時(shí)通信能力則顯得尤為重要。所以對(duì)于學(xué)校和公司內(nèi)部網(wǎng)絡(luò)等機(jī)構(gòu),局域網(wǎng)即時(shí)聊天的應(yīng)用還是相當(dāng)重要的。一個(gè)好的局域網(wǎng)通信軟件將對(duì)學(xué)校和公司的運(yùn)作產(chǎn)生積極的影響。1.2課題現(xiàn)狀基于局域網(wǎng)的即時(shí)通信軟件的核心技術(shù)其實(shí)與基于Internet的即時(shí)通信軟件的設(shè)計(jì)技術(shù)是一樣的,只是規(guī)模較小。基于Internet的通信工具一般是采用UDP或TCP協(xié)議來(lái)實(shí)現(xiàn)的,開發(fā)技術(shù)已經(jīng)非常成熟。比方QQ、MSN等等,它們都是基于Internet的即時(shí)通信軟件,它們不僅實(shí)現(xiàn)了即時(shí)聊天、文件傳輸?shù)裙δ?,而且還能夠?qū)崿F(xiàn)網(wǎng)絡(luò)即時(shí)視頻、語(yǔ)音聊天功能。它們的功能正在不斷擴(kuò)大,使其更加人性化,滿足人們更多的需求。這類軟件其實(shí)都是在下層協(xié)議的根底之上,通過(guò)網(wǎng)絡(luò)通信接口進(jìn)展設(shè)計(jì)的軟件產(chǎn)品。在局域網(wǎng)內(nèi),這類軟件的設(shè)計(jì)比在Internet中設(shè)計(jì)更為簡(jiǎn)單。因?yàn)镮nternet是網(wǎng)絡(luò)的網(wǎng)絡(luò),構(gòu)造更為復(fù)雜,碰到的狀況比在局域網(wǎng)中要多。而局域網(wǎng)中事情就簡(jiǎn)單的多了,所以局域網(wǎng)聊天工具在實(shí)現(xiàn)即時(shí)通信時(shí)就相對(duì)容易些了。1.3開發(fā)平臺(tái)介紹這次課題設(shè)計(jì)主要用Java語(yǔ)言,所以就選擇相應(yīng)的開發(fā)平臺(tái)和工作、測(cè)試環(huán)境為MyEclipse。MyEclipse是一個(gè)十分優(yōu)秀的用于開發(fā)Java,J2EE的Eclipse插件集合,MyEclipse的功能非常強(qiáng)大,支持也十分廣泛,尤其是對(duì)各種開源產(chǎn)品的支持十分不錯(cuò)。MyEclipse目前支持JavaServlet,AJA*,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC數(shù)據(jù)庫(kù)鏈接工具等多項(xiàng)功能??梢哉f(shuō)MyEclipse幾乎囊括了目前所有主流開源產(chǎn)品的專屬eclipse開發(fā)工具。二、需求分析聊天工具大多數(shù)由客戶端程序和效勞器程序外加效勞器端,本程序采用客服機(jī)/效勞器架構(gòu)模式,也就是通常所簡(jiǎn)稱的C/S模式。通過(guò)Java提供的Socket類來(lái)連接客戶機(jī)和效勞器并使客戶機(jī)與效勞器之間相互通信。由于聊天是多點(diǎn)對(duì)多點(diǎn)的而Java提供的多線程功能,用多線程可完成多點(diǎn)對(duì)多點(diǎn)的聊天。主要有兩個(gè)應(yīng)用程序,分別為效勞器程序和客戶端程序。效勞器應(yīng)用程序主要用于消息轉(zhuǎn)發(fā),以及向所有用戶發(fā)送系統(tǒng)消息等;客戶端應(yīng)用程序主要用于客戶聊天記錄的顯示和信息輸入。采用Client/Server〔C/S〕體系構(gòu)造,即客戶機(jī)/效勞器體系構(gòu)造。聊天效勞器專門用于監(jiān)控用戶狀態(tài)和轉(zhuǎn)發(fā)消息,客戶端負(fù)責(zé)接收消息的用戶序列和消息文本發(fā)送到效勞器。該聊天系統(tǒng)實(shí)現(xiàn)私聊,一對(duì)多聊,用戶登陸,退出聊天系統(tǒng)等功能。2.2可行性分析經(jīng)濟(jì)可行性:由于本系統(tǒng)的主要背景是課程設(shè)計(jì),不注重直接的經(jīng)濟(jì)效益和其后的開展方向,只在注重自身水平和能力的提高,對(duì)自身的經(jīng)濟(jì)要求也不高,只要有一臺(tái)能運(yùn)行Java軟件的電腦便可,所以不用考慮到經(jīng)濟(jì)問(wèn)題。技術(shù)可行性:使用Java作為系統(tǒng)開發(fā)的開發(fā)環(huán)境,它提供完善的指令控制語(yǔ)句、類與對(duì)象的支持及豐富的數(shù)據(jù)類型,給開發(fā)高性能系統(tǒng)提供的保障為開發(fā)滿足客戶要求的系統(tǒng),保證了代碼的模塊化要求,而代碼模塊化的提高,非常有利于以后對(duì)新系統(tǒng)的擴(kuò)展與修改。運(yùn)行可行性:本系統(tǒng)為一個(gè)小型的局域網(wǎng)聊天系統(tǒng),所消耗的資源非常的小,現(xiàn)在一般的電腦無(wú)論是硬件還是軟件都能夠滿足條件,因此,本系統(tǒng)在運(yùn)行上是可行的。綜上所述,本系統(tǒng)的設(shè)計(jì)與開發(fā)在技術(shù)上和硬件設(shè)備上的條件都是滿足的,因此,它在技術(shù)上是可行的功能需求分析程序要實(shí)現(xiàn)的功能:程序啟動(dòng)之后要能夠知道局域網(wǎng)內(nèi)哪些用戶在線,并可以與之通信;一旦*個(gè)網(wǎng)內(nèi)用戶上線或離線,需要立即更新信息,并通知所有在線用戶;當(dāng)雙擊用戶列表中*個(gè)列表項(xiàng)時(shí),要能夠彈出信息發(fā)送框,并可以編輯要發(fā)送的信息,然后發(fā)送。數(shù)據(jù)需求分析對(duì)于局域網(wǎng)內(nèi)的用戶需要具體的數(shù)據(jù)信息來(lái)表示,效勞器則需要一個(gè)保存所有用戶信息數(shù)據(jù)表,其根本內(nèi)容應(yīng)包括用戶ID,用戶名,密碼,狀態(tài),及IP地址。性能需求分析實(shí)用性:為局域網(wǎng)聊天提供方便,有效進(jìn)展作業(yè)管理。操作簡(jiǎn)單:本系統(tǒng)應(yīng)該適用于不同水平的使用者,包括事業(yè)單位和企業(yè)單位,同時(shí)系統(tǒng)不應(yīng)太復(fù)雜和煩瑣,因此要求系統(tǒng)的操作盡可能簡(jiǎn)單易行。技術(shù)先進(jìn):產(chǎn)品的系統(tǒng)設(shè)計(jì)和開發(fā)應(yīng)緊跟著整個(gè)計(jì)算機(jī)開展潮流,采用當(dāng)時(shí)最先進(jìn)的設(shè)計(jì)思想,利用最新的開發(fā)技術(shù)和開發(fā)工具。使系統(tǒng)能夠無(wú)論在功能設(shè)計(jì)上,還是在技術(shù)實(shí)現(xiàn)上,都處于同行業(yè)的領(lǐng)先地位。安裝使用簡(jiǎn)便:效勞器端的安裝簡(jiǎn)潔明了,客戶機(jī)無(wú)需再裝任何軟件就可以直接注冊(cè)登陸聊天。適應(yīng)性:應(yīng)該能廣泛應(yīng)用于不同類型的企事業(yè)單位。系統(tǒng)采用模塊化設(shè)計(jì),用戶可以根據(jù)自己的實(shí)際情況自行組合,使系統(tǒng)在不同的硬件環(huán)境下都能得以應(yīng)用。代碼可讀性好:文中的代碼將盡可能簡(jiǎn)潔,易懂。系統(tǒng)運(yùn)行需求運(yùn)行環(huán)境:Windows9*、2000、*p、2003,Linu* 必要環(huán)境:JDK1.5以上 硬件環(huán)境:CPU400MHz以上,內(nèi)存64MB以上2.4本系統(tǒng)的主要功能局部組成:效勞器端模塊:效勞器啟動(dòng),進(jìn)展監(jiān)聽功能:轉(zhuǎn)發(fā)用戶傳播的信息效勞器自動(dòng)更新用戶狀態(tài)信息客戶端模塊:登陸效勞器列出當(dāng)前在線用戶信息;聊天好友的的選擇;發(fā)言:對(duì)輸入的數(shù)據(jù)進(jìn)展發(fā)送;離開狀態(tài);2.5數(shù)據(jù)流圖頂層數(shù)據(jù)流圖聊天用戶聊天用戶聊天用戶簡(jiǎn)易聊天系統(tǒng)頂層數(shù)據(jù)流圖一層數(shù)據(jù)流圖聊天用戶聊天用戶聊天用戶客戶端效勞器端寫聊天信息返回返回讀取反響/轉(zhuǎn)發(fā)存儲(chǔ)提交用戶信息數(shù)據(jù)庫(kù)一層數(shù)據(jù)流圖二層數(shù)據(jù)流圖用戶用戶用戶登錄用戶發(fā)送信息客戶端效勞器端用戶注冊(cè)處理用戶退出聊天內(nèi)容用戶得到信息數(shù)據(jù)聊天信息監(jiān)控效勞器日志處理保存保存系統(tǒng)二層數(shù)據(jù)流圖三、概要設(shè)計(jì)信息識(shí)別轉(zhuǎn)發(fā)模塊用戶上下線識(shí)別顯示模塊用戶端效勞器端簡(jiǎn)易聊天工具用戶登陸模塊用戶注冊(cè)模塊用戶密碼修改模塊用戶聊天模塊群聊模塊單聊模塊信息識(shí)別轉(zhuǎn)發(fā)模塊用戶上下線識(shí)別顯示模塊用戶端效勞器端簡(jiǎn)易聊天工具用戶登陸模塊用戶注冊(cè)模塊用戶密碼修改模塊用戶聊天模塊群聊模塊單聊模塊效勞器端模塊.1用戶上下線識(shí)別及顯示模塊功能:效勞器開啟使用設(shè)定的端口進(jìn)展監(jiān)聽,識(shí)別并顯示用戶上下線信息。目標(biāo):當(dāng)有用戶請(qǐng)求登陸時(shí),效勞器通過(guò)套接字獲取用戶端的IP地址以及用戶名和對(duì)應(yīng)密碼,識(shí)別是否一致,從而顯示用戶在線信息,當(dāng)用戶下線時(shí),斷開連接,顯示用戶下線信息。根本實(shí)現(xiàn)用戶狀態(tài)與信息顯示一致。.2信息識(shí)別轉(zhuǎn)發(fā)模塊功能:效勞器將用戶發(fā)送的信息接收、分析、存儲(chǔ)并轉(zhuǎn)發(fā)到目標(biāo)用戶。目標(biāo):效勞器定義一個(gè)用z于存儲(chǔ)要求請(qǐng)求連接用戶的端口號(hào)以及該端口客戶發(fā)送的信息的數(shù)組,該數(shù)組效勞器、客戶端共享,效勞器將發(fā)送端的根本信息存儲(chǔ),目的段可以讀取該信息,從而實(shí)現(xiàn)信息轉(zhuǎn)發(fā)??蛻舳四K.1用戶注冊(cè)模塊功能:實(shí)現(xiàn)用戶賬號(hào)的注冊(cè)目標(biāo):通過(guò)用戶端的一個(gè)線程與效勞器數(shù)據(jù)庫(kù)連接,用戶輸入創(chuàng)立的用戶名、密碼,假設(shè)通過(guò)合法性檢測(cè),則將該用戶注冊(cè)的信息寫入后臺(tái)數(shù)據(jù)庫(kù).2用戶登陸模塊功能:實(shí)現(xiàn)用戶登陸。目標(biāo):用戶輸入用戶名、密碼并點(diǎn)擊登陸,效勞器端接收用戶端登陸請(qǐng)求,存儲(chǔ)請(qǐng)求信息,并進(jìn)展檢驗(yàn),如果通過(guò)合法性檢測(cè)則進(jìn)入聊天主界面?!?〕群聊模塊功能:能夠進(jìn)展類似于聊的聊天功能。目標(biāo):客戶端點(diǎn)擊"發(fā)送信息〞按鈕,該客戶端的ip地址、端口號(hào)以及信息內(nèi)容一起打包寫入效勞器的存儲(chǔ)數(shù)組,客戶端通過(guò)線程可以讀取該數(shù)組中的內(nèi)容,從而實(shí)現(xiàn)群聊。(2) 單聊模塊功能:能夠進(jìn)展點(diǎn)對(duì)點(diǎn)的聊天方式。目標(biāo):客戶端用戶點(diǎn)擊"開場(chǎng)私聊〞按鈕,輸入對(duì)方的昵稱以及ip地址,從而該用戶開啟端口用于監(jiān)聽,同時(shí)定義輸入、輸出流文件,客戶端延遲片刻,然后與該端口取得連接。當(dāng)任意一方點(diǎn)擊"發(fā)送信息〞按鈕時(shí),和群聊同一機(jī)理,通過(guò)讀取共享文件內(nèi)容實(shí)現(xiàn)私聊。.3用戶密碼修改模塊功能:用戶能夠修改自己賬號(hào)的密碼。目標(biāo):用戶輸入用戶名、舊密碼、新密碼,效勞器端接收用戶端密碼修改請(qǐng)求,存儲(chǔ)修改信息,并進(jìn)展檢驗(yàn),假設(shè)通過(guò)合法性檢測(cè),則把修改后的信息重新寫入后臺(tái)數(shù)據(jù)庫(kù)。啟動(dòng)效勞器啟動(dòng)效勞器輸入效勞器IP顯示用戶停頓監(jiān)聽等待開場(chǎng)監(jiān)聽輸入端口號(hào)用戶連接請(qǐng)求是否設(shè)置系統(tǒng)公告退出系統(tǒng)保存修改記錄聊天記錄顯示在線人數(shù)YesNo啟動(dòng)客戶端窗口啟動(dòng)客戶端窗口輸入qq號(hào)碼輸入密碼登錄驗(yàn)證成功進(jìn)入客戶端聊天室發(fā)布公開消息悄悄話發(fā)布隱蔽消息選擇聊天對(duì)象選擇斷開連接退出系統(tǒng)NoYes客戶端工作流程圖效勞器端工作流程圖數(shù)據(jù)邏輯設(shè)計(jì)組成〔用戶qq,狀態(tài),好友,分組〕用戶qq〔qq號(hào)碼,昵稱,密碼,性別,年齡,好友名字,分組名稱〕

狀態(tài)〔qq號(hào)碼,是否在線,ip地址,端口〕

好友〔好友qq號(hào)碼,好友名字,所在分組名字〕

分組〔分組ID,分組名稱,所屬qq號(hào)碼〕數(shù)據(jù)字典名稱取值類型長(zhǎng)度描述位置QQ號(hào)碼Int5-8唯一標(biāo)示用戶,不可為空用戶qq表,狀態(tài)表昵稱Char8用戶昵稱用戶qq表密碼Char6-16用戶身份鑒定,不可為空用戶qq表性別Char2用戶性別,可空用戶qq表年齡Smallint0-99用戶年齡,可空用戶qq表好友名字Char8好友昵稱用戶qq表,好友表分組名稱Char8分組名字用戶qq表,分組表是否在線Int1記錄當(dāng)前用戶狀態(tài),不可為空狀態(tài)表Ip地址Int32當(dāng)前登錄IP地址狀態(tài)表端口Int4登錄端口號(hào)狀態(tài)表好友qq號(hào)碼Int5-8唯一標(biāo)示好友,不可為空好友表所在分組名字Char8所在分組名字,不可為空好友表所屬qq號(hào)碼Int5-8所屬用戶,不可為空分組表四、詳細(xì)設(shè)計(jì)與編碼實(shí)現(xiàn)設(shè)計(jì)中我在效勞器端建立了四個(gè)包,分別是com.qq.server.view包,.qq.server.tools包,.qq.server.model包以及公用.qqmon包;根據(jù)包的名稱就很容易理解各個(gè)包中所包含的類的功能。View包主要是存放效勞器界面設(shè)計(jì)類的,model包中包含的是效勞器各個(gè)模塊設(shè)計(jì)類,tools包中包含的是效勞器工作時(shí)所要用的工具設(shè)計(jì)類,最后commo包中包含的是效勞器端和客戶端所需共同使用的內(nèi)容設(shè)計(jì)類。其實(shí)還有一個(gè)包c(diǎn)om.qq.server.db包,是用來(lái)放置管理用戶中號(hào)和密碼的數(shù)據(jù)庫(kù)設(shè)計(jì)類,但是最終沒(méi)有設(shè)計(jì),只是偷懶的將用戶是賬號(hào)和密碼在客戶和效勞器連接的程序代碼中進(jìn)展固化了。效勞器界面設(shè)計(jì)效勞器界面設(shè)計(jì)類的類名為MyServerFrame,是存放在view包中,主要是實(shí)現(xiàn)效勞器端的控制界面,其可以實(shí)現(xiàn)啟動(dòng)效勞器、關(guān)閉效勞器、管理和監(jiān)控效勞器等功能。通過(guò)java界面設(shè)計(jì)語(yǔ)句設(shè)計(jì)出效勞器界面的布局:整體只是由一個(gè)JPanel放在中間,JPanel主要是有兩個(gè)JButton按鈕組合而成,分別為啟動(dòng)和關(guān)閉按鈕,至于效勞器界面的監(jiān)視管理功能在此沒(méi)有進(jìn)展設(shè)計(jì),以后會(huì)在加以補(bǔ)充。此效勞器界面涉及的變量如下JPaneljpl;JButtonjbt1,jbt2;其中對(duì)jbt1做了一個(gè)監(jiān)聽,當(dāng)點(diǎn)擊這個(gè)按鈕時(shí)就會(huì)執(zhí)行MyQqServer類中的代碼,從而完成效勞器開啟功能。publicMyServerFrame(){ jpl=newJPanel(); jbt1=newJButton("啟動(dòng)效勞器"); jbt1.addActionListener(this);對(duì)jbt1的監(jiān)聽 jbt2=newJButton("關(guān)閉效勞器"); jpl.add(jbt1); jpl.add(jbt2); this.add(jpl,"Center"); this.setSize(500,400); this.setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE); this.setVisible(true);} publicvoidactionPerformed(ActionEvente){ if(e.getSource()==jbt1)如果點(diǎn)擊了jbt1 { newMyQqServer();跳轉(zhuǎn)到MyQqServer繼續(xù)執(zhí)行程序 }}效勞器程序類效勞器程序類類名為MyQqServer,存放在model包中,它是真正的聊天工具效勞器程序,其目的是在9999端口監(jiān)聽等待、監(jiān)聽是客戶端否有客戶發(fā)起連接,承受客戶端發(fā)來(lái)的連接請(qǐng)求并且檢查客戶輸入信息的合法性,當(dāng)用戶名和密碼對(duì)應(yīng)且正確時(shí),返回登陸成功的信息包,效勞器為用戶單開一個(gè)線程,讓線程與該客戶端保持通訊,啟動(dòng)客戶端與效勞器間的線程,并通知其其他在線的好友; try{//在端口號(hào)為9999處監(jiān)聽 System.out.printf("我是效勞器,在9999端口監(jiān)聽"); ServerSocketss=newServerSocket(9999);//阻塞,等待連接 while(true) { Sockets=ss.accept();定義套接字承受//承受客服端發(fā)來(lái)的信息是以對(duì)象流的方式 ObjectInputStreamois=newObjectInputStream(s.getInputStream());Useru=(User)ois.readObject();Messagem=newMessage(); ObjectOutputStreamoos=newObjectOutputStream(s.getOutputStream()); if(u.getPassword().equals("123456")) {//返回一個(gè)登陸成功包 m.setMesType("1"); oos.writeObject(m);//里就單開一個(gè)線程,讓該線程與該客戶端保持通訊SerConClientThreadscct=newSerConClientThread(s); MangeClientThread.addClientThread(u.getUserid(),scct);//啟動(dòng)與該客戶端通信的線程 scct.start();//并通知其他在線用戶 scct.notifyother(u.getUserid()); }else{ m.setMesType("2"); oos.writeObject(m);//關(guān)閉鏈接 s.close(); }在設(shè)計(jì)這個(gè)程序是要注意,效勞器承受用戶的信息別且進(jìn)展檢驗(yàn)但是不能以以字節(jié)讀的方式承受讀取,因?yàn)橐宰止?jié)讀取時(shí)遇到空格符或轉(zhuǎn)行符會(huì)出現(xiàn)錯(cuò)誤,如賬號(hào)1234密碼123122中間有空格,則效勞器就不能正確識(shí)別,為改進(jìn)這種讀取方式,我們將效勞器端和客端的io流用User對(duì)象的方式傳播,傳輸和讀取的都是對(duì)象的相應(yīng)函數(shù),則就不會(huì)出出現(xiàn)上述情況,除此之外,客戶端的發(fā)送和效勞器端的監(jiān)聽都需要將內(nèi)容序列化〔只是加上一個(gè)java命令,讓java內(nèi)部實(shí)現(xiàn)〕。importsun.nio.ch.ServerSocketAdaptor;序列化:就是可以讓一個(gè)對(duì)象可以在網(wǎng)絡(luò)上或文件上傳輸,事實(shí)上就是把它序列了,是他不亂效勞器端連接用戶的線程設(shè)計(jì)效勞器和客戶的通信線程SerConClientThread存放在model包中,它的設(shè)計(jì)主要就是為了實(shí)現(xiàn)在線用戶一對(duì)多的聊天,這樣就不會(huì)發(fā)生套接字爭(zhēng)搶的現(xiàn)象,因?yàn)槊恳粋€(gè)在線用戶都開啟了相應(yīng)的一個(gè)線程用來(lái)存放其特定的套接字信息。其組要功能:得到所有在線人的線程取出在線人的Id//得到所有在線的人的線程 HashMaphm=MangeClientThread.hm;Iteratorit=hm.keySet().iterator();定義一個(gè)HashMap用來(lái)存放所有用戶線程 while(it.hasNe*t()) { Messagem=newMessage(); m.setCon(iam); m.setMesType(MessageType.message_ret_onlinefriend);}判斷用戶發(fā)送的信息類型,如果是一般信息,則獲取承受設(shè)的通信線程別且一會(huì)將其轉(zhuǎn)發(fā)出去//對(duì)從客戶端取得的消息進(jìn)展類型判斷然后做出相應(yīng)處理 if(m.getMesType().equals()) {//取得承受人的通信線程一會(huì)轉(zhuǎn)發(fā) SerConClientThreadsc=MangeClientThread.getCLientThread(m.getGetter());ObjectOutputStreamoos=newObjectOutputStream(sc.s.getOutputStream());oos.writeObject(m);}如果是請(qǐng)求所有在線好友的信息,則給該用戶返回效勞器端的在線好友elseif(m.getMesType().equals()) {//把在效勞器斷的好友給該客戶端返回 Stringres=MangeClientThread.getAllOnlineUserid(); Messagem2=newMessage(); m2.setMesType(MessageType.message_ret_onlinefriend); m2.setCon(res); m2.setGetter(m.getSender());ObjectOutputStreamoos=newObjectOutputStream(s.getOutputStream()); oos.writeObject(m2); }效勞器端線程的管理效勞器端線程的管理類ManageClientThread從命名上看就知道其主要作用就是管理用戶的線程,將這些線程同一的放在一個(gè)建立好的哈希表中publicclassMangeClientThread{ publicstaticHashMaphm=newHashMap<String,SerConClientThread>(); //向hm中添加一個(gè)客戶端通信線程 publicstaticvoidaddClientThread(Stringuid,SerConClientThreadct) {hm.put(uid,ct);這里加的就是用戶的id以及其對(duì)應(yīng)線程}這個(gè)類還有兩個(gè)函數(shù)一個(gè)是getCLientThread函數(shù),主要就是返回在效勞器端有線程的用戶的id,在效勞器轉(zhuǎn)發(fā)用戶普通信息前就會(huì)先調(diào)用該函數(shù)獲得承受者的id,對(duì)應(yīng)于的情況1。publicstaticSerConClientThreadgetCLientThread(Stringuid){return(SerConClientThread)hm.get(uid);返回效勞器端由線程的用戶的id}還有一個(gè)函數(shù)getAllOnlineUserid,其作用就是為了返回所有在線用的情況,效勞器接到用戶更新在線好友的命令后會(huì)調(diào)用,對(duì)應(yīng)于的情況2。//返回當(dāng)前在線的人的情況publicstaticStringgetAllOnlineUserid(){//使用迭代器完成Iteratorit=hm.keySet().iterator();Stringres="";while(it.hasNe*t()){res+=it.ne*t().toString()+"";}returnres;}我在客戶端同樣建立了四個(gè)包,分別是com.qq.client.view包,.qq.client.tools包,.qq.client.model包以及公用.qqmon包;與效勞器端一樣,各個(gè)類根據(jù)功能目的會(huì)被放在不同的包中。View包主要是存放客戶端多個(gè)界面設(shè)計(jì)類的,在其中我總共設(shè)計(jì)了三個(gè)界面類:用戶登錄界面類QQClientLogin、用戶好友列表界面類Qqfrienlist、用戶聊天界面類Qqchat。model包中包含的是用戶端各個(gè)模塊設(shè)計(jì)類,用戶與效勞器連接的實(shí)現(xiàn)類和用戶客戶端使用信息類都在其中。tools包中包含的是用戶端工作時(shí)所要用的工具設(shè)計(jì)類,用戶連接效勞器的線程類和各個(gè)管理類都在其中。最后commo包中的類與效勞器的commo包中的內(nèi)容是一樣的,因?yàn)槔锩娑际切谄鞫撕涂蛻舳怂韫餐褂玫膬?nèi)容,所以要保持其一致性。在設(shè)計(jì)編碼實(shí)現(xiàn)時(shí),剛開場(chǎng)設(shè)計(jì)的界面編碼類是獨(dú)立的,但是到后面就會(huì)將各個(gè)界面類嵌套連接起來(lái),除此之外還會(huì)應(yīng)時(shí)定義生成其他的類,所以說(shuō)各個(gè)類之間都是相互聯(lián)系的,絕非有獨(dú)立的類存在。界面包的設(shè)計(jì)〔view包〕.1用戶登錄界面客戶端用戶登錄界面設(shè)計(jì)類的類名為QQClientLogin,是存放在view包中,主要是實(shí)現(xiàn)用戶登錄界面,其可以實(shí)現(xiàn)輸入用戶賬號(hào)、密碼進(jìn)展登錄功能。通過(guò)java界面設(shè)計(jì)語(yǔ)句設(shè)計(jì)出效勞器界面的布局:整體只是由三個(gè)局部組合而成,分別是將一個(gè)JLabel放在北部。一個(gè)JPanel放在中間,中間的JPanel是由兩個(gè)JLabel、兩個(gè)JButton、一個(gè)JTe*tField、一個(gè)JPasswordField、兩個(gè)JCheckBo*按鈕組成,并且將這個(gè)JPanel設(shè)計(jì)成3*3的網(wǎng)格布局。最后是南邊也是一個(gè)JPanel,由兩個(gè)JButton組成的一個(gè)流布局構(gòu)造。這個(gè)界面中主要設(shè)計(jì)的按鈕是"登錄〞按鈕,因?yàn)橐獙⑵浔O(jiān)聽。此用戶登錄界面涉及的變量如下北部需要的變量JLabeljbl1;中部需要的變量JPaneljp1;JLabeljp1_jbl1,jp1_jbl2;JButtonjp1_jb1,jp1_jb2;JTe*tFieldjp1_jtf;JPasswordFieldjp1_jpf;JCheckBo*jp1_jb*1,jp1_jb*2;南部需要的組件JPaneljp2;JButtonjp2_jb1,jp2_jb2;當(dāng)用戶點(diǎn)對(duì)于登錄按鈕的監(jiān)聽jp2_jb1=newJButton("登陸");//響應(yīng)用戶點(diǎn)擊jp2_jb1.addActionListener(this);監(jiān)聽當(dāng)監(jiān)聽點(diǎn)擊了用戶登錄按鈕時(shí),會(huì)自動(dòng)跳轉(zhuǎn)執(zhí)行監(jiān)聽函數(shù)publicvoidactionPerformed(ActionEvente){//如果用戶點(diǎn)擊登錄 if(e.getSource()==jp2_jb1){ QqClientUserqqclientuser=newQqClientUser();到QqClientUser類中執(zhí)行 Useru=newUser();新建一個(gè)User對(duì)象 u.setUserid(jp1_jtf.getTe*t().trim());獲得User對(duì)象的用戶賬號(hào),是輸入框中jp1_jtf中輸入的賬號(hào) u.setPassword(newString(jp1_jpf.getPassword()));獲得User對(duì)象的用戶密碼,就是輸入框中jp1_jpf中輸入的內(nèi)容if(qqclientuser.checkUser(u)){ //發(fā)送一個(gè)要求返回在線好友的請(qǐng)求包try{ //把創(chuàng)立好友列表的語(yǔ)句提前否則不能成功 Qqfrienlistqqlist=newQqfrienlist(u.getUserid()); ManageQqFriendList.addQqfrienlist(u.getUserid(),qqlist); ObjectOutputStreamoos=newObjectOutputStream(ManagerClientServerThread.getClientConServerThread(u.getUserid()).getS().getOutputStream());在這個(gè)類中,還提前參加了一個(gè)獲取好友在線情況的函數(shù),由于在用戶登錄時(shí),用戶要知道哦自己的好友在線的情況,所以就會(huì)向效勞器發(fā)送一個(gè)申請(qǐng)好友在線情況的申請(qǐng),同時(shí)會(huì)在效勞器返回一個(gè)在線好友的數(shù)據(jù)流后在切換到好友列表界面。//做一個(gè)message Messagem=newMessage(); m.setMesType(MessageType.message_get_onlinefriend);//指明我要的是這個(gè)qq號(hào)的好友情況m.setSender(u.getUserid());就是這個(gè)發(fā)送請(qǐng)求的好友 oos.writeObject(m); }catch(E*ceptione2){ //TODO:handlee*ception e2.printStackTrace(); }.2用戶好友列表界面客戶端用戶好友界面設(shè)計(jì)類的類名為Qqfrienlist,是存放在view包中,主要是實(shí)現(xiàn)用戶好友界面的顯示,其可以該用戶的所有好友以及好友的狀態(tài),在線的頭像就會(huì)使彩色,不在線的圖像就會(huì)是保持灰色。通過(guò)java界面設(shè)計(jì)語(yǔ)句設(shè)計(jì)出好友列表界面的布局是一個(gè)BordeLayo布局,在這個(gè)BordeLayo布局中在進(jìn)展好友列表和陌生人列表的設(shè)計(jì)。這兩個(gè)列表設(shè)計(jì)是一樣的,就以好友列表界面舉例來(lái)說(shuō);整個(gè)界面是一個(gè)BordeLayo布局,在這個(gè)整體布局中,又分為三局部:最上方是一個(gè)只含有一個(gè)"好友列表〞JButton的JPanel,最下方是含有兩個(gè)JButton的JPanel,最主要的是中間的布局,它是一個(gè)JScrollPanel布局,是可以上下滾動(dòng)的。此用戶好友列表界面涉及的變量如下JPaneljphy1,jphy2,jphy3;JButtonjphy_jb1,jphy_jb2,jphy_jb3;JScrollPanejsp1;JLabel[]list;JScrollPanel布局的主要實(shí)現(xiàn)jphy2=newJPanel(newGridLayout(20,1,4,4));//給jphy2初始化20個(gè)好友 list=newJLabel[20]; for(inti=0;i<list.length;i++) {list[i]=newJLabel(i+1+"",newImageIcon("image/mm.jpg"),JLabel.LEFT); list[i].setEnabled(false); if(list[i].getTe*t().equals(ownerid)) { list[i].setEnabled(true); } list[i].addMouseListener(this); jphy2.add(list[i]); }jsp1=newJScrollPane(jphy2);定義變量jsp1為JScrollPane型變量陌生人界面的設(shè)計(jì)方法和原理和用戶列表是一樣的,只是有一點(diǎn)點(diǎn)變化,但是要想顯示用戶的陌生人列表則需要點(diǎn)擊用戶的"陌生人〞按鈕進(jìn)展一個(gè)監(jiān)聽,主要代碼實(shí)現(xiàn):jphy_jb2=newJButton("陌生人");jphy_jb2.addActionListener(this);這個(gè)監(jiān)聽是在好友列表界面中實(shí)現(xiàn)的,因?yàn)橹挥性诤糜蚜斜碇悬c(diǎn)擊"陌生人〞按鈕,界面才會(huì)切換到陌生人列表界面,同樣理由,如果要繼續(xù)增加列表界面的數(shù)量,則在每一個(gè)列表中的JButton"陌生人〞這個(gè)變量下都要進(jìn)展一個(gè)監(jiān)聽。所以最終設(shè)列表界面數(shù)位n則*一個(gè)界面的按鈕監(jiān)聽數(shù)就為n-1,即除了自己界面,其他的界面都要有連接到此界面的監(jiān)聽。監(jiān)聽的執(zhí)行函數(shù)如下:用if函數(shù),點(diǎn)擊什么按鈕就切換到相應(yīng)界面publicvoidactionPerformed(ActionEvente){//點(diǎn)擊陌生人按鈕,就會(huì)顯示陌生人卡片 if(e.getSource()==jphy_jb2)點(diǎn)擊陌生人按鈕 { c1.show(this.getContentPane(),"2");顯示陌生人卡片 }//點(diǎn)擊好友列表按鈕,就會(huì)顯示好友列表卡片 elseif(e.getSource()==jpmo_jb1)點(diǎn)擊好友列表按鈕 { c1.show(this.getContentPane(),"1");顯示好友列表卡片 } }從上面函數(shù)中我們可以看見跳轉(zhuǎn)各個(gè)卡片時(shí),使用的是數(shù)字"1〞"2〞進(jìn)展的,按照總界面設(shè)計(jì)時(shí)的分界面上下順序以及編碼定義實(shí)現(xiàn)這些界面的順序,將這些界面的變量進(jìn)展定義:this.add(jphy1,"1");好友列表定義"1〞 this.add(jpmo1,"2");陌生人列表定義"2〞這樣使用時(shí)想切換哪個(gè)界面就沒(méi)有必要過(guò)多的使用所定義的變量,從而會(huì)在一定的程度上防止了調(diào)用時(shí)的錯(cuò)誤的發(fā)生。除了在設(shè)計(jì)界面是所要使用到行動(dòng)監(jiān)聽ActionListener,還要使用一種監(jiān)聽就是鼠標(biāo)監(jiān)聽MouseListener,使用過(guò)群眾聊天工具QQ的用戶都知道,當(dāng)用戶登錄成功后顯示好友列表界面時(shí)移動(dòng)或點(diǎn)擊鼠標(biāo)就會(huì)出現(xiàn)相應(yīng)的現(xiàn)象,所以這里就需要進(jìn)展鼠標(biāo)監(jiān)聽,主要監(jiān)聽實(shí)現(xiàn)的功能有:在好友列表中,當(dāng)鼠標(biāo)移動(dòng)到*一個(gè)好友上時(shí),此好友頭像變紅,鼠標(biāo)移走,頭像恢復(fù)原樣publicvoidmouseEntered(MouseEvente){//鼠標(biāo)放在好友頭像上,頭像灰變紅JLabelj1=(JLabel)e.getSource();j1.setForeground();}publicvoidmouseE*ited(MouseEvente){//鼠標(biāo)移走,頭像恢復(fù)原樣JLabelj1=(JLabel)e.getSource();j1.setForeground();}2.當(dāng)鼠標(biāo)移動(dòng)到*個(gè)好友頭像上,并且雙擊其頭像,就會(huì)出現(xiàn)與該好友聊天的聊天界面,聊天界面的設(shè)計(jì)下面會(huì)詳細(xì)闡述,監(jiān)聽雙擊的響應(yīng)函數(shù)如下:publicvoidmouseClicked(MouseEvente){//響應(yīng)用戶雙擊的事件,并獲得好友if(e.getClickCount()==2)鼠標(biāo)雙擊{JLabelj2=(JLabel)e.getSource();j2是一個(gè)新的JLabel用來(lái)得到新的聊天界面資源StringfrienNo=j2.getTe*t();Qqchatqqchat=newQqchat(this.owner,frienNo);新建一個(gè)qqchat函數(shù)調(diào)用執(zhí)行Qqchat//把聊天界面參加到管理類 ManageQqChat.addQqchat(this.owner+""+frienNo,qqchat);} }在這個(gè)響應(yīng)中有調(diào)用QqChat類,也有調(diào)用ManageQqChat類,這些類的功能在后面會(huì)一一介紹.3用戶聊天界面用戶聊天界面類的類名為QqChat,顧名思義,這個(gè)類就是用來(lái)定義關(guān)于用戶聊天的一切功能實(shí)現(xiàn)函數(shù)的類,在這個(gè)類中,主要實(shí)現(xiàn)的是用戶聊天界面的設(shè)計(jì),還有就是聊天工具中比較重要的聊天信息的發(fā)送,在上面介紹效勞器端的詳細(xì)設(shè)計(jì)時(shí),就提到在效勞器和客戶的通信線程類SerConClientThread中實(shí)現(xiàn)一個(gè)功能就是效勞器承受到用戶的發(fā)送過(guò)來(lái)的包并且進(jìn)展判斷,根據(jù)不同的包執(zhí)行不同的代碼,實(shí)現(xiàn)不同的功能,那是效勞器獨(dú)有也是必須具備是轉(zhuǎn)發(fā)功能,但是前提是效勞器必須有包承受,那樣才能判斷。這里QqChat中第二個(gè)功能就是向效勞器發(fā)送信息包,以便效勞器接收判斷并且轉(zhuǎn)發(fā)。1.首先實(shí)現(xiàn)用戶聊天界面的設(shè)計(jì),這個(gè)設(shè)計(jì)很簡(jiǎn)單,這是有根本的文本輸入和顯示框架,還有一個(gè)發(fā)送按鈕。所使用的變量定義如下:JTe*tAreajta;這是文本顯示域用來(lái)顯示對(duì)方發(fā)來(lái)的聊天信息JTe*tFieldjtf;這是聊天文本的輸入框JButtonjbt;發(fā)送按鈕JPaneljpl;底部的布局為一個(gè)JPanel布局那些根本的定義的編碼在這你就不在這里過(guò)多的闡述,布局的設(shè)計(jì)如下:this.add(jta,"Center");文本顯示域放置在中間 this.add(jpl,"South");JPanel在最底部,包括輸入框和發(fā)送按鈕 this.setTitle(ownerid+"正在和"+frien+"聊天");為聊天界面命名 this.setIconImage(newImageIcon("image/qq.gif").getImage());為聊天界面設(shè)置一個(gè)小小的頭像圖片 this.setSize(400,300);設(shè)置聊天界面大小2.用戶與*好友聊天時(shí),在輸入框中輸入聊天內(nèi)容,并且點(diǎn)擊發(fā)送按鈕將其發(fā)送給效勞器,讓其轉(zhuǎn)發(fā);還有就是承受效勞器轉(zhuǎn)發(fā)過(guò)來(lái)的聊天好友信息數(shù)據(jù)流后在聊天界面顯示域顯示。先寫一個(gè)函數(shù),讓其實(shí)現(xiàn)顯示聊天信息顯示功能publicvoidshowMessage(Messagem) { Stringinfo=m.getSender()+"對(duì)"+m.getGetter()+"說(shuō)"+m.getCon()+"\r\n";this.jta.append(info);顯示所承受的信息 }聊天信息顯示函數(shù)寫好后在實(shí)現(xiàn)聊天信息的發(fā)送,首先要與往常一樣,在剛開場(chǎng)的發(fā)送按鈕處進(jìn)展一個(gè)監(jiān)聽,當(dāng)用戶點(diǎn)擊發(fā)送按鈕時(shí)發(fā)送輸入的信息jbt=newJButton("發(fā)送");定義發(fā)送按鈕 jbt.addActionListener(this);對(duì)發(fā)送按鈕進(jìn)展監(jiān)聽響應(yīng)發(fā)送按鈕的監(jiān)聽,當(dāng)用戶點(diǎn)擊了發(fā)送按鈕時(shí),就將用戶在輸入框中輸入的內(nèi)容進(jìn)展打包發(fā)送。首先新建一個(gè)Message,并且聲明這個(gè)Message發(fā)送的是什么包,而后在定義這個(gè)Message發(fā)送包的具體內(nèi)容if(e.getSource()==jbt)如果用戶點(diǎn)擊了發(fā)送按鈕 { Messagem=newMessage();新建一個(gè)Messagem.setMesType(MessageType.message_comm_mes);定義聲明這個(gè)Message發(fā)送的包的類型為message_comm_mes包m.setSender(this.ownerid);定義這個(gè)發(fā)送包的發(fā)送者的id為本人的idm.setGetter(this.frienid);定義這個(gè)包的承受者id為此時(shí)聊天好友的idm.setCon(jtf.getTe*t());定義發(fā)送包的內(nèi)容為聊天輸入框的信息文本m.setSendTime(newjava.util.Date().toString());發(fā)送時(shí)間就是本機(jī)時(shí)間這里只是在監(jiān)聽到用戶點(diǎn)擊了發(fā)送按鈕時(shí)第一時(shí)間所做的事情,就是定義好將要發(fā)送的包,承受者、發(fā)送者、時(shí)間、內(nèi)容等必要的組件都已將定義并且已經(jīng)封裝在這個(gè)發(fā)送包Message中了,現(xiàn)在剩下的就是將這個(gè)包發(fā)送到效勞器端了。//發(fā)送給效勞器 try{ObjectOutputStreamoos=newObjectOutputStream (ManagerClientServerThread.getClientConServerThread(ownerid).getS().getOutputStream()); oos.writeObject(m);}這里的重點(diǎn)局部就是雙斜杠加粗的局部,這個(gè)局部是一個(gè)合成語(yǔ)句,一步到位的,來(lái)將其拆分逐個(gè)解釋,首先ObjectOutputStreamoos=newObjectOutputStream是定義一個(gè)新的對(duì)象輸出流名為oos,其中oos要調(diào)用函數(shù)將Message包發(fā)送出去,所調(diào)用的函數(shù)是ManagerClientServerThread類中的函數(shù)getClientConServerThread,調(diào)用這個(gè)函數(shù)的目的就是為了得到客戶連接效勞器端的線程名就是本機(jī)的用戶的id,用來(lái)進(jìn)展指定發(fā)送。至上為止就已經(jīng)將界面包viwe中的三個(gè)界面類用戶登錄界面類QQClientLogin、用戶好友列表界面類Qqfrienlist、用戶聊天界面類Qqchat的設(shè)計(jì)進(jìn)展了具體的解釋。下面就具體介紹model包中的類的詳細(xì)設(shè)計(jì)和具體用途。模塊包的設(shè)計(jì)〔model包〕.1客戶端連接效勞器類這個(gè)類放在model包中就可以看出來(lái)它的重要性,客戶端連接效勞器類QqClientlianjie顧名思義就是用與c/s軟件中連接局部的重中之重,c/s軟件就是包括兩個(gè)組成局部:客戶端、效勞器,而他們的只有在連接的根底上才能進(jìn)一步設(shè)計(jì)增加其他的功能,這個(gè)類就相當(dāng)于中間樞紐。類QqClientlianjie它的主要功能就是為了實(shí)現(xiàn)客戶端與效勞器連接;要實(shí)現(xiàn)這個(gè)總根本上是分這幾步來(lái)實(shí)現(xiàn)的:首先先通過(guò)軟件使用的端口向效勞器發(fā)送io流,先實(shí)現(xiàn)與效勞器斷的連接publicbooleanSendLoginInfoToServer(Objecto){ booleanb=false; try{ s=newSocket("",9999);這就是效勞器斷的ip地址〔這里效勞器就是本機(jī)〕和軟件在本機(jī)所使用的端口號(hào) ObjectOutputStreamoos=newObjectOutputStream(s.getOutputStream());oos.writeObject(o);這里就是向效勞器輸出一個(gè)對(duì)象流 ObjectInputStreamois=newObjectInputStream(s.getInputStream());Messagems=(Message)ois.readObject();這里是將效勞器返回的對(duì)象劉進(jìn)展判斷并且根據(jù)不同的結(jié)果做出相應(yīng)的反映這里首先說(shuō)明一下客戶向效勞器發(fā)送的包并非隨意發(fā)送的,這個(gè)發(fā)送的信息包是將已經(jīng)在用戶翻開登錄界面,將用戶名和密碼輸入并且點(diǎn)擊了登錄按鈕后就開場(chǎng)定義封裝,其中包括的就是客戶id和密碼,這個(gè)包在上面介紹用戶登錄界面設(shè)計(jì)中已經(jīng)詳細(xì)說(shuō)明了。對(duì)效勞器端返回的數(shù)據(jù)包進(jìn)展判斷并作出相應(yīng)的回應(yīng),如果效勞器返回的信息包的為"1〞,則就是說(shuō)明用戶輸入的信息合法,用戶登錄成功,相應(yīng)的就要看一個(gè)線程讓用戶和效勞器保持連接。 if(ms.getMesType().equals("1"))如果返回的是"1〞〔登錄成功〕 {//就創(chuàng)立一個(gè)該qq號(hào)效勞器端保持通訊連接的線程 ClientConServerThreadccst=newClientConServerThread(s);//啟動(dòng)該通訊線程 ccst.start(); ManagerClientServerThread.addClientConServerThread(((User)o).getUserid(),ccst);這里調(diào)用到管理線程類的函數(shù)addClientConServerThread b=true;將b的值改為true }這個(gè)public函數(shù)一開場(chǎng)就是設(shè)定的類型為boolean,所以只有兩種結(jié)果,就是登陸成功或者失敗,成功就執(zhí)行上面一個(gè)函數(shù),開一個(gè)線程,不成功就返回提示用戶賬號(hào)或者密碼輸入錯(cuò)誤。.2客戶檢查使用者類這個(gè)類其實(shí)是為了減少Q(mào)qClientlianjie中代碼的冗余,還有就是方便其他的類中*個(gè)步驟要為了與效勞器連接而調(diào)用連接函數(shù)時(shí),從類名上就可以缺的調(diào)用的函數(shù),進(jìn)一步減少了設(shè)計(jì)者編碼時(shí)的錯(cuò)誤率。這個(gè)類中只有一個(gè)函數(shù)checkUser(Useru),而他的變量就是一個(gè)User對(duì)象,這個(gè)函數(shù)的作用就是調(diào)用QqClientlianjie中的函數(shù)SendLoginInfoToServerpublicbooleancheckUser(Useru){ returnnewQqClientlianjie().SendLoginInfoToServer(u);//返回一個(gè)新的SendLoginInfoToServer函數(shù)也就是間接使用這個(gè)函數(shù)}需要強(qiáng)調(diào)的是這樣做到目的不是多余的,而恰恰是為到達(dá)減少多余的編碼的目的,如果在SendLoginInfoToServer中直接定義一個(gè)User函數(shù)的話,會(huì)讓看代碼的人難以理解,而這樣外部定義調(diào)用就會(huì)使思路更加清晰。用戶端工具包的設(shè)計(jì)〔tools包〕這個(gè)包里主要包含的是一些管理功能的類,它們根本上可以看成是用戶端實(shí)現(xiàn)其功能時(shí)所使用的工具。.1客戶端連接效勞器線程類這個(gè)類解釋起來(lái)名字看起來(lái)很長(zhǎng),其實(shí)很容易理解,就是每一個(gè)用戶連接效勞器時(shí)的線程設(shè)計(jì)類,所以這個(gè)類的主要功能都是與用戶的線程有關(guān)的。這個(gè)類的主要線程就是每時(shí)每刻檢測(cè)是否從效勞器有數(shù)據(jù)包發(fā)過(guò)來(lái),沒(méi)有就什么也不做,如果有的話就要作出相應(yīng)的動(dòng)作,也就是選判斷從效勞器發(fā)過(guò)來(lái)的數(shù)據(jù)包是什么類型的,然后再做出相應(yīng)的反響。下面來(lái)進(jìn)展分布的介紹:先不停的讀取從效勞器端發(fā)來(lái)的信息while(true){不停的檢測(cè)try{ObjectInputStreamois=newObjectInputStream(s.getInputStream());新建輸入流Messagem=(Message)ois.readObject();新建一個(gè)Message包用來(lái)讀取發(fā)來(lái)的信息System.out.println("讀取從效勞器發(fā)來(lái)的消息"+m.getSender()+"給"+m.getGetter()+"說(shuō)"+m.getCon());這是一個(gè)輸出語(yǔ)句如果是普通的信息包就顯示if(m.getMesType().equals(MessageType.message_comm_mes))普通信息包{//把效勞器獲得消息,顯示到該顯示的聊天界面Qqchatqqchat=ManageQqChat.getQqchat(m.getGetter()+""+m.getSender());//顯示就直接調(diào)用Qqchat中的showMessage函數(shù)qqchat.showMessage(m);}如果是返回在線好友包就更新用戶的好友列表elseif(m.getMesType().equals(MessageType.message_ret_onlinefriend))在線好友包{ Stringcon=m.getCon();提取信息 Stringfriends[]=con.split("");用數(shù)組存放在線好友名單 Stringgetter=m.getGetter();提取承受者//修改相應(yīng)的好友列表Qqfrienlistqqfrienlist=ManageQqFriendList.getQqfrienlist(getter);//更新在線好友 if(qqfrienlist!=null)如果好友列表部位空{(diào)看在線者中是否有其好友,逐個(gè)對(duì)應(yīng)更新 qqfrienlist.updateFriend(m); }}在這個(gè)類的最后還有一個(gè)構(gòu)造函數(shù),其作用就是初始化新對(duì)象的數(shù)據(jù)成員,因?yàn)樯厦嬖O(shè)置的套接字變量s是私有的,受保護(hù),所以寫了一個(gè)構(gòu)造函數(shù)。 publicClientConServerThread(Sockets) {this.s=s;初始化新對(duì)象的數(shù)據(jù)成員 }.2管理客戶端連接效勞器線程類這個(gè)類名為ManagerClientServerThread,顯而易見是與上面的客戶端連接效勞器線程類rClientServerThread是有關(guān)聯(lián)的,它的主要功能如名字一樣,就是為了管理用戶連接效勞器后所生成的線程的。類里很簡(jiǎn)單的只定義了一個(gè)哈希表,用來(lái)存放用戶線程,還有就是定義兩了個(gè)函數(shù):ManagerClientServerThread和getClientConServerThread。下面分別介紹這兩個(gè)函數(shù)的功能:1.ManagerClientServerThread函數(shù)的定義其實(shí)就是為了把創(chuàng)立好的用戶線程放入到哈希表中 publicstaticvoidaddClientConServerThread(Stringqqid,ClientConServerThreadccst){hm.put(qqid,ccst);把創(chuàng)立好的用戶線程放入到哈希表中}2.getClientConServerThread函數(shù)就是為了可以通過(guò)qqid取得該用戶的線程,簡(jiǎn)單方便。 publicstaticClientConServerThreadgetClientConServerThread(Stringqqid) { return(ClientConServerThread)hm.get(qqid);返回的就是對(duì)應(yīng)用戶的線程}這就是管理用戶線程類的兩大功能,簡(jiǎn)單實(shí)用同時(shí)又必不可少.3管理用戶的聊天界面的類ManageQqChat類要實(shí)現(xiàn)的功能也很簡(jiǎn)單,首先也是建立了一個(gè)哈希表用來(lái)存放聊天界面,哈希表是靜態(tài)的不隨函數(shù)的變化而變化,類的主要功能就是將用戶聊天界面在這個(gè)哈希表中參加或者取出,從而到達(dá)管理的目的。publicclassManageQqChat{//新建的哈希表用來(lái)存放用戶聊天界面 privatestaticHashMaphm=newHashMap<String,Qqchat>();//當(dāng)用戶在好友列表中雙擊了*好友想與其聊天時(shí),將用戶聊天界面參加 publicstaticvoidaddQqchat(StringloginIdAndFriendId,Qqchatqqchat) {hm.put(loginIdAndFriendId,qqchat);參加 }//當(dāng)用戶關(guān)閉與*個(gè)好友的聊天界面是,將這個(gè)聊天界面從哈希表中取出 publicstaticQqchatgetQqchat(StringloginIdAndFriendId) {return(Qqchat)hm.get(loginIdAndFriendId);取出 }ManageQqChat類的功能就是簡(jiǎn)單的管理聊天界面的,也是簡(jiǎn)單實(shí)用又必不可少。.4管理好友列表、黑名單界面類與上面的兩個(gè)管理類一樣,這個(gè)類也是為了實(shí)現(xiàn)管理的功能,但是它是為了管理好友列表、黑名單的;如果后期還想在好友界面中參加一些卡片的話,如家人卡片、同學(xué)卡片,則它們的管理也是要放在這個(gè)類里來(lái)實(shí)現(xiàn)。與管理聊天界面類一樣,這個(gè)類首先也是建立了一個(gè)哈希表用來(lái)存放好友列表界面,哈希表是靜態(tài)的不隨函數(shù)的變化而變化,類的主要功能就是將用戶好友列表在這個(gè)哈希表中參加,還有就是得到*用戶好友列表這兩個(gè)根本功能。publicclassManageQqFriendList{//新建的哈希表用來(lái)存放用戶好友列表privatestaticHashMaphm=newHashMap<String,Qqfrienlist>();//當(dāng)用戶在好友在線時(shí),將這個(gè)好友參加好友列表中 publicstaticvoidaddQqfrienlist(Stringqqid,Qqfrienlistqqfrienlist) {hm.put(qqid,qqfrienlist);參加}//通過(guò)變量qqid來(lái)取得相應(yīng)用戶的好友列表情況 publicstaticQqfrienlistgetQqfrienlist(Stringqqid) {return(Qqfrienlist)hm.get(qqid);獲得取出 }ManageQqFriendList類的功能就是簡(jiǎn)單的管理用戶的好友列表的,用戶獲取它時(shí)就可以直接的知道自己好友的在線情況。在效勞器端與用戶端中,可以輕易的發(fā)現(xiàn)有一個(gè)同名的包c(diǎn)om.qqmon包,沒(méi)有將其在效勞器端或用戶端中獨(dú)立介紹是因?yàn)檫@個(gè)包里的類它們的定義完全一樣,它們是效勞器和客戶都要共同使用的數(shù)據(jù)對(duì)象,所以單獨(dú)介紹。User類這個(gè)類中其實(shí)就是定義了一個(gè)對(duì)象user,這個(gè)對(duì)象就是用戶的公共代表,它里面包括使用者的賬號(hào)id和密碼publicclassUserimplementsjava.io.Serializable{ privateStringuserid;用戶id privateStringpassword;用戶密碼//設(shè)置用戶賬號(hào)函數(shù) publicStringgetUserid(){ returnuserid; }//設(shè)置用戶密碼函數(shù) publicvoidsetUserid(Stringuserid){ this.userid=userid; }//取得用戶賬號(hào)函數(shù) publicStringgetPassword(){ returnpassword; }//取得用戶密碼函數(shù) publicvoidsetPassword(Stringpassword){ this.password=password; }}這就是將使用者的根本信息封裝在一個(gè)對(duì)象中,這樣效勞器和客戶使用時(shí)直調(diào)用這個(gè)User包就行了包的種類定義類QQ在設(shè)計(jì)時(shí)客戶與效勞器之間傳輸?shù)牟煌陌蟾庞?0多種,在這里我設(shè)計(jì)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論