基于JAVA的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
基于JAVA的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
基于JAVA的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
基于JAVA的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
基于JAVA的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩41頁(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)介

1、* 科 技 大 學(xué) 電 信 學(xué) 院課程設(shè)計(jì)說(shuō)明書設(shè)計(jì)題目: 基于 java 的聊天系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)學(xué)院、系: 計(jì)算機(jī)系 專業(yè)班級(jí): 計(jì)算機(jī) 2011-1 班 學(xué)生姓名: 指導(dǎo)教師: 成 績(jī): 2013 年 10 月 27 日基于 JAVA 的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)摘 要網(wǎng)絡(luò)聊天工具已經(jīng)作為一種重要的信息交流工具,受到越來(lái)越多的網(wǎng)民的青睞。目前,出現(xiàn)了很多非常不錯(cuò)的聊天工具,其中應(yīng)用比較廣泛的有 Netmeeting、騰訊QQ、MSN-Messager 等等。該系統(tǒng)開發(fā)主要包括一個(gè)網(wǎng)絡(luò)聊天服務(wù)器程序和一個(gè)網(wǎng)絡(luò)聊天客戶程序兩個(gè)方面。前者通過(guò) Socket 套接字建立服務(wù)器,服務(wù)器能讀取、轉(zhuǎn)發(fā)客戶端發(fā)來(lái)

2、信息,并能刷新用戶列表。后者通過(guò)與服務(wù)器建立連接,來(lái)進(jìn)行客戶端與客戶端的信息交流。其中用到了局域網(wǎng)通信機(jī)制的原理,通過(guò)直接繼承 Thread 類來(lái)建立多線程。開發(fā)中利用了計(jì)算機(jī)網(wǎng)絡(luò)編程的基本理論知識(shí),如 TCP/IP 協(xié)議、客戶端/服務(wù)器端模式(Client/Server 模式) 、網(wǎng)絡(luò)編程的設(shè)計(jì)方法等。在網(wǎng)絡(luò)編程中對(duì)信息的讀取、發(fā)送,是利用流來(lái)實(shí)現(xiàn)信息的交換,其中介紹了對(duì)實(shí)現(xiàn)一個(gè)系統(tǒng)的信息流的分析,包含了一些基本的軟件工程的方法。經(jīng)過(guò)分析這些情況,該聊天工具采用 Eclipse 為基本開發(fā)環(huán)境和 java 語(yǔ)言進(jìn)行編寫,首先可在短時(shí)間內(nèi)建立系統(tǒng)應(yīng)用原型,然后,對(duì)初始原型系統(tǒng)進(jìn)行不斷修正和改進(jìn)

3、,直到形成可行系統(tǒng)關(guān)鍵詞:即時(shí)通訊系統(tǒng) B/S C/S MySQL Socket Swing目 錄第第 1 1 章章 引言引言.11.1 開發(fā)背景.11.2 開發(fā)目的和意義.11.3 論文研究?jī)?nèi)容.2第第 2 2 章章 即時(shí)通訊系統(tǒng)的相關(guān)研究即時(shí)通訊系統(tǒng)的相關(guān)研究.32.1 C/S 開發(fā)模式.32.2 B/S 開發(fā)模式.32.3 即時(shí)通訊原理.42.4 Java web 、Struts2、AJAX、JavaScript 應(yīng)用技術(shù).42.5 MySQL 數(shù)據(jù)庫(kù)應(yīng)用技術(shù).42.6 Socket 通信技術(shù).42.7 開發(fā)環(huán)境的搭建.5第第 3 3 章章 系統(tǒng)分析系統(tǒng)分析.63.1 系統(tǒng)基本功能描述.

4、63.2 可行性分析.63.3 系統(tǒng)需求分析.73.3.1 功能分析.7第第 4 4 章章 系統(tǒng)設(shè)計(jì)系統(tǒng)設(shè)計(jì).94.1 數(shù)據(jù)庫(kù)設(shè)計(jì).94.2 系統(tǒng)模塊設(shè)計(jì).104.2.1 聊天系統(tǒng)工作原理圖.104.2.2 系統(tǒng)功能模塊圖:.114.2.3 系統(tǒng)用例圖:.114.2.4 活動(dòng)圖:.124.3 系統(tǒng)類設(shè)計(jì).144.3.1 Message 類的設(shè)計(jì).144.2.2 截圖類的設(shè)計(jì).154.2.3 聊天記錄類的設(shè)計(jì).164.2.4 服務(wù)器線程類設(shè)計(jì).17第第 5 5 章章 系統(tǒng)實(shí)現(xiàn)系統(tǒng)實(shí)現(xiàn).185.1 實(shí)現(xiàn)概況.185.2 注冊(cè)模塊.185.2.1 流程圖.185.2.2 關(guān)鍵代碼.185.3 登錄模

5、塊.205.3.1 流程圖.205.3.2 關(guān)鍵代碼.205.4 聊天模塊.245.4.1 流程圖.245.4.2 關(guān)鍵代碼.245.5 文件模塊.285.5.1 流程圖.285.5.2 關(guān)鍵代碼.285.6 用戶管理模塊.335.6.1 流程圖.335.6.2 關(guān)鍵代碼.335.7 其他功能的實(shí)現(xiàn).365.7.1 截圖功能的實(shí)現(xiàn).365.7.2 聊天記錄功能的實(shí)現(xiàn).375.7.3 服務(wù)端線程的實(shí)現(xiàn).385.8 用戶界面的設(shè)計(jì).38結(jié)語(yǔ)結(jié)語(yǔ).42第第 1 1 章章 引言引言1.11.1 開發(fā)背景開發(fā)背景隨著互聯(lián)網(wǎng)的快速發(fā)展,網(wǎng)絡(luò)聊天工具已經(jīng)作為一種重要的信息交流工具,受到越來(lái)越多的網(wǎng)民的青睞。

