第一篇:JAVA聊天室實(shí)驗(yàn)報(bào)告
Java聊天室實(shí)驗(yàn)報(bào)告
班 級:學(xué) 號:姓 名:
****** ******** ***
目錄:
一、實(shí)驗(yàn)?zāi)康?......................................................3
二、所需技術(shù).......................................................3
三、需求分析.......................................................3
四、系統(tǒng)設(shè)計(jì).......................................................4
1、服務(wù)器結(jié)構(gòu)..................................................4
2、客戶端結(jié)構(gòu)..................................................4
五、實(shí)現(xiàn)細(xì)節(jié).......................................................5
1、客戶端細(xì)節(jié)...................................................5
2、服務(wù)器細(xì)節(jié)...................................................6
六、系統(tǒng)展示.......................................................7
七、實(shí)驗(yàn)小結(jié).......................................................9
Rain153 WeChat 聊天室系統(tǒng)一、實(shí)驗(yàn)?zāi)康模?/p>
1、使用Java技術(shù)完成聊天室系統(tǒng),深入學(xué)習(xí)使用Java語言。
2、使用Java 的多線程機(jī)制,深入理解Java多線程技術(shù)的應(yīng)用。
3、使用GUI,對JFrame的深入學(xué)習(xí)。
4、使用網(wǎng)絡(luò)編程,掌握基于TCP協(xié)議的Socket編程,了解Socket編程的協(xié)議約定,掌握簡單應(yīng)用協(xié)議的開發(fā)。
5、使用C/S架構(gòu),對網(wǎng)絡(luò)編程有一定的了解。
二、所需技術(shù)
本系統(tǒng)要求使用java技術(shù)開發(fā)。所需知識包括java程序設(shè)計(jì)語言、swing基本GUI組件、多線程編程、socket編程、集成開發(fā)環(huán)境使用eclipse。系統(tǒng)采用兩層C/S體系結(jié)構(gòu),C端負(fù)責(zé)通過GUI與客戶交互,實(shí)現(xiàn)注冊、登陸、收發(fā)信息、退出等功能; S端是聊天系統(tǒng)的服務(wù)器。
三、需求分析
開發(fā)一個(gè)類似QQ 的聊天室系統(tǒng),即WeChat聊天系統(tǒng)。該系統(tǒng)應(yīng)具有如下功能:
1、2、用戶注冊、登錄 群聊;
3、私聊;
4、服務(wù)器發(fā)送系統(tǒng)消息;
5、服務(wù)器踢人;
6、保存日志;
7、保存聊天信息;
四、系統(tǒng)設(shè)計(jì)
1、服務(wù)器結(jié)構(gòu)
啟動服務(wù)器監(jiān)聽AppServer服務(wù)器控制監(jiān)聽窗體ServerFrameConnection處理所有用戶請求
服務(wù)器端結(jié)構(gòu)圖示
2、客戶端結(jié)構(gòu)
啟動客戶端ChatClient用戶登錄窗體Login用戶聊天主窗體ChatRoom時(shí)鐘窗體ClockRegister用戶注冊窗體Windowclose用戶窗體監(jiān)聽器
客戶端結(jié)構(gòu)圖示
1、AppServer.java
為服務(wù)器端監(jiān)聽類,負(fù)責(zé)服務(wù)器的啟動,包括啟動監(jiān)聽端口、服務(wù)器監(jiān)控界面。
2、ServerFrame.java 為服務(wù)器監(jiān)控窗體,負(fù)責(zé)監(jiān)控服務(wù)器運(yùn)行狀態(tài)。
3、Connection.java 為服務(wù)器連接處理的具體實(shí)現(xiàn)。
4、ChatClient.java 為客戶端程序啟動類,負(fù)責(zé)客戶端的啟動和退出。
5、Login.java 為客戶端程序登錄界面,負(fù)責(zé)用戶帳號信息的驗(yàn)證與反饋。
6、Register.java 為客戶端程序注冊界面,負(fù)責(zé)用戶帳號信息的注冊驗(yàn)證與反饋。
7、ChatRoom.java 為客戶端程序聊天室主界面,負(fù)責(zé)接收、發(fā)送聊天內(nèi)容與服務(wù)器的Connection合作。
8、Windowclose 為ChatRoom.java的內(nèi)部類,負(fù)責(zé)監(jiān)聽聊天室界面的操作,當(dāng)用戶退出時(shí)返回給服務(wù)器信息。
9、Clock.java 為客戶端程序的一個(gè)小程序,實(shí)現(xiàn)的一個(gè)石英鐘功能。(可選)
五、實(shí)現(xiàn)細(xì)節(jié)
概述:聊天室主要功能的實(shí)現(xiàn):從界面輸入登錄信息,然后與服務(wù)器建立Socket連接(連接時(shí)應(yīng)指定服務(wù)器的IP地址和端口號,而客戶端socket的端口由本方操作系統(tǒng)從空閑端口中確定),服務(wù)器端的“傾聽Socket”收到連接請求后,一般會接受連接請求,并生成一個(gè)服務(wù)端socket,專門負(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é)束一次通訊過程。為了實(shí)現(xiàn)多客戶在線的請求,使用多線程機(jī)制來處理,對每一個(gè)客戶端連接通訊,服務(wù)器端都有一個(gè)線程專門負(fù)責(zé)處理。
一)客戶端細(xì)節(jié)
1、注冊:
當(dāng)選擇注冊時(shí),Register界面等待用戶輸入注冊信息,并將信息封裝成Register_Customer類,然后通過建立在Socket的連接之上的對象輸出流將用戶注冊信息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后將驗(yàn)證數(shù)據(jù)的完整性并在數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊信息加入數(shù)據(jù)庫,最后將注冊結(jié)果返回給客戶端??蛻舳孙@示注冊結(jié)果。
2、登錄:
當(dāng)選擇登錄時(shí),客戶端由Login 界面等待用戶輸入登錄信息后,封裝成Customer對象類然后通過建立在Socket的連接之上的對象輸出流將用戶登錄信息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection 在收到信息后將驗(yàn)證數(shù)據(jù)的完整性并在對象型數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊用戶的信息與登錄請求信息進(jìn)行密碼驗(yàn)證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結(jié)果返回給客戶端。若登錄成功,客戶端將啟動聊天室主界面。
3、聊天 a、發(fā)送聊天信息:私聊功能需在在線列表中選中私聊聊天對象,并勾選私聊選項(xiàng)。群聊功能取消對私聊功能的勾選即可。當(dāng)用戶點(diǎn)擊完發(fā)送按鈕后,程序開始將當(dāng)前用戶名、聊天對象、聊天內(nèi)容、表情和是否私聊進(jìn)行封裝,然后獲取Socket連接,再用對象輸出流包裝Socket的輸出流將聊天信息對象發(fā)送給服務(wù)器端。
b、接收聊天信息:用一個(gè)單獨(dú)的接收線程實(shí)現(xiàn),客戶端必須隨時(shí)接收服務(wù)器發(fā)來的消息,而讀取消息的方法采用的是阻塞式方法,若在事件處理程序中讀(占用的是事件處理線程)則會使程序在此后無法響應(yīng)用戶操作,所以需要生成一個(gè)單獨(dú)的線程專門用于讀取處理消息。而發(fā)送消息的方法則是將消息放入操作系統(tǒng)的發(fā)送緩沖區(qū)后就返回的,所以發(fā)送執(zhí)行的相當(dāng)快,可以在事件處理線程中直接調(diào)用。發(fā)送和接收可以同時(shí)進(jìn)行。二)服務(wù)器端細(xì)節(jié)
1、注冊:創(chuàng)建一個(gè)File文件類,載入“user.txt”,再用對象輸入流ObjectInputStream包裝File文件類,將存儲在“user.txt”得向量對象Vector中載入內(nèi)存中,現(xiàn)在系統(tǒng)中的向量就是對象型數(shù)據(jù)庫,存儲著每條用戶信息對象。判斷是否是第一個(gè)注冊用戶,判斷用戶名是否已經(jīng)存在,判斷用戶名是否為系統(tǒng)關(guān)鍵字,用戶名有效后 寫入數(shù)據(jù)庫,并給客戶端返回信息,關(guān)閉Socket連接。
2、登錄:去數(shù)據(jù)庫讀用戶數(shù)據(jù),打開用戶數(shù)據(jù)庫文件“user.txt”,將用戶數(shù)據(jù)對象集載入內(nèi)存,以供下面的程序使用。驗(yàn)證用戶名是否存在,驗(yàn)證用戶密碼是否正確,驗(yàn)證用戶是否已經(jīng)登錄,驗(yàn)證是否已經(jīng)超過最大登錄人數(shù),如果以上驗(yàn)證全部正確,返回客戶端信息,關(guān)閉Socket連接。
3、退出:接收退出信息,當(dāng)用戶退出時(shí),客戶端將會用基于Socket的對象輸出流發(fā)給服務(wù)器退出對象,把用戶從在線列表中刪除,更新在線列表。
4、聊天:接收用戶聊天信息,當(dāng)用戶發(fā)送聊天信息時(shí),服務(wù)端將會收到客戶端用Socket傳輸過來的聊天信息對象,然后將其轉(zhuǎn)換為Message對象,返回聊天信息,然后系統(tǒng)從Message中提出消息類型,再根據(jù)類型將消息強(qiáng)制轉(zhuǎn)化ChatMessage,調(diào)用ChatMeaage中方法,獲取目的客戶名稱列表,根據(jù)目的地用戶名從用戶名、socket鍵值表中獲取socket,再通過socket將Message轉(zhuǎn)發(fā)到相應(yīng)的用戶。
六、系統(tǒng)展示
1、注冊
客戶端注冊界面
2、登錄
客戶端登錄界面
3、聊天界面
聊天界面
4、服務(wù)器界面
服務(wù)器管理界面
服務(wù)器用戶信息管理界面
七、實(shí)驗(yàn)小結(jié)
本次實(shí)驗(yàn)是比較復(fù)雜的一個(gè)題目,采用C/S架構(gòu)設(shè)計(jì)的聊天室,使用增量迭代方式開發(fā),從初始的0.1版到最終的2.0正式版。通過本次實(shí)驗(yàn),對C/S架構(gòu)有了較深的認(rèn)識,也對多線程編程、網(wǎng)絡(luò)編程、GUI的認(rèn)識更清晰。在項(xiàng)目中遇到很多問題,在解決問題的過程中,對Java也漸漸的熟悉,尤其是對各種異常的處理更是對自己的一種鍛煉。在此次實(shí)驗(yàn)中應(yīng)用了很多上課時(shí)未講到的知識,自己查閱API,閱讀JDK源碼學(xué)習(xí)方法的使用讓自己收獲頗豐。由于這是一個(gè)人的項(xiàng)目,雖然在項(xiàng)目的實(shí)施上很自由,可到問題沒有人討論,耗費(fèi)了很多精力,不過這也是提高自己的好方法。
該Rain153 WeChat聊天室由于時(shí)間原因,很多功能實(shí)現(xiàn)的并不合理,也有些功能尚未實(shí)現(xiàn)。Rain153 WeChat并未與數(shù)據(jù)庫連接,只是簡單的用文件保存用具信息及消息記錄。
第二篇:java聊天室設(shè)計(jì)總結(jié)
JAVA聊天室程序設(shè)計(jì)總結(jié)
大二第一學(xué)期末我們進(jìn)行了為期兩周的java實(shí)習(xí),這次的實(shí)習(xí)內(nèi)容是設(shè)計(jì)一個(gè)多人聊天室。在網(wǎng)絡(luò)越來越發(fā)達(dá)的今天,人們對網(wǎng)絡(luò)的依賴越來越多,越來越離不開網(wǎng)絡(luò),由此而產(chǎn)生的聊天工具越來越多,類似QQ、MSN,網(wǎng)絡(luò)聊天時(shí)一類的聊天系統(tǒng)的發(fā)展日新月異,因此老師布置了制作一個(gè)有簡單聊天功能的網(wǎng)絡(luò)聊天程序的課程;而且通過制作該程序還能更好的學(xué)習(xí)網(wǎng)絡(luò)軟件編程知識。
一、設(shè)計(jì)內(nèi)容
利用java語言實(shí)現(xiàn)聊天室程序。聊天室分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負(fù)責(zé)偵聽客戶端發(fā)來的消息,客戶端需登錄到服務(wù)器端才可以實(shí)現(xiàn)正常的聊天功能。設(shè)計(jì)的聊天室能實(shí)現(xiàn)用戶登錄,顯示登錄用戶列表,以及發(fā)送聊天信息和顯示聊天信息的功能。并可以選擇接收信息的用戶進(jìn)行單發(fā)或群發(fā)的功能,運(yùn)行程序,登錄服務(wù)器后,可以從列表中選擇單個(gè)或多個(gè)用戶進(jìn)行聊天,它是圖形界面,線程,流與文件系統(tǒng)等技術(shù)的綜合應(yīng)用。
二、實(shí)現(xiàn)功能
1、啟動服務(wù)器端,接收客戶端發(fā)來的信息,并在服務(wù)器端窗體顯示客戶端聊天信息,再吧信息返給在線用戶。
2、啟動客戶端,進(jìn)入客戶端頁面,輸入用戶名,點(diǎn)擊登錄按鈕,在顯示在線用戶列表內(nèi)顯示用戶名。
3、發(fā)送編輯框輸入發(fā)送內(nèi)容,單擊發(fā)送按鈕,啟動輸出流,把信息發(fā)送出去,同時(shí)把發(fā)出的信息追加到聊天內(nèi)容文本域內(nèi),顯示用戶名,時(shí)間和發(fā)送內(nèi)容。
4、聊天信息文本域,在線用戶顯示域和發(fā)送信息的文本域加了滾動條,其中聊天信息文本域,發(fā)送信息的文本域的文字能自動換行。
5、別的客戶端發(fā)來信息是通過輸入流讀取信息,并截取發(fā)來信息的用戶名及信息,用戶名加到在線用戶列表上顯示在線,信息追加到聊天內(nèi)容文本域內(nèi),顯示用戶名,時(shí)間和發(fā)送內(nèi)容。
三、設(shè)計(jì)收獲
這是大學(xué)以來第一次自主設(shè)計(jì)一個(gè)聊天程序,于我來說還是很有新鮮感但同時(shí)也有著稍許擔(dān)心。通過此次課程設(shè)計(jì),將我本學(xué)期所學(xué)的JAVA知識得到鞏固和應(yīng)用,在設(shè)計(jì)的過程中我遇到了很到問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查和在老師、同學(xué)們的幫助下,慢慢的走上了成功之路,同時(shí)也暴露出了前期我在這方面的知識欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。這次課程設(shè)計(jì)還讓我懂得了寫程序不能閉門造車,要努力拓寬知識面,開闊視野,拓展思維。它還讓我學(xué)會了在網(wǎng)上查閱那些無限的資料。讓我不僅學(xué)會了書本上的知識,還讓自己能夠面對困難并且克服它使我更加扎實(shí)的掌握了有關(guān)JAVA方面的知識。過而能改,善莫大焉。在聊天室設(shè)計(jì)過程中,我們不斷發(fā)現(xiàn)錯誤,不斷改正,不斷領(lǐng)悟,不斷獲齲最終的檢測調(diào)試環(huán)節(jié),本身就是在踐行“過而能改,善莫大焉”的知行觀。程序雖然完成,但是距離優(yōu)秀仍存在一定差距,用JAVA開發(fā)大型項(xiàng)目還有很多我需要去努力學(xué)習(xí)的知識。希望自己能不斷學(xué)習(xí)和實(shí)踐,爭取以后做得更好。
第三篇:java聊天室課程設(shè)計(jì)報(bào)告
課程設(shè)計(jì)報(bào)告
2011 ~ 2012 學(xué)年 第 一 學(xué)期
學(xué) 號 20104053020 姓 名 胡勇昌 院 系 信息工程與技術(shù) 專 業(yè) 計(jì)算機(jī)工程系 課 程 名 稱 JAVA程序設(shè)計(jì) 課程設(shè)計(jì)名稱 局域網(wǎng)內(nèi)的多功能聊天室
學(xué) 時(shí) 學(xué) 分 1 指 導(dǎo) 教 師 許爍娜
2011年 12 月 25 日
目錄
課程設(shè)計(jì)報(bào)告..........................................................................................................................................1 第1章 引言............................................................................................................................................3 1.1 背景...............................................................................................................................................3 1.2 相關(guān)技術(shù).......................................................................................................................................3 1.2.1 JAVA概述...............................................................................................................................3 1.2.2 Socket......................................................................................................................................3 1.2.3 TCP 三次握手.....................................................................................................................4 1.3 術(shù)語...............................................................................................................................................4 第2章 需求分析與系統(tǒng)設(shè)計(jì)................................................................................................................5 2.1 需求分析.......................................................................................................................................5 2.2 系統(tǒng)設(shè)計(jì).......................................................................................................................................6 2.2.1多用戶在線方案.....................................................................................................................6 2.2.2 系統(tǒng)功能................................................................................................................................6 第3章 系統(tǒng)實(shí)施....................................................................................................................................6 3.1聊天室窗口....................................................................................................................................6 3.2 建立客戶端窗口...........................................................................................................................8 3.3 內(nèi)嵌“私聊”窗口.......................................................................................................................9 3.4客服端類繼承客戶端窗口類,并內(nèi)嵌私聊程序......................................................................10 第4章 測試..........................................................................................................................................15 4.1 測試環(huán)境與使用方法.................................................................................................................15 4.2 功能測試.....................................................................................................................................15 4.2.1聊天室窗口...........................................................................................................................15 4.2.2 客戶端窗口..........................................................................................................................16
4.2.3 內(nèi)嵌“私聊”窗口..........................................................................................................................16
參考文獻(xiàn)................................................................................................................................................16
第1章 引言
1.1 背景
網(wǎng)絡(luò)聊天室通常直稱聊天室,是一種人們可以在線交談的網(wǎng)絡(luò)論壇,在同一聊天室的人們通過廣播消息進(jìn)行實(shí)時(shí)交談。聊天室可以建立在即時(shí)通訊軟件(如MSN Messenger、QQ)、P2P軟件、萬維網(wǎng)(如 Halapo,Meebo)等基礎(chǔ)上,萬維網(wǎng)方式更為普通和種類繁多,交談的手段不局限于文本,更包括語音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網(wǎng)人可以實(shí)時(shí)地廣播和閱讀公開消息。一般情況下,與其它網(wǎng)絡(luò)論壇、即時(shí)通訊不同的是,聊天室不保存聊天記錄。
1.2 相關(guān)技術(shù) 1.2.1 JAVA概述
Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語言和java平臺(即JavaSE, JavaEE, JavaME)的總稱。Java 技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺、科學(xué)超級計(jì)算機(jī)、移動電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。在全球云計(jì)算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。
1.2.2 Socket Socket是java中需一要編寫較低層次的網(wǎng)絡(luò)通信程序(例如Cljent/server應(yīng)用程序)時(shí)提供的一種通訊機(jī)制。Socket是兩個(gè)程序進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通信的端點(diǎn),一般 由一個(gè)地址加上一個(gè)端口號來標(biāo)一識。每個(gè)服務(wù)程序都在一個(gè)眾所周知的端口上提供服 務(wù),而想使用服務(wù)的客戶端程序則需要連接該端口。通過Socket的數(shù)據(jù)是原始字節(jié)流信 息,通信雙方必須根據(jù)約定的協(xié)議對數(shù)據(jù)進(jìn)行處理與解釋。
Socket通信機(jī)制提供了兩種通信.方式:有連接方式(TCP)和無連接方式(UDP數(shù)
據(jù)報(bào))。有連接方式中,通信雙方在開始時(shí)必須進(jìn)行一次連接過程,建立一條通信鏈路。通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。無連接力一式中,通信雙方不存在一個(gè)連 接過程,一次網(wǎng)絡(luò)I/O以一個(gè)數(shù)據(jù)報(bào)形式進(jìn)行,而每次網(wǎng)絡(luò)I /O可以和不同.主機(jī)的不 同進(jìn)程進(jìn)行。無連接方式開銷小于有連接方式,但是所提供的數(shù)據(jù)傳輸服務(wù)不可靠,不 能保證數(shù)據(jù)報(bào)一定到達(dá)目的地”」·。
JAVA的有連接通信采用流式I/O模式。Socket是兩個(gè)進(jìn)程間通信鏈的端點(diǎn),每個(gè) Sockct有兩個(gè)流:一個(gè)輸入流和一個(gè)輸出流。只要向Sockct的輸出流寫,一個(gè)進(jìn)程就可 以通過網(wǎng)絡(luò)連接向其他進(jìn)程發(fā)送數(shù)據(jù);同樣,通過讀Sockt的輸入流,就可以讀取傳輸 來的數(shù)據(jù)。
有連接通信一般要經(jīng)歷以下四個(gè)基本步驟ii
(1)創(chuàng)建Sockct,建立連接;
(2)打開連接到Sockct的輸入/輸出流;
(3)按照一定的一腳議對Socket進(jìn)行讀/寫操作;
(4)關(guān)閉Socket。
第(3)步是程序員用來調(diào)用Socket和實(shí)現(xiàn)程序功能的關(guān)鍵步驟,其他三步在各種 程序中基本相同。
1.2.3 TCP 三次握手
TCP協(xié)議通過三個(gè)報(bào)文段完成連接的建立,這個(gè)過程稱為三次握手(three-way handshake),過程如下圖所示。
1.3 術(shù)語
暫無
第2章 需求分析與系統(tǒng)設(shè)計(jì)
2.1 需求分析
從技術(shù)發(fā)面來看,Java語言的優(yōu)點(diǎn)一要表現(xiàn)在:簡.單、面向?qū)ο?、多線程、安全性 等方面。1.簡單性
Java與C++語言灰常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對 必要的功能,如頭文件、頂處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動強(qiáng)迫同型。Java實(shí)現(xiàn)了自動的垃圾收集,簡化了內(nèi)存管理的一作。這使程序一設(shè)計(jì)更加簡便,同時(shí)減少了出錯的可能。2.面向?qū)ο?/p>
Java提供了簡單的類機(jī)制和動態(tài)的構(gòu)架模型。對象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機(jī)制,子類可以使用或重新定義父類或超類所提供的一方法,從而既實(shí)現(xiàn)了代碼的復(fù)用,又提供了一種動態(tài)的解決方案。
Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語一言,它除了數(shù)組、布爾和字符二個(gè)基本數(shù)據(jù)類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,Java程序在運(yùn)行時(shí)必須先創(chuàng)建一個(gè)類的實(shí)例,然后才能提交運(yùn)行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的 單重繼承,即每個(gè)類只能從一個(gè)類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)界面,利用界面可以得到多重繼承的許多優(yōu)點(diǎn)而又沒有多重繼承的問題。3.多線程
多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會由于一處等待影響其他部分,這樣容.易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作。
Java程序可以有多個(gè)執(zhí)行線程,如可以讓一個(gè)線程進(jìn)行復(fù)雜的計(jì)算,而讓另一個(gè)線 程與用戶進(jìn)行交互,這樣用戶可以在不中斷計(jì)算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率。4.安全性
Java不支持指針,一切對內(nèi)存的訪問都必須通過對象的實(shí)例變量來實(shí)現(xiàn),這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯誤。2.2 系統(tǒng)設(shè)計(jì) 2.2.1多用戶在線方案 2.2.2 系統(tǒng)功能
聊天室程序通常需要完成以下一些基本功能:
(I)登錄聊天室;
(2)啟動服務(wù)器;
(3)關(guān)閉服務(wù)器;
(4)用戶之間的聊天;
(5)退出聊天室。
本系統(tǒng)其體功能需求如下:
(1)聊天室管理員經(jīng)登錄界面登錄到管理界而,即系統(tǒng)的服務(wù)器端。用戶經(jīng)登錄界而 都進(jìn)入聊天大廳。
(2)不論是管理員還是用戶都需一要在登錄界面輸入正確的用戶名和密碼后才可以登錄 到各自的界面中去。
(3)系統(tǒng)的兩個(gè)主要界面都是為方便管理員和用戶操作的。首先,管理員進(jìn)入到管理 界而后可以方便的啟動/停止服務(wù)器,看到在線用戶的信息和聊人信息、。用戶進(jìn)入到聊天 大廳中可以聊天,查看服務(wù)器狀態(tài)。
(4)一個(gè)用戶退出聊天室對其他用戶不能產(chǎn)生影響,而服務(wù)器斷開與客戶端的連接則所有的用戶都失去與服務(wù)器的連接。
(5)用戶的聊天信息錄入,重寫,發(fā)送,接收方便,快捷。
(6)服務(wù)器狀態(tài),聊天信息和在線用戶人數(shù)及時(shí)刷新。
(7)聊天室系統(tǒng)運(yùn)行穩(wěn)定、安全性高、性能可靠。
第3章 系統(tǒng)實(shí)施
3.1聊天室窗口
建立服務(wù)端窗口類:窗口程序如下 import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.List;import java.awt.TextArea;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class chatroomW { JFrame f=new JFrame(“局域網(wǎng)聊天室”);JLabel label1=new JLabel(“端口”);JLabel label2=new JLabel(“發(fā)送”);Button button1=new Button(“啟動服務(wù)”);Button button2=new Button(“發(fā)送”);Button button3=new Button(“刷新用戶列表”);JTextField text1=new JTextField(5);JTextField text2=new JTextField(25);TextArea area1=new TextArea(26,84);List userList=new List(27);JScrollPane scro1,scro2;public chatroomW(){
chat();} public void chat(){
area1.setBackground(new Color(204,255,255));
area1.setForeground(Color.black);
userList.setBackground(Color.gray);
userList.setForeground(Color.white);
f.setLayout(new FlowLayout());f.add(area1);f.add(userList);f.add(label1);f.add(text1);f.add(button1);f.add(text2);f.add(button2);f.add(button3);
f.setBounds(300,200,750,485);
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
area1.setEditable(false);text1.setText(“10000”);
myEvent();
} public static void main(String args[]){
new chatroomW();} public void myEvent(){} }
3.2 建立客戶端窗口
import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;
import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextField;
public class ClientW {
JFrame f=new JFrame(“聊天室”);JScrollPane js;TextArea area=new TextArea(19,67);JTextField text1=new JTextField(12);JTextField text2=new JTextField(5);JTextField text3=new JTextField(5);JTextField text4=new JTextField(20);JButton button1=new JButton(“連接”);JButton button2=new JButton(“發(fā)送”);JButton button3=new JButton(“私聊”);JLabel label1=new JLabel(“服務(wù)器地址”);JLabel label2=new JLabel(“服務(wù)器端口”);JLabel label3=new JLabel(“昵稱”);public ClientW(){ } public void chat(){
area.setBackground(new Color(204,255,255));area.setForeground(Color.black);f.setLayout(new FlowLayout());f.setBounds(300,200,500,410);f.add(label1);f.add(text1);f.add(label2);chat();//
}
} f.add(text2);f.add(button1);f.add(area);f.add(label3);f.add(text3);f.add(text4);f.add(button2);f.add(button3);f.setVisible(true);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setResizable(false);area.setEditable(false);text2.setText(“10000”);text4.setText(null);myEvent();public void myEvent(){} public static void main(String args[]){ } new ClientW();
3.3 內(nèi)嵌“私聊”窗口
class netchat{ JFrame f=new JFrame(“私聊”);JLabel label1,label2,label3;Button button1,button2;JTextField text1,text2,text3,text4;TextArea textarea;
f.setLayout(new FlowLayout());f.setBounds(300,200,400,310);//設(shè)置窗口大小和位置; label1=new JLabel(“對方主機(jī)”);label2=new JLabel(“本地端口”);label3=new JLabel(“對方端口”);button1=new Button(“連接”);button2=new Button(“發(fā)送”);text1=new JTextField(7);text2=new JTextField(3);text3=new JTextField(3);public netchat(){ f.setResizable(false);//讓窗口大小固定;
// 閉;
} text4=new JTextField(20);textarea=new TextArea(13,53);textarea.setEditable(false);textarea.setBackground(new Color(204,250,255));f.add(label1);f.add(text1);f.add(label2);f.add(text2);f.add(label3);f.add(text3);f.add(button1);f.add(textarea);f.add(text4);f.add(button2);f.setVisible(true);f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關(guān)閉窗口程序同時(shí)關(guān)myEvent();
3.4客服端類繼承客戶端窗口類,并內(nèi)嵌私聊程序
import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.Socket;
import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;
public class Client extends ClientW{ Socket s=null;public Client(){} public void myEvent(){
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
s=new Socket(text1.getText().toString(),Integer.parseInt(text2.getText()));
new Thread(new LinkC()).start();
area.append(“[系統(tǒng)消息]:連接成功n”);
}catch(Exception ex){area.append(“[系統(tǒng)消息]:連接失敗n”);}
}
});
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new SentC();
}
});
button3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new netchat();
}
});} public static void main(String args[]){
new Client();}
class LinkC implements Runnable{
public void run(){
try{
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg=null;
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(text3.getText());
while(true){
try{
while((msg=bufIn.readLine())!=null){
area.append(msg+“n”);
}
}catch(Exception ex){break;}
}
}catch(Exception e){}
}
}
class SentC {
public SentC(){
try{
PrintStream ps=new PrintStream(s.getOutputStream());
if(!text4.getText().equals(“")){
ps.println(text4.getText());//
area.append(text4.getText());//服務(wù)器自動會返回
text4.setText(”“);
}
}catch(Exception e){}
}
} //私聊類
class netchat{
JFrame f=new JFrame(”私聊“);
JLabel label1,label2,label3;
Button button1,button2;
JTextField text1,text2,text3,text4;
TextArea textarea;
public netchat(){
f.setLayout(new FlowLayout());
f.setBounds(300,200,400,310);
//設(shè)置窗口大小和位置;
f.setResizable(false);
//讓窗口大小固定;
label1=new JLabel(”對方主機(jī)“);
label2=new JLabel(”本地端口“);
label3=new JLabel(”對方端口“);
button1=new Button(”連接“);
button2=new Button(”發(fā)送“);
text1=new JTextField(7);
text2=new JTextField(3);
text3=new JTextField(3);
text4=new JTextField(20);
textarea=new TextArea(13,53);
textarea.setEditable(false);
textarea.setBackground(new Color(204,250,255));
text2.setText(”10000“);
text3.setText(”10000“);
f.add(label1);
f.add(text1);
f.add(label2);
f.add(text2);
f.add(label3);
f.add(text3);
f.add(button1);
f.add(textarea);
f.add(text4);
f.add(button2);
f.setVisible(true);//
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);//關(guān)閉窗口程序同時(shí)關(guān)閉;
myEvent();
}
public void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
try{
DatagramSocket ds=new DatagramSocket();
byte[] buf=”對方已下線“.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
ds.send(dp);
ds.close();
}catch(Exception ex){}
}
});
button2.addActionListener(new ActionListener()//事件源是button2
{
public void actionPerformed(ActionEvent e)
{
if(!text4.getText().equals(”“))
new Thread(new Send()).start();
}
});
button1.addActionListener(new ActionListener()//事件源是button1
{
public void actionPerformed(ActionEvent e)
{
new Thread(new Rece()).start();
}
});
}
class Send implements Runnable{
public void run(){ try{UdpSend();}catch(Exception e){textarea.append(”[系統(tǒng)消息]:發(fā)送失敗n“);}}
public void UdpSend()throws Exception{
DatagramSocket ds=new DatagramSocket();
byte[] buf=text4.getText().getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(text1.getText()),Integer.parseInt(text3.getText()));
textarea.append(”[我]: “+text4.getText()+”n“);
text4.setText(”“);
ds.send(dp);
ds.close();
}
}
class Rece implements Runnable{
int index=0;
public void run(){
try{
UdpRece();
}catch(Exception e){
textarea.append(”[系統(tǒng)消息]:連接失敗n“);
}
}
public void UdpRece()throws Exception{
while(true){
DatagramSocket ds=new DatagramSocket(Integer.parseInt(text2.getText()));
if(index==0){textarea.append(”[系統(tǒng)消息]:連接成功n“);}
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String data=new String(dp.getData(),0,dp.getLength());
textarea.append(dp.getAddress()+” “+data+”n");
index++;
ds.close();
}
}
}
} } 第4章 測試
4.1 測試環(huán)境與使用方法
測試環(huán)境:測試環(huán)境:電腦安裝Java JDK 服務(wù)器端使用方法:打開服務(wù)啟動,點(diǎn)擊“啟動服務(wù)”,提示“啟動服務(wù)成功”表示正常啟動。否則,先關(guān)閉服務(wù)端,再重新打開,啟動服務(wù)??蛻舳耸褂梅椒ǎ捍蜷_客戶端,輸入“服務(wù)器地址”,點(diǎn)擊“連接”,如成功連接系統(tǒng)提示“成功連接”,并收到服務(wù)端返回的“歡迎”信息,否則關(guān)閉并重新啟動。
私聊功能使用方法:點(diǎn)擊面板上的“私聊”按鈕,輸入對方的IP地址,點(diǎn)擊連接,如連接成功系統(tǒng)會提示“連接成功”。當(dāng)對方斷開時(shí)會收到“對方已下線”提示。如果要同時(shí)跟多人私聊,則要改變本地端口值,并告知對方。
4.2 功能測試 4.2.1聊天室窗口
4.2.2 客戶端窗口
4.2.3 內(nèi)嵌“私聊”窗口
參考文獻(xiàn)
用JAVA程序?qū)崿F(xiàn)參考文獻(xiàn)的錄入與生成 劉瑋瑋 2009 《福建電腦》
基于Java移動Agent系統(tǒng)的安全參考模型 周屹 2007 《黑龍江工程學(xué)院學(xué)報(bào)》
嵌入式Java虛擬機(jī)的性能優(yōu)化技術(shù) 李允 2004 《計(jì)算機(jī)工程》
第四篇:java局域聊天室實(shí)踐總結(jié)
河北科技師范學(xué)院
JAVA程序設(shè)計(jì)課程設(shè)計(jì)
個(gè)人實(shí)習(xí)總結(jié)
實(shí)習(xí)類型 課程設(shè)計(jì) 實(shí)習(xí)單位 指導(dǎo)教師 所在院(系)信息技術(shù)系 班 級 姓 名 學(xué)
號
_
一、實(shí)習(xí)時(shí)間和地點(diǎn)
時(shí)間:2015.3.17-2015.4.14 地點(diǎn):F310、F311
二、實(shí)習(xí)的內(nèi)容
我所開發(fā)的系統(tǒng)是:局域網(wǎng)聊天系統(tǒng)。系統(tǒng)功能簡要說明如下:
該程序?qū)崿F(xiàn)局域網(wǎng)內(nèi)的聊天功能,包括服務(wù)器端程序和客戶端程序兩部分。
1、服務(wù)器:負(fù)責(zé)處理各個(gè)客戶端的信息,并負(fù)責(zé)將信息進(jìn)行轉(zhuǎn)發(fā)。①服務(wù)器主要負(fù)責(zé)響應(yīng)客戶端的的各種信息,包括鏈接服務(wù)器,用戶信息發(fā)送,各個(gè)客戶端的信息相互轉(zhuǎn)發(fā)。②服務(wù)器的實(shí)現(xiàn)有Server類,Server類主要是進(jìn)行初始化的工作
2、客戶端:用戶使用界面,負(fù)責(zé)接受信息以及與服務(wù)器進(jìn)行通信。①客戶端負(fù)責(zé)為用戶提供聊天界面,將信息發(fā)送至服務(wù)器,接受服務(wù)器的反饋信息等一系列的工作。②客戶端的實(shí)現(xiàn)有Client類,Client類負(fù)責(zé)與服務(wù)器,其它客戶端進(jìn)行通信。
1.連接:點(diǎn)擊“連接”按鈕之后將信息發(fā)送到服務(wù)器端,服務(wù)器端創(chuàng)建相應(yīng)的連接,并將更新后的用戶列表發(fā)送給所有用戶。2.發(fā)送:根據(jù)發(fā)送者、發(fā)送對象、發(fā)送的話創(chuàng)建一個(gè)字段發(fā)送到服務(wù)器端。3.清空:清空客戶端接收信息聊天對話框。4.私聊TA:選擇在線主機(jī)ip,根據(jù)ip地址發(fā)送一個(gè)私密聊天請求到服務(wù)器,服務(wù)器選擇相
應(yīng)的地址進(jìn)行信息發(fā)送。本程序可以有多個(gè)用戶,只需在一臺服務(wù)器上運(yùn)行服務(wù)端程序,所有的用戶連接上了之后就可以正常通信。
人們?nèi)粘I钪性絹碓蕉嗟厥褂昧奶焓疫@項(xiàng)應(yīng)用來為自己的工作和學(xué)習(xí)服務(wù)。一個(gè)操作簡單,界面友好、運(yùn)行穩(wěn)定的聊天室對于小型局域網(wǎng)的用戶可以起到很好的交流作用。所謂聊天室就是一個(gè)可以讓許多用戶同時(shí)互相通信的網(wǎng)上園地,個(gè)人用戶可以通過聊天室將自己融入整個(gè)主流社會中。因此我們這個(gè)聊天室選擇了簡潔的界面搭建。因?yàn)橹皩W(xué)過JFrame類的使用,所以界面搭建部分代碼如下:
public class TCPClient extends JFrame {
public static String olip;private static final long serialVersionUID = 1L;JTextArea jtaContent = new JTextArea();JTextField jtaInstant = new JTextField();JButton jbSend = new JButton(“發(fā)送”);JButton jbConnect = new JButton(“連接”);JButton jbClear = new JButton(“清空”);JLabel jlTip=new JLabel(“在線主機(jī)”);JButton jbPChat=new JButton(“私聊TA”);JPanel jpBtns = new JPanel();JPanel jpContact=new JPanel();jtaContent.setEditable(false);jpBtns.setLayout(new GridLayout(1, 3, 5, 5));jpBtns.add(jbConnect);jpBtns.add(jbSend);jpBtns.add(jbClear);jpBtns.setBounds(0, 375, 350, 30);JScrollPane jspText=new JScrollPane(jtaInstant);jspText.setBounds(0, 310, 350, 65);JScrollPane jspContactOL=new JScrollPane(jcbContact);JScrollPane jspContent=new JScrollPane(jtaContent);jspContent.setBounds(0, 0, 350, 300);jpContact.setLayout(new GridLayout(5, 5, 1, 3));jpContact.add(jlTip);jpContact.add(jspContactOL);jpContact.add(jbPChat);jpContact.setBounds(350, 0, 135, 220);public void launchFrame(){
add(jpContact);add(jpBtns);add(jspText);add(jspContent);setLayout(null);setSize(500, 450);setLocation(100, 100);setTitle(“Chat Client”);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);由于本人學(xué)習(xí)的java不是特別扎實(shí),所以界面的設(shè)計(jì)代碼經(jīng)過參考反復(fù)實(shí)驗(yàn)才達(dá)到要求。界面完成后才發(fā)現(xiàn)真正的挑戰(zhàn)剛剛開始。我們需要得到本機(jī)ip地址并傳送至服務(wù)器,部分代碼如下:
InetAddress
myIP;myIP=InetAddress.getLocalHost();s = new Socket(myIP.getHostAddress(), 9402);然后我們發(fā)送IP地址,其他客戶端收到此地址時(shí)會判別,判別為IP地址,其它客戶端會將這一IP地址規(guī)劃為在線用戶:
InetAddressmyIP;myIP=InetAddress.getLocalHost();strIP=myIP.getHostAddress();dos.writeUTF(“a”+strIP);我們還設(shè)計(jì)了一個(gè)私聊功能,所以就需要實(shí)現(xiàn)事件的監(jiān)聽: Timer tm1=newTimer(1000,newActionListener(){ @Override public voidactionPerformed(ActionEvent e){ tm3.stop();jbPChat.setText(“通知”);tm2.start();}});Timer tm2=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm1.stop();jbPChat.setText(“有私聊消息”);tm3.start();}});
Timer tm3=new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ tm2.stop();jbPChat.setText(“請查收”);tm1.start();}});這樣,當(dāng)有私聊信息請求傳送過來時(shí)通過這些提醒就可以實(shí)現(xiàn)私聊功能。起初我們有這些功能的想法,覺得通過網(wǎng)絡(luò)書籍能夠很方便的查找到??墒菍?shí)際操作實(shí)驗(yàn)中遇到了不少困難。比如這個(gè)私聊功能的實(shí)現(xiàn)。剛開始連接成功后選擇私聊對象,我們決定以IP地址為依據(jù)。加入選擇IP地址功能后點(diǎn)擊私聊,發(fā)現(xiàn)客戶端可以收到私聊提示,可是卻收不到具體的文字信息。為此我們查找了大量信息,終于成功的實(shí)現(xiàn)了私聊功能。
后來我想,能不能讓服務(wù)器端連接數(shù)據(jù)庫。在客戶端設(shè)置一個(gè)注冊界面,讓用戶更具體化,這樣識別身份時(shí)就不用再使用IP地址??蛻舳擞脩舻淖孕畔4嬖跀?shù)據(jù)庫里,下次登錄客戶端就用屬于個(gè)人的ID和密碼。首先要實(shí)現(xiàn)用戶的注冊:
public void register(){ String strServerIp = txtHost.getText();String strServerPort=txtPort.getText();this.dispose();new Register(strServerIp,strServerPort);然后向服務(wù)器端發(fā)送“注冊”的命令。服務(wù)器處理接收到的命令為“注冊”時(shí)調(diào)用函數(shù),合法注冊后,向客戶端發(fā)送“注冊成功”的消息,并斷開連接。由于時(shí)間關(guān)系,數(shù)據(jù)庫未能完成,希望下次有機(jī)會可以完善。
三、心得體會
1.成績與收獲
這次軟件開發(fā)讓我學(xué)到了很多知識。只是只有轉(zhuǎn)變成實(shí)際而有用的東西才能顯現(xiàn)出它的價(jià)值。學(xué)習(xí)不只是學(xué)習(xí)理論只是,更重要的是自己的動手操作能力。這個(gè)軟件工程的項(xiàng)目實(shí)戰(zhàn)讓我真切感受到軟件開發(fā)的全過程,這讓我明白軟件的開發(fā)是一門藝術(shù),而不是代碼的簡單疊加。這需要一個(gè)小組的共同努力。這次開發(fā)讓我跟深入的去思考了一個(gè)軟件的構(gòu)成與實(shí)現(xiàn)。以前用通訊軟件是從未思考過如何實(shí)現(xiàn)它的功能,等自己來做是才發(fā)現(xiàn)里面要考慮的東西很多。在實(shí)踐中,我也學(xué)到了很多java編程方面的知識。2.問題與不足
由于java編程運(yùn)用的不是特別熟練,加上時(shí)間問題,我們的程序還有很多不盡
如人意的地方。例如:很多功能沒有實(shí)現(xiàn)(語音視頻,文件傳輸,個(gè)人信息等等),并且界面比較粗糙。這些都是以后需要努力的地方。水平所限,致使程序?qū)崿F(xiàn)的功能在方法上也許不是很完美,但我以后會多向老師請教,自己也要加強(qiáng)對java的學(xué)習(xí)。努力進(jìn)一步提高自己的編程水平。
第五篇:JAVA課程設(shè)計(jì)之簡單聊天室
課程設(shè)計(jì)報(bào)告
課程名稱 課程代碼 題
目 年級/專業(yè)/班 學(xué)生姓名 學(xué)
號 指導(dǎo)老師 開題時(shí)間 完成時(shí)間 Java程序設(shè)計(jì)
簡單聊天室
孟青 09308910203
I
: : : : : : : : :
目
錄
摘要..............................................................................................................................................................I 1 引言...........................................................................................................................................................1 2 設(shè)計(jì)任務(wù)與目的.......................................................................................................................................1 3 需求分析...................................................................................................................................................1 3.1 系統(tǒng)用例圖............................................................................................................................1 3.2 主要用例分析........................................................................................................................2 4 系統(tǒng)設(shè)計(jì).................................................................................................................................................3 4.1 總體設(shè)計(jì)........................................................................................................................................3 4.1.1 系統(tǒng)類圖.............................................................................................................................3 4.1.2 主要時(shí)序圖.........................................................................................................................6 4.2 詳細(xì)設(shè)計(jì)........................................................................................................................................8 4.2.1 ChatServer類......................................................................................................................9 4.2.2 ServerListen類..................................................................................................................10 4.2.3 ServerReceive類...............................................................................................................10 4.2.4 PortConf類.......................................................................................................................11 4.2.5 Help類..............................................................................................................................11 4.2.6 UserLinkList類.................................................................................................................11 4.2.7 Node類.............................................................................................................................12 4.2.8 ChatClient類.....................................................................................................................13 4.2.9 ConnectConf類.................................................................................................................15 4.2.10 UserConf類....................................................................................................................15 4.2.11 Help類............................................................................................................................16 4.2.12 ClientReceive類.............................................................................................................16 5 系統(tǒng)實(shí)現(xiàn).................................................................................................................................................16 5.1 系統(tǒng)主要用例的實(shí)現(xiàn)..................................................................................................................16 5.1.1 聊天室服務(wù)端用例運(yùn)行效果...........................................................................................17 5.1.2 聊天室客戶端用例運(yùn)行效果...........................................................................................18 5.2 系統(tǒng)發(fā)布與運(yùn)行..........................................................................................................................18 5.2.1 系統(tǒng)打包...........................................................................................................................18 5.2.2 系統(tǒng)發(fā)布與運(yùn)行...............................................................................................................18 6 結(jié)束語.....................................................................................................................................................19 參考文獻(xiàn).......................................................................................................................................................19 致謝...............................................................................................................................................................19 附錄A:系統(tǒng)源程序...................................................................................................................................20
1、ChatServer類..........................................................................................................................20
2、ServerListen類.......................................................................................................................31
3、ServerReceive類.....................................................................................................................32
4、UserLinkList類.......................................................................................................................36
5、Node類...................................................................................................................................39
I
6、PortConf類.............................................................................................................................40
7、Help類....................................................................................................................................42
8、ChatClient類...........................................................................................................................44
9、ClientReceive類.....................................................................................................................56
10、ConnectConf類.....................................................................................................................58
11、UserConf類...........................................................................................................................61
12、Help類..................................................................................................................................63 附錄B:編碼規(guī)范.......................................................................................................................................66
II
摘要
本課程設(shè)計(jì)我們通過聊天室的代碼實(shí)現(xiàn),體會到將理論知識與具體實(shí)現(xiàn)相結(jié)合,鞏固Java相關(guān)方法。聊天室共分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負(fù)責(zé)偵聽客戶端發(fā)來的消息,客戶端需登陸到服務(wù)器才可以實(shí)現(xiàn)正常的聊天功能。本聊天系統(tǒng)以聊天交流為主,為廣大用戶提供一個(gè)借助網(wǎng)絡(luò)進(jìn)行人際交往的平臺,也是網(wǎng)絡(luò)與現(xiàn)實(shí)最貼近的實(shí)用型網(wǎng)站。
關(guān)鍵詞:(3-5個(gè),每個(gè)之間用分號隔開)聊天室;多線程;C/S模式
Abstract
The course design our chat room through the code, understand the theoretical knowledge and practical realization of the combination, the consolidation of java-related methods.Chat client and the server is divided into two parts, the client, server-side program is mainly responsible for listening client sent the news to be landing the client to the server will be realized only if the normal chat.The chat system to exchange-based chat, in order to provide customers with a network platform for interpersonal communication, but also network with the reality of the practical is the closest site.Key words: Chat rooms, multi-threaded, C / S mode I
簡單聊天室 引言
隨著互聯(lián)網(wǎng)逐步普及,人們的生活和工作也越來越離不開信息網(wǎng)絡(luò)的支持,而聊天室是人們最常見,最直接的網(wǎng)上交流的方式。本聊天系統(tǒng)以聊天交流為主,為廣大用戶提供一個(gè)借助網(wǎng)絡(luò)進(jìn)行人際交往的平臺,也是網(wǎng)絡(luò)與現(xiàn)實(shí)最貼近的實(shí)用型網(wǎng)站。本文所介紹的網(wǎng)絡(luò)聊天系統(tǒng)是基于開放的JAVA應(yīng)用程序開發(fā)設(shè)計(jì)的,其主要特性是能動態(tài)、實(shí)時(shí)的完成信息的傳遞,且具有高效的交互性,更有效的處理客戶請求,且具有脫離數(shù)據(jù)庫技術(shù)方法,易于維護(hù)和更新的特點(diǎn)。設(shè)計(jì)任務(wù)與目的
本聊天室程序基于C/S模式,聊天室共分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負(fù)責(zé)偵聽客戶端發(fā)來的消息,客戶端需登陸到服務(wù)器才可以實(shí)現(xiàn)正常的聊天功能。
通過本項(xiàng)目的設(shè)計(jì)實(shí)踐,力求熟練掌握GUI程序設(shè)計(jì)、多線程技術(shù)、基于TCP的Socket通信編程。需求分析
本系統(tǒng)所要實(shí)現(xiàn)的主要功能是為廣大用戶提供一個(gè)借助網(wǎng)絡(luò)進(jìn)行人際交往的平臺。因?yàn)榉?wù)端采用多線程,所以性能有很大提升。因?yàn)榉?wù)端和客戶端之間采用TCP協(xié)議進(jìn)行網(wǎng)絡(luò)通信,建立的是可靠的、端到端的網(wǎng)絡(luò)連接,所以可靠性和安全性都很好。
3.1 系統(tǒng)用例圖
圖3-1 系統(tǒng)用例圖
3.2 主要用例分析 服務(wù)器端的主要功能如下:
1,在特定端口上進(jìn)行偵聽,等待客戶端連接
2,用戶可以配置服務(wù)端的偵聽端口,默認(rèn)端口為8888.3,向已經(jīng)連接到服務(wù)端的用戶發(fā)送系統(tǒng)消息。4,統(tǒng)計(jì)在線人數(shù)
5,當(dāng)停止服務(wù)時(shí),斷開所有的用戶連接??蛻舳说闹饕δ苋缦拢?/p>
1,連接到已經(jīng)開啟的聊天服務(wù)的服務(wù)端。
2,用戶可以配置要連接服務(wù)器端的IP地址和端口號。3,用戶可以配置連接后顯示的用戶名。
4,當(dāng)服務(wù)器端開啟的時(shí)候,用戶可以隨時(shí)登錄和注銷。5,用戶可以向所有人或者某一個(gè)人發(fā)送消息。
系統(tǒng)設(shè)計(jì) 4.1 總體設(shè)計(jì)
4.1.1 系統(tǒng)類圖
圖4-1-1 服務(wù)端系統(tǒng)類圖
圖4-1-2 客戶端系統(tǒng)類圖
4.1.2 主要時(shí)序圖
圖4-2-1 服務(wù)端主要時(shí)序類圖
圖4-2-2 客戶端主要時(shí)序類圖
4.2 詳細(xì)設(shè)計(jì)
聊天室服務(wù)器端的設(shè)計(jì)
聊天室服務(wù)端主要包括7個(gè)類,放在server包中:
4.2.1 ChatServer類
圖4-3 ChatServer類圖
ChatServer.java 包含名為ChatServer的public類,其主要功能為定義服務(wù)器端的界面,添加時(shí)間
監(jiān)聽與時(shí)間處理。調(diào)用ServerListen類來實(shí)現(xiàn)服務(wù)端用戶上線與下線的監(jiān)聽,調(diào)用ServerListen來實(shí)現(xiàn)服務(wù)器端的消息收發(fā)。
4.2.2 ServerListen類
圖4-4 ServerListen類圖
ServerListen.java 該類實(shí)現(xiàn)服務(wù)器用戶上線與下線的監(jiān)聽。該類對用戶上線下線的監(jiān)聽是通過調(diào)用用戶鏈表類(UserLinkList)來實(shí)現(xiàn)的。當(dāng)用戶上線與下線情況發(fā)生變化時(shí),該類會對主類的界面進(jìn)行相應(yīng)的修改。
4.2.3 ServerReceive類
圖4-5 ServerReceive類圖
ServerReceive.java 該類是實(shí)現(xiàn)服務(wù)器消息收發(fā)的類,該類分別定義了向某用戶及所有人發(fā)送消息的方法,發(fā)送的消息會顯示在主界面類的街面上。
4.2.4 PortConf類
圖4-6 PortConf類圖
PortConf.java
該類繼承自Jdialog,是用戶對服務(wù)器端監(jiān)聽端口進(jìn)行修改配置的類。
4.2.5 Help類
圖4-7 Help類圖
Help.java
服務(wù)端程序幫助類。
4.2.6 UserLinkList類
圖4-8 UserLinkList類圖
UserLinkList.java
用戶鏈表節(jié)點(diǎn)的具體實(shí)現(xiàn)類。該類通過構(gòu)造函數(shù)構(gòu)造用戶鏈表,定義了添加用戶、刪除用戶、返回用戶數(shù)、根據(jù)用戶名查找用戶、根據(jù)索引查找用戶這5個(gè)方法。
4.2.7 Node類
圖4-9 Node類圖
Node.java 用戶鏈表的節(jié)點(diǎn)類,定義了鏈表中的用戶。該類與前面所講的鏈表節(jié)點(diǎn)Node類的功能相當(dāng)。聊天室客戶端設(shè)計(jì)
聊天室客戶端主要包括5個(gè)類,放在client包中:
4.2.8 ChatClient類
圖4-10 ChatClient類圖
ChatClient.java 包含名為ChatClient的public類,其主要功能為定義客戶端的界面,添加時(shí)間監(jiān)聽與事件處理。該類定義了Connect()與DisConnect()方法實(shí)現(xiàn)與客戶端的連接與斷開連接。當(dāng)?shù)顷懙街付ǖ姆?wù)器時(shí),調(diào)用ClientReceive類實(shí)現(xiàn)消息收發(fā),同時(shí)該類還定義了SendMessaga()方法來其他用戶發(fā)送帶有表情的消息或悄悄話。
4.2.9 ConnectConf類
圖4-11 ConnectConf類圖
ConnectConf.java 該類繼承自Jdialog,是用戶對所有要連接的服務(wù)器IP及監(jiān)聽端口進(jìn)行修改配置的類。
4.2.10 UserConf類
圖4-12 UserConf類圖
UserConf.java
該類繼承自Jdialog,是用戶對鏈接到服務(wù)器時(shí)所顯示的用戶名進(jìn)行修改配置的類。
4.2.11 Help類
圖4-13 Help類圖
Help.java 客戶端程序的幫助類。
4.2.12 ClientReceive類
圖4-14 ClientReceive類圖
ClientReceive.java 該類是實(shí)現(xiàn)服務(wù)器端與客戶端消息收發(fā)的類。系統(tǒng)實(shí)現(xiàn)
5.1 系統(tǒng)主要用例的實(shí)現(xiàn)
5.1.1 聊天室服務(wù)端用例運(yùn)行效果
圖5-1 聊天室服務(wù)端用例運(yùn)行效果圖
5.1.2 聊天室客戶端用例運(yùn)行效果
圖5-2 聊天室客戶端用例運(yùn)行效果圖
5.2 系統(tǒng)發(fā)布與運(yùn)行
5.2.1 系統(tǒng)打包
使用MyEclipse自帶的打包工具分別將server包和client包中的.class文件打成兩個(gè)Jar包:ChatServer.jar和CharClient.jar。
5.2.2 系統(tǒng)發(fā)布與運(yùn)行
將server包和client包中的.class文件打成兩個(gè)Jar包,就可以發(fā)布系統(tǒng)了。直接分別雙擊兩個(gè)Jar包(ChatServer.jar和CharClient.jar),就可以運(yùn)行服務(wù)端和客戶端了。
結(jié)束語
Java面向?qū)ο蟪绦蛟O(shè)計(jì)是一門應(yīng)用廣泛并且實(shí)用性極強(qiáng)的高級程序設(shè)計(jì)語言。通過本次課程設(shè)計(jì),我們對面向?qū)ο蟮幕舅枷胗辛诉M(jìn)一步的理解,對項(xiàng)目的各個(gè)階段的任務(wù)也有了一定的了解。設(shè)計(jì)開始階段必須明確設(shè)計(jì)的目的與需求分析,總體設(shè)計(jì)要全面分析聊天室系統(tǒng)的架構(gòu)。通過這次設(shè)計(jì),使我們認(rèn)識到體系的架構(gòu)是最重要的,只有準(zhǔn)確的系統(tǒng)設(shè)計(jì)、很好的定義各個(gè)模塊及模塊之間的關(guān)系,才能在編碼階段更輕松的的實(shí)現(xiàn)。
通過這次課程設(shè)計(jì),對我們的邏輯思維能力是一個(gè)很大的鍛煉,它不僅加強(qiáng)了我們的系統(tǒng)思考問題的能力,而且還改變了我們以前不好的編程習(xí)慣,雖然花費(fèi)了不少的時(shí)間,但是我們學(xué)到了豐富的知識。
另外,此次課程設(shè)計(jì)也提高了我們的團(tuán)對合作精神,讓我們明白不是不能一個(gè)人能單獨(dú)完成,而是要集思廣益,結(jié)合更多的人的創(chuàng)意思維。讓我們大家深刻的體會到理論與實(shí)際相結(jié)合的重要性與微妙之處。對于不同的想法我們都會集中討論并對好的意見加以借鑒,在這個(gè)討論的過程中,還更正了不少我們各自自身對于某個(gè)知識點(diǎn)的誤區(qū)。
這次程序設(shè)計(jì)也是一個(gè)毅力的考驗(yàn)過程。有時(shí)候往往只是一個(gè)小小的錯誤,卻要花出幾小時(shí)甚至是一兩天的時(shí)間才可能發(fā)現(xiàn)它。所以在這個(gè)過程不能過于急躁,要很有耐心將程序反復(fù)調(diào)試,參考文獻(xiàn)
[1] 張廣彬,孟紅蕊,張永寶.Java課程設(shè)計(jì)案例精編[M].北京:清華大學(xué)出版社,2007,1.[2] 黃曉東.Java課程設(shè)計(jì)案例精編[M].北京:中國水利水電出版社,2004,5.[3] 求是科技.Java信息管理系統(tǒng)開發(fā)實(shí)例導(dǎo)航[M].北京:人民郵電出版社,2005,4.[4] 求是科技.Java數(shù)據(jù)庫系統(tǒng)開發(fā)實(shí)例導(dǎo)航[M].北京:人民郵電出版社,2004,9.[5]廖衛(wèi)東Java程序設(shè)計(jì)實(shí)用指南[M].北京:機(jī)械工業(yè)出版社,2002.1[3] [6]李衛(wèi)華,傅曉東.Java語言基礎(chǔ)及其應(yīng)用[M]北京:中國水利水電出版社,1996[5]
致謝
本次課程由上海杰普公司三為指導(dǎo)老師以及我們?nèi)握n老師郭老師精心輔導(dǎo),讓我們大家深刻的體會到理論與實(shí)際相結(jié)合的重要性與微妙之處。使我們對java有了更深刻的認(rèn)識,產(chǎn)生濃厚的學(xué)習(xí)興趣。我們由衷對他們表示感謝。
附錄A:系統(tǒng)源程序
1、ChatServer類
功能:為定義服務(wù)器端的界面,添加時(shí)間監(jiān)聽與時(shí)間處理。調(diào)用ServerListen類來實(shí)現(xiàn)服務(wù)端用戶上線與下線的監(jiān)聽,調(diào)用ServerListen來實(shí)現(xiàn)服務(wù)器端的消息收發(fā)。代碼:
package server;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.net.*;/* * 聊天服務(wù)端的主框架類 */ public class ChatServer extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;
public static int port = 8888;//服務(wù)端的偵聽端口
ServerSocket serverSocket;//服務(wù)端Socket JComboBox combobox;//選擇發(fā)送消息的接受者
JTextArea messageShow;//服務(wù)端的信息顯示
JScrollPane messageScrollPane;//信息顯示的滾動條
JTextField showStatus;//顯示用戶連接狀態(tài)
JLabel sendToLabel,messageLabel;JTextField sysMessage;//服務(wù)端消息的發(fā)送
JButton sysMessageButton;//服務(wù)端消息的發(fā)送按鈕
UserLinkList userLinkList;//用戶鏈表
//建立菜單欄
JMenuBar jMenuBar = new JMenuBar();//建立菜單組
JMenu serviceMenu = new JMenu(“服務(wù)(V)”);//建立菜單項(xiàng)
JMenuItem portItem = new JMenuItem(“端口設(shè)置(P)”);JMenuItem startItem = new JMenuItem(“啟動服務(wù)(S)”);
JMenuItem stopItem=new JMenuItem(“停止服務(wù)(T)”);JMenuItem exitItem=new JMenuItem(“退出(X)”);
JMenu helpMenu=new JMenu(“幫助(H)”);JMenuItem helpItem=new JMenuItem(“幫助(H)”);//建立工具欄
JToolBar toolBar = new JToolBar();//建立工具欄中的按鈕組件
JButton portSet;//啟動服務(wù)端偵聽 JButton startServer;//啟動服務(wù)端偵聽 JButton stopServer;//關(guān)閉服務(wù)端偵聽 JButton exitButton;//退出按鈕
//框架的大小
Dimension faceSize = new Dimension(400, 600);
ServerListen listenThread;JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;/** * 服務(wù)端構(gòu)造函數(shù) */ public ChatServer(){ init();//初始化程序
//添加框架的關(guān)閉事件處理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//設(shè)置框架的大小
this.setSize(faceSize);//設(shè)置運(yùn)行時(shí)窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(“聊天室服務(wù)端”);//設(shè)置標(biāo)題
setVisible(true);
//為服務(wù)菜單欄設(shè)置熱鍵'V'
serviceMenu.setMnemonic('V');
//為端口設(shè)置快捷鍵為ctrl+p
portItem.setMnemonic('P');
portItem.setAccelerator(KeyEvent.VK_P,InputEvent.CTRL_MASK));
//為啟動服務(wù)快捷鍵為ctrl+s
startItem.setMnemonic('S');
startItem.setAccelerator(KeyEvent.VK_S,InputEvent.CTRL_MASK));
//為端口設(shè)置快捷鍵為ctrl+T
stopItem.setMnemonic('T');
stopItem.setAccelerator(KeyEvent.VK_T,InputEvent.CTRL_MASK));
//為退出設(shè)置快捷鍵為ctrl+x
exitItem.setMnemonic('X');
exitItem.setAccelerator(KeyEvent.VK_X,InputEvent.CTRL_MASK));
//為幫助菜單欄設(shè)置熱鍵'H'
helpMenu.setMnemonic('H');
//為幫助設(shè)置快捷鍵為ctrl+p
helpItem.setMnemonic('H');
helpItem.setAccelerator(KeyEvent.VK_H,InputEvent.CTRL_MASK));
}
/** * 程序初始化函數(shù)
*/ public void init(){
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
(KeyStroke.getKeyStroke
//添加菜單欄
serviceMenu.add(portItem);serviceMenu.add(startItem);serviceMenu.add(stopItem);serviceMenu.add(exitItem);jMenuBar.add(serviceMenu);helpMenu.add(helpItem);jMenuBar.add(helpMenu);setJMenuBar(jMenuBar);//初始化按鈕
portSet = new JButton(“端口設(shè)置”);startServer = new JButton(“啟動服務(wù)”);stopServer = new JButton(“停止服務(wù)”);exitButton = new JButton(“退出”);//將按鈕添加到工具欄 toolBar.add(portSet);toolBar.addSeparator();//添加分隔欄 toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();//添加分隔欄 toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);//初始時(shí),令停止服務(wù)按鈕不可用 stopServer.setEnabled(false);stopItem.setEnabled(false);//為菜單欄添加事件監(jiān)聽
portItem.addActionListener(this);startItem.addActionListener(this);stopItem.addActionListener(this);exitItem.addActionListener(this);helpItem.addActionListener(this);
//添加按鈕的事件偵聽
portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this);
combobox = new JComboBox();combobox.insertItemAt(“所有人”,0);combobox.setSelectedIndex(0);23
messageShow = new JTextArea();messageShow.setEditable(false);//添加滾動條
messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400));messageScrollPane.revalidate();
showStatus = new JTextField(35);showStatus.setEditable(false);
sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new JButton();sysMessageButton.setText(“發(fā)送”);//添加系統(tǒng)消息的事件偵聽
sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(“發(fā)送至:”);messageLabel = new JLabel(“發(fā)送消息:”);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel(“ ”);girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;24
girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 4;girdBagCon.gridwidth = 3;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);
//關(guān)閉程序時(shí)的操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
stopService();25
}
System.exit(0);
} });/** * 事件處理 */ public void actionPerformed(ActionEvent e){ Object obj = e.getSource();if(obj == startServer || obj == startItem){ //啟動服務(wù)端
startService();} else if(obj == stopServer || obj == stopItem){ //停止服務(wù)端
int j=JOptionPane.showConfirmDialog(this,“真的停止服務(wù)嗎?”,“停止服務(wù)”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
} } else if(obj == portSet || obj == portItem){ //端口設(shè)置
//調(diào)出端口設(shè)置的對話框
PortConf portConf = new PortConf(this);
portConf.setVisible(true);} else if(obj == exitButton || obj == exitItem){ //退出程序
int j=JOptionPane.showConfirmDialog(this,“真的要退出嗎?”,“退出”,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j == JOptionPane.YES_OPTION){
stopService();
System.exit(0);
} } else if(obj == helpItem){ //菜單欄中的幫助
//調(diào)出幫助對話框
Help helpDialog = new Help(this);
helpDialog.setVisible(true);} else if(obj == sysMessage || obj == sysMessageButton){ //發(fā)送系統(tǒng)消息
sendSystemMessage();} } /** * 啟動服務(wù)端 */ public void startService(){ try{
serverSocket = new ServerSocket(port,10);
messageShow.append(“服務(wù)端已經(jīng)啟動,在”+port+“端口偵聽...n”);
startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);
stopServer.setEnabled(true);
stopItem.setEnabled(true);
sysMessage.setEnabled(true);} catch(Exception e){
//System.out.println(e);} userLinkList = new UserLinkList();
listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();} /** * 關(guān)閉服務(wù)端 */ public void stopService(){ try{
//向所有人發(fā)送服務(wù)器關(guān)閉的消息
sendStopToAll();
listenThread.isStop = true;
serverSocket.close();
int count = userLinkList.getCount();
int i =0;27
while(i < count){ Node node = userLinkList.findUser(i);
node.input.close();node.output.close();node.socket.close();
i ++;} stopServer.setEnabled(false);stopItem.setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMessage.setEnabled(false);messageShow.append(“服務(wù)端已經(jīng)關(guān)閉n”);
combobox.removeAllItems();
combobox.addItem(“所有人”);} catch(Exception e){
//System.out.println(e);} } /** * 向所有人發(fā)送服務(wù)器關(guān)閉的消息 */ public void sendStopToAll(){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“服務(wù)關(guān)閉”);28
node.output.flush();
}
catch(Exception e){
//System.out.println(“$$$”+e);
}
i++;} } /** * 向所有人發(fā)送消息 */ public void sendMsgToAll(String msg){ int count = userLinkList.getCount();//用戶總數(shù)
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(“系統(tǒng)信息”);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(“@@@”+e);
}
i++;} sysMessage.setText(“");} /** * 向客戶端用戶發(fā)送消息 */ public void sendSystemMessage(){ 29
} String toSomebody = combobox.getSelectedItem().toString();String message = sysMessage.getText()+ ”n“;
messageShow.append(message);
//向所有人發(fā)送消息
if(toSomebody.equalsIgnoreCase(”所有人“)){ sendMsgToAll(message);} else{ //向某個(gè)用戶發(fā)送消息
Node node = userLinkList.findUser(toSomebody);
try{
node.output.writeObject(”系統(tǒng)信息“);
node.output.flush();
node.output.writeObject(message);
node.output.flush();} catch(Exception e){
//System.out.println(”!!“+e);} sysMessage.setText(”“);//將發(fā)送消息欄的消息清空 } public static void main(String[] args){ try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch(ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(InstantiationException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(IllegalAccessException e){
// TODO Auto-generated catch block
e.printStackTrace();} catch(UnsupportedLookAndFeelException e){
// TODO Auto-generated catch block
e.printStackTrace();} new ChatServer();} 30
}
2、ServerListen類
功能:實(shí)現(xiàn)服務(wù)器用戶上線與下線的監(jiān)聽。該類對用戶上線下線的監(jiān)聽是通過調(diào)用用戶鏈表類(UserLinkList)來實(shí)現(xiàn)的。當(dāng)用戶上線與下線情況發(fā)生變化時(shí),該類會對主類的界面進(jìn)行相應(yīng)的修改。
代碼:
package server;
import javax.swing.*;import java.io.*;import java.net.*;/* * 服務(wù)端的偵聽類 */ public class ServerListen extends Thread { ServerSocket server;
JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;//用戶鏈表
Node client;ServerReceive recvThread;
public boolean isStop;
/* * 聊天服務(wù)端的用戶上線于下線偵聽類
*/ public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textfield,UserLinkList userLinkList){
this.server = server;
this.combobox = combobox;
this.textarea = textarea;
this.textfield = textfield;
this.userLinkList = userLinkList;
isStop = false;}
public void run(){
while(!isStop &&!server.isClosed()){
try{
client = new Node();
client.socket = server.accept();
client.output = new ObjectOutputStream(client.socket.getOutputStream());
client.output.flush();
client.input = new ObjectInputStream(client.socket.getInputStream());
client.username =(String)client.input.readObject();
//顯示提示信息
combobox.addItem(client.username);
userLinkList.addUser(client);
textarea.append(”用戶 “ + client.username + ” 上線“ + ”n“);
textfield.setText(”在線用戶“ + userLinkList.getCount()+ ”人n“);
recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);
recvThread.start();
}
catch(Exception e){
}
} } }
3、ServerReceive類
功能:實(shí)現(xiàn)服務(wù)器消息收發(fā)的類,該類分別定義了向某用戶及所有人發(fā)送消息的方法,發(fā)送的消息會顯示在主界面類的街面上。
代碼:
package server;
import javax.swing.*;/* * 服務(wù)器收發(fā)消息的類 */ public class ServerReceive extends Thread { JTextArea textarea;JTextField textfield;JComboBox combobox;
Node client;UserLinkList userLinkList;//用戶鏈表
public boolean isStop;
public ServerReceive(JTextArea textarea,JTextField textfield, JComboBox combobox,Node client,UserLinkList userLinkList){ this.textarea = textarea;this.textfield = textfield;this.client = client;this.userLinkList = userLinkList;this.combobox = combobox;
isStop = false;}
public void run(){ //向所有人發(fā)送用戶的列表
sendUserList();
while(!isStop &&!client.socket.isClosed()){
try{
String type =(String)client.input.readObject();
if(type.equalsIgnoreCase(”聊天信息“)){
String toSomebody =(String)client.input.readObject();
String status =(String)client.input.readObject();
String action =(String)client.input.readObject();
String message =(String)client.input.readObject();
String msg = client.username
+” “+ action
+ ”對 “
+ toSomebody
+ ” 說 : “
+ message
+ ”n“;
if(status.equalsIgnoreCase(”悄悄話“)){
msg = ” [悄悄話] “ + msg;
}
textarea.append(msg);
if(toSomebody.equalsIgnoreCase(”所有人“)){ 33
sendToAll(msg);//向所有人發(fā)送消息
} else{
try{
client.output.writeObject(”聊天信息“);
client.output.flush();
client.output.writeObject(msg);
client.output.flush();
}
catch(Exception e){
//System.out.println(”###“+e);
}
Node node = userLinkList.findUser(toSomebody);
if(node!= null){
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
} } } else if(type.equalsIgnoreCase(”用戶下線“)){ Node node = userLinkList.findUser(client.username);userLinkList.delUser(node);
String msg = ”用戶 “ + client.username + ” 下線n“;int count = userLinkList.getCount();
combobox.removeAllItems();combobox.addItem(”所有人“);int i = 0;while(i < count){ node = userLinkList.findUser(i);if(node == null){
i ++;
continue;} combobox.addItem(node.username);i++;} combobox.setSelectedIndex(0);34
textarea.append(msg);
textfield.setText(”在線用戶“ + userLinkList.getCount()+ ”人n“);
sendToAll(msg);//向所有人發(fā)送消息
sendUserList();//重新發(fā)送用戶列表,刷新
break;
}
}
catch(Exception e){
//System.out.println(e);
} } } /* * 向所有人發(fā)送消息 */ public void sendToAll(String msg){ int count = userLinkList.getCount();
int i = 0;while(i < count){
Node node = userLinkList.findUser(i);
if(node == null){
i ++;
continue;
}
try{
node.output.writeObject(”聊天信息“);
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exception e){
//System.out.println(e);
}
i++;} }
} /* * 向所有人發(fā)送用戶的列表 */ public void sendUserList(){ String userlist = ”“;int count = userLinkList.getCount();
} int i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
userlist += node.username;userlist += 'n';i++;}
i = 0;while(i < count){ Node node = userLinkList.findUser(i);if(node == null){
i ++;
continue;}
try{
node.output.writeObject(”用戶列表“);
node.output.flush();
node.output.writeObject(userlist);
node.output.flush();} catch(Exception e){
//System.out.println(e);} i++;}
4、UserLinkList類
功能:用戶鏈表節(jié)點(diǎn)的具體實(shí)現(xiàn)類。該類通過構(gòu)造函數(shù)構(gòu)造用戶鏈表,定義了添加
用戶、刪除用戶、返回用戶數(shù)、根據(jù)用戶名查找用戶、根據(jù)索引查找用戶這5個(gè)方法。
代碼:
package server;/** * 用戶鏈表 */ public class UserLinkList { Node root;Node pointer;int count;
/** * 構(gòu)造用戶鏈表
*/ public UserLinkList(){
root = new Node();
root.next = null;
pointer = null;
count = 0;}
/** * 添加用戶
*/ public void addUser(Node n){
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
}
pointer.next = n;
n.next = null;
count++;
}
/** * 刪除用戶
*/ public void delUser(Node n){
pointer = root;
while(pointer.next!= null){
if(pointer.next == n){
pointer.next = n.next;
count--;
break;
}
pointer = pointer.next;} } /** * 返回用戶數(shù) */ public int getCount(){ return count;} /** * 根據(jù)用戶名查找用戶 */ public Node findUser(String username){ if(count == 0)return null;
pointer = root;
while(pointer.next!= null){
pointer = pointer.next;
if(pointer.username.equalsIgnoreCase(username)){
return pointer;
} }
return null;} /** * 根據(jù)索引查找用戶 */ public Node findUser(int index){ if(count == 0){
return null;38
}
} }
if(index < 0){ return null;}
pointer = root;
int i = 0;while(i < index + 1){ if(pointer.next!= null){
pointer = pointer.next;} else{
return null;}
i++;}
return pointer;
5、Node類
功能:用戶鏈表的節(jié)點(diǎn)類,定義了鏈表中的用戶。該類與前面所講的鏈表節(jié)點(diǎn)Node類的功能相當(dāng)。
代碼:
package server;
import java.net.*;import java.io.*;/** * 用戶鏈表的結(jié)點(diǎn)類 */ public class Node { String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;
Node next = null;39
}
6、PortConf類
功能:該類繼承自Jdialog,是用戶對服務(wù)器端監(jiān)聽端口進(jìn)行修改配置的類。代碼:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** * 生成端口設(shè)置對話框的類 */ public class PortConf extends JDialog { /** * */ private static final long serialVersionUID = 1L;JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel DLGINFO=new JLabel(” 默認(rèn)端口號為:8888“);
JPanel panelSave = new JPanel();JLabel message = new JLabel();
public static JTextField portNumber;
public PortConf(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//設(shè)置運(yùn)行位置,使對話框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width600)/ 2 + 150);
this.setResizable(false);40
}
private void jbInit()throws Exception {
this.setSize(new Dimension(300, 120));
this.setTitle(”端口設(shè)置“);
message.setText(”請輸入偵聽的端口號:“);
portNumber = new JTextField(10);
portNumber.setText(”“+ChatServer.port);
save.setText(”保存“);
cancel.setText(”取消“);
panelPort.setLayout(new FlowLayout());
panelPort.add(message);
panelPort.add(portNumber);
panelSave.add(new Label(” “));
panelSave.add(save);
panelSave.add(cancel);
panelSave.add(new Label(” “));
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(panelPort, BorderLayout.NORTH);
contentPane.add(DLGINFO, BorderLayout.CENTER);
contentPane.add(panelSave, BorderLayout.SOUTH);
//保存按鈕的事件處理
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent a){
int savePort;
try{
savePort=Integer.parseInt(PortConf.portNumber.getText());
if(savePort<1 || savePort>65535){
PortConf.DLGINFO.setText(” 偵聽端口必須是0-65535之間的整數(shù)!“);
PortConf.portNumber.setText(”“);
return;
}
ChatServer.port = savePort;
dispose();
} 41
catch(NumberFormatException e){
PortConf.DLGINFO.setText(” 錯誤的端口號,端口號請?zhí)顚懻麛?shù)!“);
PortConf.portNumber.setText(”“);
return;
}
}
});
//關(guān)閉對話框時(shí)的操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
DLGINFO.setText(”
為:8888“);
}
});
//取消按鈕的事件處理
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
DLGINFO.setText(”
為:8888“);
dispose();
}
});} }
7、Help類
功能:服務(wù)端程序幫助類。代碼:
package server;
import java.awt.*;import javax.swing.*;import java.awt.event.*;/** 42
默認(rèn)端口號默認(rèn)端口號
* 生成設(shè)置對話框的類 */ public class Help extends JDialog {
/** * */ private static final long serialVersionUID = 1L;JPanel titlePanel = new JPanel();JPanel contentPanel = new JPanel();JPanel closePanel = new JPanel();
JButton close = new JButton();JLabel title = new JLabel(”聊天室服務(wù)端幫助“);JTextArea help = new JTextArea();
Color bg = new Color(255,255,255);
public Help(JFrame frame){
super(frame, true);
try {
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
//設(shè)置運(yùn)行位置,使對話框居中
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width320)/ 2);
this.setResizable(false);}
private void jbInit()throws Exception {
this.setSize(new Dimension(400, 200));
this.setTitle(”幫助“);
titlePanel.setBackground(bg);;
contentPanel.setBackground(bg);
closePanel.setBackground(bg);
help.setText(”
1、設(shè)置服務(wù)端的偵聽端口(默認(rèn)端口為8888)。n“+
”
2、點(diǎn)擊 啟動服務(wù) 按鈕便可在指定的端口啟動服務(wù)。n“+
”
3、選擇需要接受消息的用戶,在消息欄中寫入消息,之后便可發(fā)送消息。n“+ 43
}
} ”
4、信息狀態(tài)欄中顯示服務(wù)器當(dāng)前的啟動與停止?fàn)顟B(tài)、“+ ”用戶發(fā)送的消息和n 服務(wù)器端發(fā)送的系統(tǒng)消息?!?;help.setEditable(false);titlePanel.add(new Label(” “));titlePanel.add(title);titlePanel.add(new Label(” “));contentPanel.add(help);closePanel.add(new Label(” “));closePanel.add(close);closePanel.add(new Label(” “));Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout());contentPane.add(titlePanel, BorderLayout.NORTH);contentPane.add(contentPanel, BorderLayout.CENTER);contentPane.add(closePanel, BorderLayout.SOUTH);close.setText(”關(guān)閉“);//事件處理
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dispose();
} });
8、ChatClient類
功能:定義客戶端的界面,添加時(shí)間監(jiān)聽與事件處理。該類定義了Connect()與DisConnect()方法實(shí)現(xiàn)與客戶端的連接與斷開連接。當(dāng)?shù)顷懙街付ǖ姆?wù)器時(shí),調(diào)用ClientReceive類實(shí)現(xiàn)消息收發(fā),同時(shí)該類還定義了SendMessaga()方法來其他用戶發(fā)送帶有表情的消息或悄悄話。
代碼:
package client;
import java.awt.*;import java.awt.event.*;import javax.swing.*;
import java.io.*;import java.net.*;/* * 聊天客戶端的主框架類 */ public class ChatClient extends JFrame implements ActionListener{
/** * */ private static final long serialVersionUID = 1L;String ip = ”127.0.0.1“;//連接到服務(wù)端的ip地址
int port = 8888;//連接到服務(wù)端的端口號
String userName = ”匆匆過客“;//用戶名
int type = 0;//0表示未連接,1表示已連接
JComboBox combobox;//選擇發(fā)送消息的接受者
JTextArea messageShow;//客戶端的信息顯示
JScrollPane messageScrollPane;//信息顯示的滾動條
JLabel express,sendToLabel,messageLabel;
JTextField clientMessage;//客戶端消息的發(fā)送
JCheckBox checkbox;//悄悄話
JComboBox actionlist;//表情選擇
JButton clientMessageButton;//發(fā)送消息
JTextField showStatus;//顯示用戶連接狀態(tài)
Socket socket;ObjectOutputStream output;//網(wǎng)絡(luò)套接字輸出流
ObjectInputStream input;//網(wǎng)絡(luò)套接字輸入流
ClientReceive recvThread;
//建立菜單欄
JMenuBar jMenuBar = new JMenuBar();//建立菜單組
JMenu operateMenu = new JMenu(”操作(O)“);//建立菜單項(xiàng)
JMenuItem loginItem = new JMenuItem(”用戶登錄(I)“);JMenuItem logoffItem = new JMenuItem(”用戶注銷(L)“);JMenuItem exitItem=new JMenuItem(”退出(X)“);
JMenu conMenu=new JMenu(”設(shè)置(C)“);JMenuItem userItem=new JMenuItem(”用戶設(shè)置(U)“);JMenuItem connectItem=new JMenuItem(”連接設(shè)置(C)“);
JMenu helpMenu=new JMenu(”幫助(H)“);JMenuItem helpItem=new JMenuItem(”幫助(H)“);//建立工具欄
JToolBar toolBar = new JToolBar();//建立工具欄中的按鈕組件
JButton loginButton;//用戶登錄 JButton logoffButton;//用戶注銷 JButton userButton;//用戶信息的設(shè)置 JButton connectButton;//連接設(shè)置 JButton exitButton;//退出按鈕
//框架的大小
Dimension faceSize = new Dimension(400, 600);JPanel downPanel;GridBagLayout girdBag;GridBagConstraints girdBagCon;
public ChatClient(){ init();//初始化程序
//添加框架的關(guān)閉事件處理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();//設(shè)置框架的大小
this.setSize(faceSize);//設(shè)置運(yùn)行時(shí)窗口的位置
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.widthfaceSize.getHeight())/ 2);this.setResizable(false);this.setTitle(”聊天室客戶端");//設(shè)置標(biāo)題 setVisible(true);//為操作菜單欄設(shè)置熱鍵'V' operateMenu.setMnemonic('O');46