6、目前,出現(xiàn)了很多非常不錯(cuò)的聊天工具,其中應(yīng)用比較廣泛的有Netmeeting、騰訊 QQ、MSN-Messager 等等。無(wú)論是個(gè)人還是企業(yè)等組織機(jī)構(gòu),對(duì)溝通的需求也在不斷發(fā)展,傳統(tǒng)的電話、傳真、郵件等溝通方式顯然已無(wú)法滿足當(dāng)今人們工作和生活溝通的需要。隨著軟件、網(wǎng)絡(luò)和通訊三大現(xiàn)代信息技術(shù)的發(fā)展,在溝通、協(xié)作方面有著更多方便、快捷、實(shí)時(shí)等優(yōu)勢(shì)的即時(shí)通訊,成為繼電話、E-Mail 之后又一個(gè)完全融入每個(gè)人生活的互聯(lián)網(wǎng)工具。Java 是一個(gè)由 Sun 公司開發(fā)而成的新一代編程語(yǔ)言。使用它可在各式各樣不同種機(jī)器、不同種操作平臺(tái)的網(wǎng)絡(luò)環(huán)境中開發(fā)軟件。不論你使用的是哪一種 WWW 瀏覽器,哪一種計(jì)算機(jī),

7、哪一種操作系統(tǒng),只要 WWW 瀏覽器上面注明了“支持 Java” ,你就可以看到生動(dòng)的主頁(yè)。Java 正在逐步成為 Internet 應(yīng)用的主要開發(fā)語(yǔ)言。它徹底改變了應(yīng)用軟件的開發(fā)模式,帶來(lái)了自 PC 機(jī)以來(lái)又一次技術(shù)革命,為迅速發(fā)展的信息世界增添了新的活力。1.21.2 開發(fā)目的開發(fā)目的和意義和意義網(wǎng)絡(luò)通信在當(dāng)今信息社會(huì)中起著不可或缺的作用,人們可以利用網(wǎng)絡(luò)通信技術(shù)進(jìn)行即時(shí)的信息 交流。比如說(shuō) QQ 聊天工具,它就是利用網(wǎng)絡(luò)通信技術(shù)開發(fā)的一款眾所周知的網(wǎng)絡(luò)聊天工具。通訊工具最初雖為聊天而誕生,但其作用早已超出了聊天的范疇,隨著企業(yè)即時(shí)通訊工具的出現(xiàn),即時(shí)信息在網(wǎng)絡(luò)營(yíng)銷中將發(fā)揮更大的作用。目前

8、,信息交流是互聯(lián)網(wǎng)提供的主要內(nèi)容,網(wǎng)絡(luò)通信系統(tǒng)有多種實(shí)現(xiàn)方 式,類似ICQ 屬于一種點(diǎn)對(duì)點(diǎn)的聊天系統(tǒng);還有一種是基于 Socket 的集中式聊天系統(tǒng),這種聊天系統(tǒng)需要登錄統(tǒng)一的聊天服務(wù)器。考慮到要可以在局域網(wǎng)中應(yīng)用,本系統(tǒng)使用的是第二種方法,經(jīng)過(guò)設(shè)置,在局域網(wǎng)或 internet 上都可以使用。1.31.3 研究?jī)?nèi)容研究?jī)?nèi)容1、即時(shí)通訊原理 首先驗(yàn)證登陸,如果成功,則建立與服務(wù)端的 socket 連接,服務(wù)端新開啟一個(gè)線程專門為它服務(wù),將打包好的 Message 發(fā)送給服務(wù)器端,服務(wù)器端根據(jù) Message 里面的信息,再將信息轉(zhuǎn)發(fā)給其他用戶。一個(gè)標(biāo)準(zhǔn)的 C/S 模式。2、Swing 技術(shù) S

9、wing 是一個(gè)用于開發(fā) Java 應(yīng)用程序用戶界面的開發(fā)工具包。它以抽象窗口工具包(AWT)為基礎(chǔ)使跨平臺(tái)應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格。用來(lái)實(shí)現(xiàn)客服端的界面設(shè)計(jì)。3、Java web 和 struts2 技術(shù) 采用 B/S 的結(jié)構(gòu)實(shí)現(xiàn)服務(wù)器端,對(duì)用戶和在線用戶進(jìn)行增刪改查,和踢用戶下線,以及開啟服務(wù)器和關(guān)閉服務(wù)器。4、系統(tǒng)的構(gòu)建 客戶端采用 C/S 結(jié)構(gòu),管理端采用 B/S 的結(jié)構(gòu),用 Tomcat 作為服務(wù)器,MySQL作為數(shù)據(jù)庫(kù),還使用到了 WindowBuilder 開源框架進(jìn)行界面開發(fā)。第第 2 2 章章 即時(shí)通訊系統(tǒng)的相關(guān)研究即時(shí)通訊系統(tǒng)的相關(guān)研究2.12.1 C/SC/S

10、 開發(fā)模式開發(fā)模式 C/S 結(jié)構(gòu)的優(yōu)點(diǎn)是能充分發(fā)揮客戶端 PC 的處理能力,很多工作可以在客戶端處理后再提交給服務(wù)器。對(duì)應(yīng)的優(yōu)點(diǎn)就是客戶端響應(yīng)速度快。缺點(diǎn)主要有以下幾個(gè): 而隨著互聯(lián)網(wǎng)的飛速發(fā)展,移動(dòng)辦公和分布式辦公越來(lái)越普及,這需要我們的系統(tǒng)具有擴(kuò)展性。這種方式遠(yuǎn)程訪問(wèn)需要專門的技術(shù),同時(shí)要對(duì)系統(tǒng)進(jìn)行專門的設(shè)計(jì)來(lái)處理分布式的數(shù)據(jù)。 客戶端需要安裝專用的客戶端軟件。首先涉及到安裝的工作量,其次任何一臺(tái)電腦出問(wèn)題,如病毒、硬件損壞,都需要進(jìn)行安裝或維護(hù)。還有,系統(tǒng)軟件升級(jí)時(shí),每一臺(tái)客戶機(jī)需要重新安裝,其維護(hù)和升級(jí)成本非常高。(大多數(shù)沒(méi)法自動(dòng)升級(jí)而需要人工升級(jí)) 對(duì)客戶端的操作系統(tǒng)一般也會(huì)有限制。

11、可能適應(yīng)于 Windows 98,但不能用于Windows 2000 或 Windows XP?;蛘卟贿m用于微軟新的操作系統(tǒng)等等,更不用說(shuō)Linux、Unix 等。2.22.2 B/SB/S 開發(fā)模式開發(fā)模式B/S 結(jié)構(gòu)(Browser/Server 結(jié)構(gòu))結(jié)構(gòu)即瀏覽器和服務(wù)器結(jié)構(gòu)。它是隨著 Internet 技術(shù)的興起,對(duì) C/S 結(jié)構(gòu)的一種變化或者改進(jìn)的結(jié)構(gòu)。在這種結(jié)構(gòu)下,用戶工作界面是通過(guò) WWW 瀏覽器來(lái)實(shí)現(xiàn),極少部分事務(wù)邏輯在前端(Browser)實(shí)現(xiàn),但是主要事務(wù)邏輯在服務(wù)器端(Server)實(shí)現(xiàn),形成所謂三層 3-tier結(jié)構(gòu)。這樣就大大簡(jiǎn)化了客戶端電腦載荷,減輕了系統(tǒng)維護(hù)與升級(jí)

12、的成本和工作量,降低了用戶的總體成本(TCO) 。以目前的技術(shù)看,局域網(wǎng)建立 B/S 結(jié)構(gòu)的網(wǎng)絡(luò)應(yīng)用,并通過(guò) Internet/Intranet 模式下數(shù)據(jù)庫(kù)應(yīng)用,相對(duì)易于把握、成本也是較低的。它是一次性到位的開發(fā),能實(shí)現(xiàn)不同的人員,從不同的地點(diǎn),以不同的接入方式(比如 LAN, WAN, Internet/Intranet 等)訪問(wèn)和操作共同的數(shù)據(jù)庫(kù);它能有效地保護(hù)數(shù)據(jù)平臺(tái)和管理訪問(wèn)權(quán)限,服務(wù)器數(shù)據(jù)庫(kù)也很安全 。特別是在 JAVA 這樣的跨平臺(tái)語(yǔ)言出現(xiàn)之后,B/S 架構(gòu)管理軟件更是方便、速度快、效果優(yōu)。2.32.3 即時(shí)通訊原理即時(shí)通訊原理 登陸進(jìn)入聊天軟件后,即顯示出好友列表,在線的顯示亮

13、頭像,不在線的顯示灰色頭像。雙擊好友頭像即會(huì)顯示出聊天界面。在聊天頁(yè)面上,有發(fā)送文字,發(fā)送截圖,和發(fā)送文件的功能按鈕。點(diǎn)擊“發(fā)送”按鈕之后,程序就會(huì)把輸入的信息的種類,信息內(nèi)容、本人的 ID 號(hào)、對(duì)方的 ID 號(hào)以及當(dāng)前的時(shí)間等內(nèi)容打包成一個(gè) Message 對(duì)象通過(guò) Socket 發(fā)送到服務(wù)器端。服務(wù)器接收到 Message 之后,按照協(xié)議進(jìn)行解析和轉(zhuǎn)發(fā)。這樣,雙方的即時(shí)通訊就實(shí)現(xiàn)了。2.42.4 JavaJava WebWeb 、struts2struts2、AjaxAjax、javascriptjavascript 應(yīng)用技術(shù)應(yīng)用技術(shù)通過(guò)這些技術(shù),實(shí)現(xiàn)服務(wù)器的后臺(tái)管理端,對(duì)用戶和在線用戶進(jìn)

14、行增刪改查,和踢用戶下線,以及開啟服務(wù)器和關(guān)閉服務(wù)器。以及用戶的注冊(cè),前臺(tái)驗(yàn)證等等2.52.5 MySQLMySQL 數(shù)據(jù)庫(kù)應(yīng)用技術(shù)數(shù)據(jù)庫(kù)應(yīng)用技術(shù)使用 MySQL 存儲(chǔ)用戶信息,采用 JDBC 技術(shù)對(duì)其進(jìn)行增刪改查。2.62.6 SocketSocket 通信技術(shù)通信技術(shù)Socket 程序的工作過(guò)程:1、建立 Socket 連接:在通信開始之前由通信雙方確認(rèn)身份,建立一條專用的虛擬連接通道。2、數(shù)據(jù)通信:利用虛擬連接通道傳送數(shù)據(jù)信息進(jìn)行通信。3、關(guān)閉:通信結(jié)束時(shí),再將所建的虛擬連接拆除。具體如下:服務(wù)器 圖 2-1 socket 通信2.72.7 開發(fā)環(huán)境的搭建開發(fā)環(huán)境的搭建客戶端采用 C/S

15、 結(jié)構(gòu),管理端采用 B/S 的結(jié)構(gòu),用 Tomcat 作為服務(wù)器,MySQL 作為數(shù)據(jù)庫(kù),還使用到了 WindowBuilder 開源框架進(jìn)行界面開發(fā)。第第 3 3 章章 系統(tǒng)分析系統(tǒng)分析3.13.1 系統(tǒng)基本系統(tǒng)基本功能描述功能描述客戶端可以實(shí)現(xiàn)注冊(cè),即時(shí)聊天,相互之間收發(fā)文件,發(fā)送截圖,查看歷史聊天記錄等功能。收發(fā)消息時(shí),可以實(shí)現(xiàn)離線接收。服務(wù)器端應(yīng)當(dāng)建立一個(gè) ServerSocket,并且不斷進(jìn)行偵聽是否有客戶端連接或者斷開連接(包括判斷沒(méi)有響應(yīng)的連接超時(shí))。服務(wù)器端應(yīng)當(dāng)是一個(gè)信息發(fā)送中心,所有客戶端的信息都傳到服務(wù)器端,由服務(wù)器端根據(jù)要求分發(fā)信息。在后臺(tái)管理系統(tǒng),可以到對(duì)用戶進(jìn)行增刪改

16、查,查看在線用戶,和踢用戶下線3.23.2 可行性分析可行性分析本系統(tǒng)的可行性分析包括以下幾個(gè)方面的內(nèi)容:(1) 技術(shù)可行性使用 Swing 和 socket 技術(shù),可以很輕松地開發(fā)出實(shí)用、簡(jiǎn)便、高效的基于網(wǎng)絡(luò)的即時(shí)通訊系統(tǒng)。因此技術(shù)上是可以實(shí)現(xiàn)的。(2) 經(jīng)濟(jì)可行性計(jì)算機(jī)網(wǎng)絡(luò)已經(jīng)普及,因此在網(wǎng)絡(luò)設(shè)備上不需要進(jìn)行大的投入。本系統(tǒng)需要一個(gè)MySQL 數(shù)據(jù)庫(kù)服務(wù)器,由于并發(fā)使用人數(shù)比較少,tomcat 可以作為 web 服務(wù)器,所以成本很低。(3) 操作可行性只要一臺(tái)以上計(jì)算機(jī)連接在同一個(gè)局域網(wǎng)內(nèi),本系統(tǒng)就可以安裝使用,所以操作上完全不存在問(wèn)題。如果要實(shí)現(xiàn) internet 上通訊,只需要將服務(wù)器

17、端運(yùn)行在一個(gè)有固定 IP的公網(wǎng)上就可以。綜上所述,即時(shí) Java 即時(shí)通訊系統(tǒng)是可行的。3.33.3 系統(tǒng)需求分析系統(tǒng)需求分析.1 功能分析功能分析本系統(tǒng)要實(shí)現(xiàn)的功能如下:1)注冊(cè)服務(wù)器收到用戶的注冊(cè)請(qǐng)求,便開始接受客戶傳遞的信息,諸如客戶的呢稱,性別,籍貫,個(gè)人資料等,接受完畢后,便通過(guò) JDBC 與后臺(tái)數(shù)據(jù)庫(kù)連接,然后向數(shù)據(jù)庫(kù)添加記錄,如果成功,便向客戶返回其號(hào)碼??蛻羰盏椒?wù)器返回的信息后,便打開窗口登陸。2)登陸在客戶端,用戶輸入其號(hào)碼和密碼,然后建立與服務(wù)器的連接,告訴服務(wù)器我要登錄,服務(wù)器收到后,開始通過(guò) JDBC 讀取數(shù)據(jù)庫(kù),然后與用戶輸入的信息進(jìn)行比對(duì),如果成功

18、,便打開主程序窗口。然后客戶向服務(wù)器請(qǐng)求讀取好友名單,服務(wù)器收到該請(qǐng)求,從數(shù)據(jù)庫(kù)中取出好友列表,然后向客戶端發(fā)送這些信息,客戶收到后就在主窗口顯示好友。3)聊天客戶端首先發(fā)送消息到服務(wù)器端,服務(wù)器端根據(jù)發(fā)送人信息和接收者信息來(lái)轉(zhuǎn)發(fā)。例如服務(wù)器接收到一個(gè) A 發(fā)給 B 的消息,先判斷 B 是否已經(jīng)在線,如果在線就將信息發(fā)送過(guò)去。如果 B 不在線則把信息儲(chǔ)存在服務(wù)器,等 B 上線了在發(fā)送給他。B 接收到 A 發(fā)來(lái)的信息,如果是未建立對(duì)話窗口,則自動(dòng)打開顯示。4)發(fā)送截圖客戶端 A 點(diǎn)擊截圖按鈕,將屏幕鎖定,截取圖片,將圖片儲(chǔ)存在 byte數(shù)組中發(fā)送到服務(wù)器端。服務(wù)器端根據(jù)發(fā)送人信息和接收者信息來(lái)轉(zhuǎn)

19、發(fā)。B 接收到 A 發(fā)來(lái)的截圖信息,會(huì)根據(jù) byte構(gòu)造圖片,將圖片顯示出來(lái)。同樣,如果是未建立對(duì)話窗口,則自動(dòng)打開顯示。5)發(fā)送文件客戶端 A 點(diǎn)擊發(fā)送文件按鍵,從本地選擇文件,將文件在 byte數(shù)組中分批次發(fā)送到服務(wù)器端。服務(wù)器端根據(jù)發(fā)送人信息和接收者信息來(lái)轉(zhuǎn)發(fā)。B 接收到 A 發(fā)來(lái)的文件信息,會(huì)根據(jù)文件發(fā)送的狀態(tài)和 byte構(gòu)造文件。6)日志客戶端發(fā)送和接收到的信息都會(huì)儲(chǔ)存在文本文檔中。默認(rèn)儲(chǔ)存在 C 盤下面,會(huì)以用戶的登錄賬號(hào)為名。7)對(duì)用戶的操作 管理員通過(guò) B/S 的系統(tǒng)對(duì)用戶進(jìn)行增加,修改,刪除,查找等操作,對(duì)系統(tǒng)進(jìn)行維護(hù)。8)在線用戶的操作 管理員通過(guò) B/S 的系統(tǒng)對(duì)在線用戶

20、操作,可以踢用戶下線。第第 4 4 章章 系統(tǒng)設(shè)計(jì)系統(tǒng)設(shè)計(jì)4.14.1 數(shù)據(jù)庫(kù)設(shè)計(jì)數(shù)據(jù)庫(kù)設(shè)計(jì)本系統(tǒng)中所涉及的主要實(shí)體及其屬性有:用戶(用戶賬號(hào),用戶名,密碼,個(gè)性簽名,頭像 ID,年齡,性別) E-R 模型如圖所示。useraccountNamepasswordsignatureProfileIDagesex圖 4-1 系統(tǒng)實(shí)體及其屬性表 4-1 User字段名數(shù)據(jù)類型字段說(shuō)明鍵引用備注accountint(6)IDPK主鍵(自動(dòng)增一)namevarchar(20)用戶名稱非空passwordvarchar(20)用戶密碼非空signatureVarchar(255)簽名profileIDin

21、t(2)頭像 IDageint(3)年齡sexsex char(2)性別4.2 系統(tǒng)模塊設(shè)計(jì)系統(tǒng)模塊設(shè)計(jì)4.2.1 聊天系統(tǒng)工作原理圖 圖 4-2 系統(tǒng)工作原理4.2.2 系統(tǒng)功能模塊圖:JAVA聊天系統(tǒng) 文件模塊聊天模塊登錄模塊 用戶管理模塊文件接收 文件發(fā)送 發(fā)送文字發(fā)送圖片 在線用戶管理 增加用戶 刪除用戶 修改用戶 查找用戶 查看在線用戶 踢用戶下線 注冊(cè) 圖 4-3 系統(tǒng)模塊4.2.3 系統(tǒng)用例圖:普通用戶的用例圖:用戶注冊(cè)登陸聊天文件發(fā)送文件接收文件文字圖片圖 4-4 普通用戶用例圖后臺(tái)管理員的用例圖:管理員登陸增加用戶踢用戶下線查看在線用戶刪除用戶查找用戶修改用戶圖 4-5 后臺(tái)

22、用戶用例圖4.2.4 活動(dòng)圖:1)用戶登陸活動(dòng)圖首先填寫登陸信息,提交以后服務(wù)器會(huì)對(duì)用戶名和密碼進(jìn)行驗(yàn)證。如果不正確,返回一個(gè)提示信息。如果登陸成功,就更新在線狀態(tài)。通知所有好友自己已經(jīng)上線。服務(wù)器再檢查是否有他的離線消息,如果有這立即發(fā)送給用戶。圖 4-6 用戶登錄活動(dòng)圖2)發(fā)送消息活動(dòng)圖短消息發(fā)送以后,服務(wù)器端對(duì)應(yīng)的監(jiān)聽線程會(huì)接收到一個(gè)數(shù)據(jù)包。此包中包含接收者的信息,如果接收者在線,數(shù)據(jù)包將會(huì)轉(zhuǎn)發(fā)到接收者。如果不在線,存在服務(wù)器端,等它上線在發(fā)送。圖 4-7 發(fā)送消息活動(dòng)圖4.3 系統(tǒng)類設(shè)計(jì)系統(tǒng)類設(shè)計(jì)4.3.1 Message 類的設(shè)計(jì):客戶端和服務(wù)器端通信時(shí),發(fā)送的都是 Message

23、類的對(duì)象,因此 Message 類的設(shè)計(jì)很重要。 表 4-2 Message屬性屬性名名作用作用private Integer msgType;信息類型private String content; 信息的文本內(nèi)容private Integer senderAccount;發(fā)送者 accountprivate Integer receiverAccount;接收者 accountprivate String time;發(fā)送時(shí)間private User myself;private List friends;自己本身對(duì)象,用與好友列表頭好友列表private transient Image im

24、g;圖片對(duì)象(不傳送)private byte imageByte;圖片的內(nèi)容private String fileName;文件名稱private byte fileByte;文件的長(zhǎng)度private int length;/文件長(zhǎng)度,以KB為單位文件的內(nèi)容private int state;文件傳輸?shù)臓顟B(tài):0 是不接受文件,1 是接受文件,2 請(qǐng)求發(fā)送文件,3 文件傳輸中,4 文件傳送完成private Integer msgType消息的類型有這么幾種: public interface MessageType Integer message_succeed=1;/表明是登陸成功Inte

25、ger message_login_fail=2;/表明登錄失敗Integer message_comm_mes=3;/普通信息包Integer message_get_onLineFriend=4;/要求在線好友的包Integer message_ret_onLineFriend=5;/返回在線好友的包Integer message_offline=6;/下線通知包Integer message_img=7;/圖片包Integer message_file=8;/文件包4.3.2 截圖類的設(shè)計(jì):截圖類的實(shí)現(xiàn)類為:class Screenshot extends JFrame implemen

26、ts MouseListener,MouseMotionListener。+mouseDragged(in MouseEvent e)+mouseClicked(in MouseEvent e)+mousePressed(in MouseEvent e)+mouseReleased(in MouseEvent e)+paint(in Graphics g)ScreenshotMouseListenerMouseMotionListener+paint(in Graphics g)JFrame監(jiān)聽各種鼠標(biāo)動(dòng)作圖 4-8 Screenshot類截圖類的核心是 JDK 中:Robot 類中creat

27、eScreenCapture(Rectangle screenRect) 創(chuàng)建包含從屏幕中讀取的像素的圖像。先用截取全部屏幕的圖片,然后顯示出來(lái),覆蓋住整個(gè)屏幕。然后監(jiān)聽鼠標(biāo)事件,再用createScreenCapture(Rectangle screenRect)方法截圖。雙擊表示截圖成功,右鍵表示取消截圖。4.3.3 聊天記錄類的設(shè)計(jì):記錄日志的功能被封裝在 MessageRecord 類中,所在包為com.im.client.record,在發(fā)送或接受到數(shù)據(jù)后,將其寫入日志文件。+afterSend(in o : Object)+afterReceive(in o : Object)Me

28、ssageRecordafterSend:記錄發(fā)出數(shù)據(jù)afterReceive:記錄接收到的數(shù)據(jù)+run()+send(in o : Object)+receive() : ObjectClientConnToServerThread+run()Thread 圖 4-9 MessageRecord 類如果是圖片則顯示出,發(fā)送時(shí)間和圖片大小。如果是文件則顯示出請(qǐng)求發(fā)送時(shí)間,同意接收時(shí)間,接收完成時(shí)間,和文件大小。 日志文件格式如下: 圖 4-10 記錄文件4.3.4 服務(wù)端線程的設(shè)計(jì):服務(wù)器端的核心是對(duì)應(yīng)客戶的線程,每個(gè) socket 對(duì)應(yīng)一個(gè)線程,也就是每一個(gè)客戶端都在服務(wù)器端有一個(gè)相應(yīng)的線程

29、。它負(fù)責(zé)轉(zhuǎn)發(fā)客戶端發(fā)來(lái)的消息。線程類為 ClientThread:表 4-3 ClientThread 類屬性屬性名名作用作用public void notifyOnline()通知其他線程,自己上線了,讓客戶方更新頭像public void run() 線程的主題,轉(zhuǎn)發(fā)消息public void notifyOffline()通知其他線程,自己下線了,讓客戶方更新頭像public void send(Object o) 發(fā)送消息public Object receive() 接收消息第第 5 5 章章 系統(tǒng)實(shí)現(xiàn)系統(tǒng)實(shí)現(xiàn)5.15.1 實(shí)現(xiàn)概況實(shí)現(xiàn)概況本系統(tǒng)可分為登錄、聊天、文件、用戶管理和注冊(cè)

30、五個(gè)功能模塊。 “登錄”模塊為用戶提供登錄界面,并在用戶登錄顯示好友列表;“聊天”模塊實(shí)現(xiàn)用戶的即時(shí)傳送信息,即多用戶即時(shí)聊天,可以發(fā)送文字或者截圖;“文件”模塊主要實(shí)現(xiàn)一用戶向另一用戶發(fā)送文件,對(duì)方可以選擇接受或者拒絕。聊天記錄會(huì)以文本文檔格式保存。 “用戶管理”模塊即管理員對(duì)用戶進(jìn)行增刪改查,和踢用戶下線的操作。下面詳細(xì)介紹各個(gè)模塊的具體實(shí)現(xiàn)。5.25.2 注冊(cè)模塊注冊(cè)模塊5.2.1 流程圖開始填寫用戶信息存入數(shù)據(jù)庫(kù)顯示賬號(hào)結(jié)束圖 5-1 用戶注冊(cè)流程圖5.2.2 關(guān)鍵代碼注冊(cè)的前臺(tái)頁(yè)面是 showDetail.jsp,后臺(tái)是 UserAction 類,UserAction 類中有方法:

31、public String saveOrUpdate()us.saveOrUpdate(user);return refresh;saveOrUpdate 則是用到了 Userservice 里面的方法:public void saveOrUpdate(User u)System.out.println(u.getAccount()=+u.getAccount();if(u.getAccount()=null)ud.save(u);else ud.update(u);DAO 類中的方法:public void save(User u) conn=getConnection(); try ps=

32、conn.prepareStatement(SAVE);ps.setString(1, u.getName();ps.setString(2, u.getPassword();ps.setString(3, u.getSignature();ps.setInt(4, 1);ps.setInt(5, u.getAge();ps.setString(6, u.getSex();ps.execute(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();finallyclose(); 網(wǎng)頁(yè)上顯示用

33、戶的 account圖 5-2 用戶注冊(cè)信息5.35.3 登錄模塊登錄模塊5.3.1 流程圖 開始填寫用戶信息驗(yàn)證用戶信息驗(yàn)證用戶結(jié)束接收離線信息成功失敗發(fā)送登陸失敗信息圖 5-3 登錄流程圖 5.3.2 關(guān)鍵代碼 1)客戶端代碼 登錄事件是定義在class IMClientLogin extends JFrame 這個(gè)類的監(jiān)聽事件中。登錄成功后,立即向服務(wù)器請(qǐng)求自己的好友列表。/登錄事件login.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) /cus=new IMClien

34、tUserServer();/System.out.println(cus.getServer();User u=new User();u.setAccount(Integer.parseInt(account.getText().trim();u.setPassword(new String(passwordField.getPassword();/登陸成功if(cus.checkLogin(u) /向服務(wù)器發(fā)送數(shù)據(jù)包,請(qǐng)求在線人得信息ClientConnToServerThread t=Manager.THREAD;Message m=new Message();m.setMsgType(

35、MessageType.message_get_onLineFriend);m.setSenderAccount(u.getAccount();try t.send(m); catch (IOException e1) e1.printStackTrace();dispose();elseJOptionPane.showMessageDialog(null, 用戶名或密碼錯(cuò)誤, 錯(cuò)誤, JOptionPane.ERROR_MESSAGE););登錄邏輯是在public class IMClientUserServer 里面,認(rèn)證成功者就會(huì)新建一個(gè)線程,專門負(fù)責(zé)接收服務(wù)器端發(fā)來(lái)的信息class

36、ClientConnToServerThread extends Thread 。public boolean checkLogin(Object o) boolean success=false;Message msg=(Message) server.sendLoginInfo(o);/System.out.println(msg.getMsgType();/System.out.println(MessageType.message_succeed);if(msg.getMsgType().intValue()=MessageType.message_Value()

37、success=true;User u=(User) o;/將好友列表放到管理器中,進(jìn)行上下線操作IMFriendList fl=new IMFriendList(msg.getMyself(),msg.getFriends();Manager.FRIEND_LIST=fl;/開啟客戶線程 ,接收服務(wù)器端的信息connThread =new ClientConnToServerThread(server.getSocket();connThread.setSocket(server.getSocket();connThread.start();connThread.setName(u.getA

38、ccount()+);Manager.THREAD=connThread;return success;客戶端通過(guò)public class IMClientServer 類與服務(wù)器通信public Object sendLoginInfo(Object o) try ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream();oos.writeObject(o);ObjectInputStream ois = new ObjectInputStream(socket.getInputStream();Mess

39、age ms = (Message) ois.readObject();return ms; catch (IOException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace();return null;這樣按照MVC的模式設(shè)計(jì),減小的系統(tǒng)耦合。2)服務(wù)端代碼服務(wù)器端接收用戶驗(yàn)證信息的代碼被寫在了一個(gè)線程public class ServerThread extends Thread中,這樣服務(wù)器就可以不停的監(jiān)聽端口,接收來(lái)自不同客戶端的請(qǐng)求,建立socket連接,也不會(huì)堵塞在主線程當(dāng)中。

40、從數(shù)據(jù)庫(kù)中搜索用戶,看是否存在 public boolean checkLogin(User u) User user=ud.findById(u.getAccount(); if(user!=null) return user.getPassword().equals(u.getPassword(); return false; 如果驗(yàn)證成功,查找是否有他的離線消息,有就發(fā)送給他。然后在服務(wù)器上專門開啟一個(gè)針對(duì)當(dāng)前用戶的線程,并且吧線程放入管理類中,便于日后的管理。if (checkLogin(u) / 返回一個(gè)成功登陸的信息報(bào) User myself=ud.findById(u.getAc

41、count();m.setMsgType(MessageType.message_succeed);m.setMyself(myself);m.setFriends(ud.findAll();/好友列表oos.writeObject(m);/為用戶單獨(dú)創(chuàng)建線程ClientThread t=new ClientThread(s);/查看是否有離線消息LinkedList list=OffLineMsgManager.get(u.getAccount();if(list!=null)for(Message msg:list)t.send(msg);list.clear();/開啟線程t.start

42、();t.setName(u.getAccount()+);/把用戶線程放入管理類中ClientThreadManager.addClientThread(u.getAccount(), t);/通知其他的用戶t.notifyOnline();System.out.println( 成功); else m.setMsgType(3);oos.writeObject(m);System.out.println( 失敗);/ 關(guān)閉Sockets.close();5.45.4 聊天模塊聊天模塊5.4.1 流程圖開始打開聊天窗口輸入數(shù)據(jù)接收數(shù)據(jù)顯示數(shù)據(jù)發(fā)送數(shù)據(jù)結(jié)束圖 5-4 聊天流程圖5.4.2 關(guān)鍵

43、代碼1)客服端代碼發(fā)送文字信息:客戶端發(fā)送和顯示信息的代碼被封裝在了IMChat extends JFrame implements ActionListener類中,其中發(fā)送文字信息的代碼/點(diǎn)擊的如果是發(fā)送buttonif (e.getSource() = confirmButton) Message m=(Message) makePackage(MessageType.message_comm_mes,null);/發(fā)送sendMessage(m);/在自己的Ouput上顯示 showMessage(m,Color.BLACK); /清空輸入input_textArea.setText(

44、);當(dāng)用戶點(diǎn)擊發(fā)送按鈕后,先把先把信息顯示在自己的聊天窗口上,后方發(fā)送信息,自己發(fā)送的信息和接收到的信息用不同的顏色顯示。顯示文字信息,顯示在JtextPane控件中 SimpleAttributeSet attrset = new SimpleAttributeSet();StyleConstants.setForeground(attrset,c);Document docs = output_pane.getDocument();/ 利用getDocument()方法取得JTextPane的Document/一般信息if(m.getMsgType().intValue()=Message

45、Type.message_comm_mes)String str=m.getSenderAccount() + +m.getTime()+n+ + m.getContent()+ n;try docs.insertString(docs.getLength(), str, attrset);/設(shè)置光標(biāo)到末尾output_pane.setCaretPosition(docs.getLength(); catch (BadLocationException e) e.printStackTrace();發(fā)送圖片信息:在發(fā)送圖片信息的時(shí)候,先將圖片轉(zhuǎn)換成為byte數(shù)組,包裝在信息包種發(fā)送出去,接收到

46、圖片信息時(shí),從byte數(shù)組構(gòu)建圖片,顯示出來(lái)。圖片和byte之間相互轉(zhuǎn)換的關(guān)鍵代碼如下:/將image轉(zhuǎn)換成 bytepublic byte imageToBytes(Image img)ByteArrayOutputStream bos=new ByteArrayOutputStream();try ImageIO.write(RenderedImage) img, jpg, bos); catch (IOException e) e.printStackTrace();return bos.toByteArray();/將 byte轉(zhuǎn)換成imagepublic Image bytesToI

47、mage(byte b)try return ImageIO.read(new ByteArrayInputStream(b); catch (IOException e) e.printStackTrace();return null;在JtextPane中顯示圖片的代碼:if(m.getMsgType().intValue()=MessageType.message_img)/圖片信息String str=m.getSenderAccount() + +m.getTime()+ n;try /顯示發(fā)送人 和時(shí)間docs.insertString(docs.getLength(), str,

48、 attrset);/設(shè)置光標(biāo)到末尾output_pane.setCaretPosition(docs.getLength();output_pane.insertIcon(new ImageIcon(m.getImg();docs.insertString(docs.getLength(), n, attrset);/設(shè)置光標(biāo)到末尾output_pane.setCaretPosition(docs.getLength(); catch (BadLocationException e) e.printStackTrace();在客戶端顯示截圖示例:圖 5-5 聊天截圖2)服務(wù)端代碼 服務(wù)端接收

49、到客戶端的信息后,只需要根據(jù)他的接收人,進(jìn)行轉(zhuǎn)發(fā)就可以。關(guān)鍵代碼如下: Message m = (Message) receive();/ 如果是普通信息if (m.getMsgType() = MessageType.message_comm_Value() System.out.println(m.getSenderAccount() + send to+ m.getReceiverAccount() + at + m.getTime();Integer receiverAccount = m.getReceiverAccount();ClientThread t = Cli

50、entThreadManager.getClientThread(receiverAccount);if (t = null) /不在線就暫時(shí)存儲(chǔ)在服務(wù)器上OffLineMsgManager.putSingle(receiverAccount, m); elset.send(m);5.55.5 文件模塊文件模塊5.5.1 流程圖選擇文件請(qǐng)求發(fā)送文件確定接收選擇存放目錄對(duì)方拒絕接收同意接收發(fā)送文件接收文件圖 5-6 發(fā)送文件流程圖5.5.2 關(guān)鍵代碼1)客戶端代碼在客戶端采用 JfileChooser 來(lái)瀏覽本地文件,點(diǎn)擊瀏覽按鈕后,會(huì)彈出對(duì)話框,讓用戶選擇文件,然后將文件名,大小等信息封裝在數(shù)

51、據(jù)包里,發(fā)送出去。關(guān)鍵代碼如下:Overridepublic void mouseClicked(MouseEvent e) fileDialog.setDialogTitle(選擇文件);fileDialog.showOpenDialog(IMChat.this);/只能選中文件fileDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);f=fileDialog.getSelectedFile();/發(fā)送數(shù)據(jù)包,請(qǐng)求發(fā)送文件Message m = new Message();m.setMsgType(MessageType.message

52、_file);m.setSenderAccount(ownerId);m.setReceiverAccount(Integer.parseInt(hideButton.getText(); SimpleDateFormat s = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);/發(fā)送時(shí)間m.setTime(s.format(new java.util.Date();m.setFileName(f.getName();/文件名m.setState(2);/請(qǐng)求發(fā)送文件int length=(int) (f.length()/1000);m.setLength

53、(length);/文件大小sendMessage(m);對(duì)方會(huì)顯示提示信息:圖 5-7 詢問(wèn)接收文件圖如果對(duì)方同意接收則開啟線程。因?yàn)槲募赡鼙容^大,所以不能一次性發(fā)送,只能用線程分批發(fā)送。線程關(guān)鍵代碼如下:正常發(fā)送文件:圖 5-8 文件傳輸圖Overridepublic void run() try int num ;/bar.setStringPainted(true);JProgressBar bar=chat.getProgressBar();m.setMsgType(MessageType.message_file);m.setFileName(f.getName();Buffer

54、edInputStream bos=new BufferedInputStream(new FileInputStream(f);while(num = bos.read(b) != -1)m.setFileByte(b);Manager.THREAD.send(m);int value=LENGTH/10000;bar.setValue(bar.getValue()+value);bar.setVisible(false);/bar.setValue(0);/發(fā)送完畢SimpleDateFormat s = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);

55、m.setTime(s.format(new java.util.Date();m.setState(4);Manager.THREAD.send(m);/在窗口上顯示發(fā)送成功chat.append(new Color(0,0,255), 文件+f.getName()+( +f.length()/1000000+M)+發(fā)送成功+n); catch (FileNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated c

56、atch blocke.printStackTrace();發(fā)送完成后,雙方的界面上都會(huì)顯示成功信息:圖 5-9 文件傳輸成功圖客戶端接收文件的邏輯:文件的傳輸狀態(tài)被定義成了這幾種:0是不接受文件,1是接受文件,2請(qǐng)求發(fā)送文件,3文件傳輸中,4文件傳送完成客戶端接收文件是可根據(jù)這些狀態(tài),進(jìn)行操作,關(guān)鍵代碼如下:/請(qǐng)求發(fā)送包if(m.getState()=2) /對(duì)話框 是否接收 int i=JOptionPane.showConfirmDialog(chat, 確定接收 + m.getFileName()+( +m.getLength()+KB), 接收文件,JOptionPane.YES_N

57、O_OPTION); Integer sender=m.getReceiverAccount(); Integer getter=m.getSenderAccount(); m.setSenderAccount(sender); m.setReceiverAccount(getter); /同意就發(fā)送同意接收數(shù)據(jù)包 if(i=JOptionPane.YES_OPTION) /打開保存文件對(duì)話框 JFileChooser jfc=new JFileChooser(c:/); jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int

58、mod=jfc.showSaveDialog(chat); if(mod=JFileChooser.APPROVE_OPTION) /如果選擇了路徑 File f=jfc.getSelectedFile(); f=new File(f.getAbsolutePath()+/+m.getFileName(); bos=new BufferedOutputStream(new FileOutputStream(f); m.setState(1); send(m); else /選擇了取消或關(guān)閉對(duì)話框 m.setState(0); send(m); else m.setState(0); send(

59、m); else if(m.getState()=3)/正在傳輸包byte b=m.getFileByte();/設(shè)置進(jìn)度條chat.getProgressBar().setVisible(true);chat.getProgressBar().setMaximum(m.getLength()/10);chat.getProgressBar().setMinimum(0);bos.write(b);else if (m.getState()=0)/不同意發(fā)送JOptionPane.showMessageDialog(chat, 對(duì)方拒絕接收文件, 通知, JOptionPane.WARNING

60、_MESSAGE);else if (m.getState()=1)/同意發(fā)送System.out.println(同意發(fā)送);chat.SendFile();else if(m.getState()=4)System.out.println(m.getFileName()+傳輸完成);chat.getProgressBar().setVisible(false);chat.append(new Color(0,0,255), 文件+m.getFileName()+( +m.getLength()/1000+M)+接收完成+n); 2)服務(wù)器端代碼:服務(wù)端只負(fù)責(zé)轉(zhuǎn)發(fā),關(guān)鍵代碼如下:else i

溫馨提示

  • 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)論