基于Java的仿QQ聊天系統(tǒng)(共41頁)_第1頁
基于Java的仿QQ聊天系統(tǒng)(共41頁)_第2頁
基于Java的仿QQ聊天系統(tǒng)(共41頁)_第3頁
基于Java的仿QQ聊天系統(tǒng)(共41頁)_第4頁
基于Java的仿QQ聊天系統(tǒng)(共41頁)_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 JISHOUUNIVERSITY專業(yè)課課程(kchng)論文題 目:基于Java的仿QQ聊天系統(tǒng)“MINI Q”的設(shè)計與實現(xiàn)作 者:學(xué) 號:所屬學(xué)院:信息科學(xué)與工程學(xué)院專業(yè)年級:總 評 分:完成時間:吉首大學(xué)(dxu)信息科學(xué)與工程學(xué)院基于Java的仿QQ聊天(lio tin)系統(tǒng)“MINI Q”的設(shè)計(shj)與實現(xiàn)摘 要隨計算機網(wǎng)絡(luò)的迅速發(fā)展,對人類社會諸多領(lǐng)域產(chǎn)生了巨大的影響。尤其是,隨著信息時代的來臨,人與人之間愈來愈趨向于通過網(wǎng)絡(luò)來交流和傳遞信息。而聊天系統(tǒng)(xtng)正是當前人們使用最多的中介。在這個平臺上,許多認識或不認識的人們彼此間能夠隨意的相互交流。因此,開發(fā)和架構(gòu)這種平臺

2、符合時代發(fā)展的需要。本系統(tǒng)在開發(fā)中用到了局域網(wǎng)通信機制的原理,通過直接繼承Thread類來建立多線程。開發(fā)中利用了計算機網(wǎng)絡(luò)編程的基本理論知識CP/IP協(xié)議、客戶端/服務(wù)器端模式(Client/Server模式)、網(wǎng)絡(luò)編程的設(shè)計方法等。在網(wǎng)絡(luò)編程中對信息的讀取、發(fā)送,是利用流來實現(xiàn)信息的交換,其中介紹了對實現(xiàn)一個系統(tǒng)的信息流的分析,包含了一些基本的軟件工程的方法。關(guān)鍵詞:Socket;客戶端;服務(wù)器端;Thread;鏈接(connection)目 錄 TOC o 1-3 h z u HYPERLINK l _Toc338802413 第一章引言(ynyn) 第一章引言(ynyn)1.1課題(k

3、t)背景、意義(yy)及現(xiàn)狀交流對于人類社會及其每個成員都至關(guān)重要。直接交流的方式包括語言、文字等,而遠程交流還需借助于一些先進的工具如電話、網(wǎng)絡(luò)等。本課題研究的是支持內(nèi)部網(wǎng)絡(luò)交流的系統(tǒng)。當今主流的即時聊天工具有QQ,MSN Messenger,Yahoo Messenger等,國內(nèi)最熱門的當屬Q(mào)Q, QQ是深圳市騰訊計算機系統(tǒng)有限公司開發(fā)的一款基于Internet的即時通信(IM)軟件。騰訊QQ支持在線聊天、視頻電話、點對點斷點續(xù)傳文件、共享文件、網(wǎng)絡(luò)硬盤、自定義面板、QQ郵箱等多種功能,并可與移動通訊終端等多種通訊方式相連。1999年2月,騰訊正式推出。第一個即時通信軟件“騰訊QQ”,QQ

4、在線用戶由1999年的2人(2人指馬化騰和張志東)到現(xiàn)在已經(jīng)發(fā)展到上億用戶了,在線人數(shù)超過一億,是目前使用最廣泛的聊天軟件之一。QQ不僅僅是簡單的即時通信軟件,它與全國多家尋呼臺、移動通信公司合作,實現(xiàn)傳統(tǒng)的無線尋呼網(wǎng)、GSM移動電話的短消息互聯(lián),是國內(nèi)最為流行功能最強的即時通信(IM)軟件,使QQ不僅僅是單純意義的網(wǎng)絡(luò)虛擬呼機,而是一種方便、實用、超高效的即時通信工具。QQ可能是現(xiàn)在在中國被使用次數(shù)最多的通訊工具。 它可以在2000/XP/2003/Win7/Win8操作系統(tǒng)下運行,是十分靈活的網(wǎng)絡(luò)尋呼工具。它會自動檢查您是否已聯(lián)網(wǎng),如果您的電腦已連入Internet,可以搜索網(wǎng)友、顯示在線

5、網(wǎng)友,可以根據(jù)QQ號、昵稱、姓名、email地址等關(guān)鍵詞來查找,找到后可加入到通訊錄中。當您的通訊錄中的網(wǎng)友在線時,QQ中朋友的頭像就會顯示在線,根據(jù)提示就可以發(fā)送信息,如果對方登記了尋呼機或開通了GSM手機短消息,即使離線了,您也可及時將信息傳遞給您的好友。雖然以上這些軟件是免費的,并且功能越來越強大。但是它們的唯一的不足就是必須要聯(lián)網(wǎng)或者下載到它們的服務(wù)端,要不然是沒法脫離Intenet使用的。為了能在一個沒有連接到Intenet的局域網(wǎng)使用聊天工具,那就必須要有服務(wù)器端。本系統(tǒng)就是包括服務(wù)器端與客戶端,可以在局域網(wǎng)聊天的一個工具。1.2 涉及(shj)的相關(guān)技術(shù)及協(xié)議1.2.1 JAVA

6、語言(yyn)經(jīng)過認真的討論分析,綜合各種計算機高級語言(yyn)的特征和適應(yīng)范圍,最終決定選擇純面向?qū)ο蟮腏ava語言來完成課題的設(shè)計,下面就技術(shù)可行性方面,對 Java語言作一簡要介紹。Sun公司的口號就是“網(wǎng)絡(luò)就是計算機”,Java能使所有東西從桌面計算平穩(wěn)的轉(zhuǎn) 變?yōu)榛诰W(wǎng)絡(luò)的計算,它是專門為此而建立的,并顯然是為了完成這個任務(wù)而來的。使用 Java 語言,可以相對輕松的一天編寫一個有條理的網(wǎng)絡(luò)程序。今天,Java的網(wǎng)絡(luò) 功能正在飛躍發(fā)展,不斷有新的特性增加到這個有價值的基礎(chǔ)上,JavaSoft 實驗室正 在不斷努力使Java更加完善。就Java語言的主要特點,本人歸納如下:Java程序

7、設(shè)計的開發(fā)過程與運行環(huán)境 Java是解釋型的高級編程語言,所以 Java 程序的開發(fā)通常需要經(jīng)過編寫源程序、 編譯生成字節(jié)碼和運行三個過程。 這里要提到,Java應(yīng)用程序的開發(fā)周期包括編譯、下載、解釋和執(zhí)行幾個部分。Java編譯程序?qū)ava源程序翻譯為JVM 可執(zhí)行代碼字節(jié)碼。這一編譯過程同C/C+的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬件平臺運行而產(chǎn)生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉(zhuǎn)換為特定的內(nèi)存偏移量,以保證程序運行。Java編譯器卻不將對變量和方法的引用編譯為數(shù)值引用,也不確定程序執(zhí)行過程中的內(nèi)存布局,而是將這些符號引用信息

8、保留在字節(jié)碼中,由解釋 器在運行過程中創(chuàng)立內(nèi)存布局,然后再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。1.2.2 C/S模式介紹20世紀90年代出現(xiàn)并迅速占據(jù)主導(dǎo)地位的一種計算模式為客戶機/服務(wù)器模式,簡稱為C/S 模式,它實際上就是把主機終端模式中原來全部集中在主機部分的任務(wù)一分為二,保留在主機上的部分負責(zé)集中處理和匯總運算,成為服務(wù)器;而下放到終端的部分負責(zé)為用戶提供友好的交互界面,稱為客戶機。 相對于以前的模式,C/S模式最大的改進是不再把所有軟件都裝進一臺計算機,而是把應(yīng)用系統(tǒng)分成兩個不同的角色和兩個不同的地位:一般在運算能力較強的計算機上安裝服務(wù)器

9、端程序,而在一般的PC上安裝客戶機程序。正是由于個人 PC 機的出現(xiàn)使客戶機/服務(wù)器模式成為可能,因為 PC 機具有一定的運算能力,用它代替了上面第一種模式的啞終端后,就可以把主機端的一部分工作放在客戶機端完成,從而減輕了主機的負擔(dān),也增加了系統(tǒng)對用戶的響應(yīng)速度和響應(yīng)能力??蛻魴C和服務(wù)器之間通過相應(yīng)的網(wǎng)絡(luò)協(xié)議來進行通訊。客戶機向服務(wù)器發(fā)出數(shù)據(jù) 請求,服務(wù)器將數(shù)據(jù)傳送給客戶機進行計算,計算完畢,計算結(jié)果可返回給服務(wù)器。這種模式的優(yōu)點充分利用了客戶機的性能,使計算能力大大提高;另外,由于客戶機和服務(wù)器之間的通訊是通過網(wǎng)絡(luò)協(xié)議進行的,是一種邏輯的聯(lián)系,因此物理上在客戶機和服務(wù)器兩端是易于擴充的。C/

10、S模式是目前占主流的網(wǎng)絡(luò)計算模式。該模式在操作過程中采取的是主動請示方式: 首先(shuxin)服務(wù)器方要先啟動(qdng),并根據(jù)請示提供相應(yīng)服務(wù)(過程如下) : (1)打開一個通信通道同時通知(tngzh)本地主機,服務(wù)器愿意在某一個公認地址上接收客戶請求。 (2)等待某個客戶請求到達該端口。 (3)接收到重復(fù)服務(wù)請求,處理該請求并發(fā)送應(yīng)答信號。 (4)返回第二步,等待另一客戶請求。 (5)關(guān)閉該服務(wù)器。 客戶端: (1)打開一個通信通道,并連接到服務(wù)器所在主機的特定端口。 (2)向服務(wù)器發(fā)送服務(wù)請求報文,等待并接收應(yīng)答;繼續(xù)提出請求。(3)請求結(jié)束后關(guān)閉通信通道并終止。 分布運算和分布管

11、理是客戶機/服務(wù)器模式的特點。最后選擇了 C/S 模式。基于Java的仿QQ聊天程序“MINI Q”的設(shè)計與實現(xiàn)第二章系統(tǒng)分析2.1 可行性分析(fnx)(1)經(jīng)濟可行性:本系統(tǒng)需要一個oracle數(shù)據(jù)庫服務(wù)器,由于使用人數(shù)比較少,安裝一個免費的oracle數(shù)據(jù)庫完全可以應(yīng)付需要,所以成本(chngbn)就不用考慮了。(2)操作可行性:只要一臺以上計算機連接在同一個局域網(wǎng)內(nèi),本系統(tǒng)就可以安裝使用,所以(suy)操作上完全不存在問題。(3)技術(shù)可行性:本系統(tǒng)采用Java語言,是基于CS架構(gòu)的。開發(fā)這個系統(tǒng)需要開發(fā)者對socket編程和java Swing這兩方面的技術(shù)比較熟。由于本人長期從事于j

12、ava語言編程,所以技術(shù)方面是可行的。2.2 需求分析2.2.1 功能分析本系統(tǒng)要實現(xiàn)的功能如下:1)注冊服務(wù)器收到用戶的注冊請求,便開始(kish)接受客戶傳遞的信息,諸如客戶的呢稱,性別,籍貫,個人資料等,接受完畢后,便通過Jdbc-Odbc與后臺數(shù)據(jù)庫連接,然后向數(shù)據(jù)庫添加記錄,如果成功,便向客戶返回其號碼。客戶收到服務(wù)器返回的信息后,便打開主登陸窗口。2)登陸(dng l)在客戶端,用戶輸入其號碼和密碼,然后建立(jinl)與服務(wù)器的連接,告訴服務(wù)器我要登錄,服務(wù)器收到后,開始通過JdbcOdbc讀取數(shù)據(jù)庫,然后與用戶輸入的信息比較,如果成功,便打開主程序窗口。然后客戶向服務(wù)器請求讀取

13、好友名單,服務(wù)器收到該請求,開始讀取數(shù)據(jù)庫中的表,得到好友的號碼后,再在icq表中讀取好友資料,然后向客戶端發(fā)送這些信息,客戶收到后就在主窗口顯示好友,并且建立幾個矢量(Vector)用以存儲好友的呢稱,號碼。3)私聊私聊就是兩個聊天??蛻舳耸紫劝l(fā)送消息到服務(wù)器端,服務(wù)器端根據(jù)發(fā)送人信息和接收者信息來轉(zhuǎn)發(fā)。例如服務(wù)器接收到一個A發(fā)給B的消息先判斷B是否已經(jīng)在線,如果在線就將信息發(fā)送過去。B接收到A發(fā)來的信息,如果是未建立對話窗口,就詢問是否建立對話,否則就丟棄信息。4)群聊群聊,就是多人一起聊天。過程與私聊差不多。唯一的不同就是服務(wù)器會將信息轉(zhuǎn)發(fā)給指定群的所有成員。5)創(chuàng)建分組用戶注冊以后默認

14、的好友分組只有一個。用戶在執(zhí)行添加分組操作以后,客戶端分將一個這個動作的信息發(fā)送給服務(wù)器端(主要是FromClientlisten)。服務(wù)器端的fromClientListen接收到這個請求,會進行數(shù)據(jù)庫操作,將要添加的分組信息插入到數(shù)據(jù)庫中。如果成功,則返回這個分組的信息給客戶端,否則返回錯誤提示信息。6)創(chuàng)建群用戶注冊以后群個數(shù)為0。用戶在執(zhí)行添加群操作以后,客戶端分將一個這個動作的信息發(fā)送給服務(wù)器端(主要是FromClientlisten)。服務(wù)器端的fromClientListen接收到這個請求,會進行數(shù)據(jù)庫操作,將要添加的群信息插入到數(shù)據(jù)庫中。如果成功,則返回這個群的信息給客戶端,否

15、則返回錯誤提示信息。7)查找好友并加為好友輸入要查找的用戶ID號,客戶端發(fā)送一個查詢信息給服務(wù)器端,如果找到就返回用戶服務(wù)信息。打開一個用戶信息顯示界面,該界面會提供一個“添加為好友”按鈕,點擊后可將此人加為好友。如果未找到,彈出一個信息提示框。8)查找(ch zho)群并加入群輸入要查找(ch zho)的群ID號,客戶端發(fā)送一個查詢信息給服務(wù)器端,如果找到就返回用戶服務(wù)信息。打開一個群信息顯示界面,該界面會提供一個“加入(jir)此群”按鈕,點擊后可將此人加為好友。如果未找到,則彈出一個信息提示框。9)文件共享在啟動文件傳輸服務(wù)器的共享文件功能之前,要設(shè)置它的IP號和端口,如果設(shè)置不好。好友

16、將無法下看到這些共享的文件。還有一個重要的步驟就是添加共享文件或目錄。最后啟動文件共享。10)下載文件使用文件傳輸?shù)目蛻舳艘_配置好服務(wù)器的IP和端口號,以及下載好的文件的存放目錄。如果其中之一配置不好,文件下載將會失敗。設(shè)置好以后,點擊“連接”按鈕,如果配置正確,這時將會看到服務(wù)器共享的文件。目前不能支持文件夾下載,當看到一個文件夾以后,可以雙擊該文件夾并查看文件夾里面的文件。2.2.2 性能分析本系統(tǒng)由于采用免費的oracle數(shù)據(jù)庫軟件,連接數(shù)最多不能超過200,所以并發(fā)訪問數(shù)據(jù)庫的人數(shù)不能超過200人。2.2.3 用例圖2.2.4 時序(sh x)圖客戶登陸、注冊(zhc)時的服務(wù)器端

17、時序圖本圖(bn t)說明:服務(wù)器接每次與一個客戶連接以后,就會去創(chuàng)建一個監(jiān)聽線程。通過線程來接收客戶端發(fā)送的所有數(shù)據(jù)。如果要查詢數(shù)據(jù)庫,監(jiān)聽線程會請求獲得一個數(shù)據(jù)庫連接.如果數(shù)據(jù)庫連接已經(jīng)獲得,就把連接交給DBOperation對象,通過此對象可以返回給監(jiān)聽線程必要的結(jié)果。最后監(jiān)聽線程會通過Socket將結(jié)果返回給客戶端。2.2.5 活動圖1)用戶登陸活動圖(見右圖)本圖(bn t)說明:首先填寫登陸信息,提交以后服務(wù)器會對用戶名和密碼進行驗證。如果不正確,返回一個提示信息。如果登陸成功,就更新在線狀態(tài)。通知所有好友自己已經(jīng)上線。2)客戶(k h)之間的通信活動圖本圖說明:短消息發(fā)送以后,服

18、務(wù)器端對應(yīng)的監(jiān)聽線程會接收到一個數(shù)據(jù)包。此包中包含接收者的信息,如果(rgu)接收者在線,數(shù)據(jù)包將會轉(zhuǎn)發(fā)到接收者。如果不在線,就寫入數(shù)據(jù)庫。3)客戶之間的文件傳送活動圖 本圖說明:客戶端向服務(wù)器發(fā)送文件下載請求。如果服務(wù)器端同意下載,就讀取文件流并將數(shù)據(jù)流寫入到客戶端??蛻舳俗x取到文件名之后,立刻創(chuàng)建一個新的文件并將讀取的數(shù)據(jù)寫入到文件中。4)新增好友活動(hu dng)圖根據(jù)好友ID號查找好友,如果此ID存在,就將用戶(yngh)信息發(fā)送到客戶端。同時將好友關(guān)系寫入到數(shù)據(jù)庫。5)刪除(shnch)好友活動圖此圖說明:客戶向服務(wù)器發(fā)送刪除好友請求(qngqi)。服務(wù)器接收到刪除好友請求以后,將

19、好友關(guān)系從數(shù)據(jù)庫中刪除。第三章總體設(shè)計3.1 功能模塊圖本系統(tǒng)主要由由兩個(lin )子系統(tǒng)組成:1)文件傳輸系統(tǒng)(xtng);2)聊天子系統(tǒng)。文件傳輸系統(tǒng)(xtng)的功能主要有:1)共享文件;2)查看并下載文件。聊天子系統(tǒng)的功能有:1)注冊;2)登陸;3)添加群;4)查找群;5)私聊;6)群聊;7)查看好友資料;8)查找好友;9)添加好友;10)創(chuàng)建好友分組。3.2 數(shù)據(jù)庫設(shè)計(shj)3.2.1 E-R圖用戶(yngh)表(QQUser):屬性(shxng):id,account(登陸賬號),pwd,nickname,sign(個性簽名),sex,email,head(頭像)關(guān)系: 一個

20、用戶可以有多個好友分組。 一個用戶可以有多個群。 一個用戶可以有多條留言。好友分組表(Qqperson_group):屬性(shxng):id,userid(創(chuàng)建者ID),name(分組名) 關(guān)系:一條(y tio)記錄只對應(yīng)一個用戶,但是可以擁有多個組成員。群表(Qqpublic_group):屬性(shxng):id,userid(創(chuàng)建者ID號),name(群名),sign(群公告)關(guān)系:一個群只有一個創(chuàng)建者,但是可以擁有多個群成員。3.2.2 表結(jié)構(gòu)設(shè)計客戶信息表(qquser)1自動id號Id整數(shù)2用戶賬號Account整數(shù)3用戶密碼Pwd字符4用戶昵稱Nickname字符5用戶簽名s

21、ign字符6用戶性別Sex字符7用戶郵箱email字符8用戶頭像Head字符Qq消息(xio xi)表(QQMessage)1自動IDID整數(shù)2發(fā)信人Account_from整數(shù)3收信人Account_to整數(shù)4發(fā)送內(nèi)容Content字符用戶(yngh)分組表(qqpersongroup)1自動IDID整數(shù)2擁有者Iduserid整數(shù)3分組名稱name字符公共(gnggng)群表(qqpublic_group)1自動IDID整數(shù)2創(chuàng)建人userid整數(shù)3群名稱name整數(shù)4群的公共消息sign字符用戶與群的中間表(qquser_publicgroup)1自動IDID整數(shù)2加入的群IDgroup

22、id整數(shù)3加入的用戶的IDuserid整數(shù)用戶與分組的中間表(QQuser_persongroup)1自動IDID整數(shù)2加入的分組的idgroupid整數(shù)3加入分組的用戶的iduserid整數(shù)以上各表創(chuàng)建的代碼如下:1)創(chuàng)建用戶表create table qquser(number primary key,account number unique,nickname varchar(100),sign varchar(500),sex varchar(10),email varchar(100),head varchar(200);2)創(chuàng)建(chungjin)分組表create table q

23、qperson_Group(id number primary key,userid references qquser(id),name varchar(100);3)創(chuàng)建(chungjin)群表create table qqpublic_group(id number primary key,userid number references qquser(id),name varchar(100),sign varchar(800);4)創(chuàng)建(chungjin)消息表create table qqmessage(id number primary key,account_from numb

24、er,account_to number,content varchar(1000);5)創(chuàng)建用戶與群的中間表create qquser_publicgroup (id number primary key,groupid number references qqpublic_group(id) ,userid references qquser(id););6)創(chuàng)建用戶與分組的中間表create qquser_persongroup(id number primary key,groupid number references qqpublic_group(id) ,userid refer

25、ences qquser(id);7)為用戶表插入數(shù)據(jù)insert into qquser values(1,1,long,Im long,male,48.gif);insert into qquser values(2,2,a,aa,male,48.gif);insert into qquser values(3,3,b,bb,male,48.gif);insert into qquser values(4,4,c,cc,male,48.gif);insert into qquser values(5,5,d,dd,male,48.gif);8)為分組表和群表插入(ch r)數(shù)據(jù)insert

26、 into qqperson_group values(1,1,my friend);into qqpublic_group values(1,1,ha ha,my new group);9)為用戶與群中間表插入(ch r)數(shù)據(jù)insert into qqperson_group(1,1,1);insert into qqperson_group(1,1,2);insert into qqperson_group(1,1,3);insert into qqperson_group(1,1,4);insert into qqperson_group(1,1,5);10)為用戶與分組中間(zhng

27、jin)表加入數(shù)據(jù)insert into qqpublic_group(1,1,1);insert into qqpublic_group(1,1,2);insert into qqpublic_group(1,1,3); into qqpublic_group(1,1,4);insert into qqpublic_group(1,1,5);3.3類圖Socket:非自定義類,.Socket。Thread: 非自定義類,java.util.Thread。Client:負責(zé)具體(jt)發(fā)送和接收數(shù)據(jù)。FromServerListen:監(jiān)聽(jin tn)服務(wù)器是否在發(fā)送數(shù)據(jù)。MainFrame

28、系統(tǒng)的主界面(jimin)(包括用戶列表等)。QQUserInfo包括用戶的好友分組信息和群信息。QQUserClass包括用戶的個人信息,如ID、用戶名等。第四章 詳細(xingx)設(shè)計及實現(xiàn)(shxin)4.1 界面設(shè)計1)登陸(dng l)界面本界面需要填寫的有兩個,一個是用戶賬號,另一個是用戶密碼。在客戶端,用戶輸入其號碼和密碼,然后建立與服務(wù)器的連接,告訴服務(wù)器我要登錄,服務(wù)器收到后,開始通過Jdbc方式讀取數(shù)據(jù)庫,然后與用戶輸入的信息比較,否則返回錯誤,如果客戶收到成功信息就打開主窗口,否則提示出錯。如果成功,便打開主程序窗口。然后客戶向服務(wù)器請求讀取好友名單,服務(wù)器收到該請求,開

29、始讀取數(shù)據(jù)庫中的friend表,得到好友的號碼后,再在好友表中讀取好友資料,然后向客戶端發(fā)送這些信息,客戶收到后就在主窗口顯示好友,并且建立幾個Vector用以存儲好友的信息。2)注冊界面本界面要填寫的項目包括:用戶昵稱,密碼,郵件地址,個性簽名。需要選擇的項目包括:性別,頭像。本界面主要負責(zé)將用戶的信息包裝成一個QQUserClass對象。注冊按鈕一旦被點擊,就會試圖創(chuàng)建一個與服務(wù)器端的連接。連接創(chuàng)建成功就會將填寫的信息發(fā)送到服務(wù)器端。如果服務(wù)器寫入數(shù)據(jù)庫成功,就回返回一個賬號。使用這個賬號,用戶可以登陸到系統(tǒng)中。3)主界面(jimin)(如右圖)主界面是系統(tǒng)的核心部分。它可以列出所有好友和

30、客戶所有加入的群,也可以提供共享文件和文件下載功能。如果用戶服務(wù)雙擊好友分組或群,好友列表或群成員列表將會顯示出來。雙擊一個好友,可以與他進行(jnxng)私聊。雙擊一個群成員,可以與群里的所有成員對話。本界面還提供了以下右鍵菜單:添加好友分組、查找好友并加為好友、查找群并加為群、創(chuàng)建群、移動好友到其它分組、查看好友資料、查看群資料。4)個人資料界面(jimin)(如下圖)該界面主要顯示某個用戶信息,包括用戶的賬號,昵稱,性別,個性簽名,用戶等級等。本界面還提供了一個“加為好友”按鈕,如果點擊它,此人將會被加為用戶的好友。默認的是加到第一個好友列表,不過也可以移動其它好友分組。5)文件傳輸服務(wù)

31、器端界面(jimin)該界面(jimin)使用的步驟為:第一步:設(shè)置好服務(wù)器的IP,端口。IP一定要是本機的IP,如果是單機測試,IP可以(ky)填寫“”。端口號盡量不要小于2000,小于兩千的端口可能被系統(tǒng)占用。設(shè)置完后點擊“確定”按鈕。第二步:添加共享文件。單擊“添加文件共享”按鈕,將需要共享的文件或文件夾添加到共享列表中。第三步:點擊“啟動文件發(fā)送服務(wù)”。第四步:如果共享文件完畢,需要點擊“退出”。6)文件傳輸客戶端界面使用文件傳輸?shù)目蛻舳艘_配置好服務(wù)器的IP和端口號,以及下載好的文件的存放目錄。如果其中之一配置不好,文件下載將會失敗。設(shè)置好以后,點擊“連接”按鈕,如果配置正確,這時

32、將會看到服務(wù)器共享的文件。目前不能支持文件夾下載和多文件下載,當看到一個文件以后,可以雙擊該文件夾并查看文件夾里面的文件。7)私聊界面(jimin)本界面主要用來顯示兩個人的對話信息以及發(fā)送(f sn)信息。發(fā)送的信息可以設(shè)置字體,大小,字體顏色。也可以發(fā)送一個QQ表情。8)群聊界面(jimin)本界面主要用來顯示多人的對話信息以及發(fā)送信息。發(fā)送的信息可以設(shè)置字體,大小,字體顏色。也可以發(fā)送一個QQ表情。右邊顯示的是群公告,可以用來公布一些必要的信息。4.2 數(shù)據(jù)(shj)輸入輸出設(shè)計4.2.1 數(shù)據(jù)(shj)輸入登陸(dng l)界面數(shù)據(jù)的輸入要求Number(賬號)輸入的必須是整型,它是一

33、個用戶登陸的賬號。Password(密碼)可以是你設(shè)置好的字符串,字符串內(nèi)容可以隨便。如果用戶設(shè)置不正確,將會導(dǎo)致登陸不成功,系統(tǒng)會彈出相應(yīng)的對話框。注冊界面的輸入Nickname(昵稱),password(密碼),sign(個性簽名)可以是任意的字符串。Email必須是Email地址格式,也就是中間必須含有“”,否則提示輸入不正確。共享界面的輸入服務(wù)器IP:填入本機的IP地址,格式如:53端口號:隨便一個可以未被占用的端口都行(最好是2000以上)。4.2.2 數(shù)據(jù)輸出用戶注冊的信息必須寫入數(shù)據(jù)庫中。下載的文件存放到的指定的目錄中,如果未指定就存放到默認路徑中,當默認路徑不存在的時候給提示用

34、戶路徑不存在。4.3 代碼實現(xiàn)4.3.1 服務(wù)器端設(shè)計連接池的設(shè)計連接池,就是生產(chǎn)一定數(shù)量的數(shù)據(jù)庫連接存儲在一個容器中,等待程序來索取,當這個容器器中的數(shù)據(jù)庫連接全部被使用完的時候,就立即再產(chǎn)生指定數(shù)量的數(shù)據(jù)庫連接。這樣做的優(yōu)點就是可以充分利用資源,減少創(chuàng)建和關(guān)閉所帶來的資源消耗。在程序中它是以一個集合來存儲這些連接的。如果訪問的程序過多,而連接又少,連接池可以迅速增加多個連接以供程序需求。如果連接需求量超出連接池所設(shè)定的最高值。連接池將不理會程序的請求。連接池主要(zhyo)由以下幾個類創(chuàng)建:(1)poolSperties 該文件(wnjin)的內(nèi)容如下:poolname=QQPooluse

35、r=rootpassword=rooturl=jdbc:mysql:/:3306/javaqqdriver=org.gjt.mm.mysql.Driverminconn=5reuse=20maxconn=1000logfile=c:/QQPool.log第一行聲明要創(chuàng)建的數(shù)據(jù)庫連接池的名字。第二行是訪問數(shù)據(jù)庫的用戶名。第三行是訪問數(shù)據(jù)庫的密碼。第四行是訪問(mysql)數(shù)據(jù)庫的url。第五行是聲明驅(qū)動程序所在的類全名。第六行設(shè)定了數(shù)據(jù)庫連接池中最少應(yīng)保持的連接數(shù)。第七行設(shè)定了一個連接(Connection)最多可重復(fù)使用的次數(shù)。第八行設(shè)定了連接池是最多創(chuàng)建的連接數(shù)。第九行聲明了一個日志文件(該

36、日志文件記錄的是數(shù)據(jù)庫連接方面的信息)存放(cnfng)的路徑。(2)GetPoolSet.java,本程序的主要功能是獲取上一配置文件中的信息,并將獲得的信息返回給其他程序。由于代碼過多,本文并不列出源代碼只以表格的形式說明各方法的作用。GetPoolSet類的方法說明方法名作用public void setFileName(String fileName1)設(shè)置將要訪問的配置文件public GetPoolSet()創(chuàng)建一個空的獲取配置文件中信息的對象public GetPoolSet(String fileName1)根據(jù)fileName1創(chuàng)建一個能獵取配置文件中信息的對象public

37、String getSet(String name)從配置文件取得信息,并返回給調(diào)用程序(3)LogFile.java 本類主要用于記錄日志信息,當程序出現(xiàn)異常的時候就會調(diào)用此類的方法將出錯信息寫如日志文件。(4)ConnectionPool.java 本程序(chngx)主要用于創(chuàng)建數(shù)據(jù)庫連接。ConnectionPool的方法(fngf)說明方法名作用public ConnectionPool(GetPoolSet poolset)構(gòu)造器,它創(chuàng)建一個ConnectionPool對象public Connection createConnection(GetPoolSet poolset)真

38、正創(chuàng)建ConnectionPool對象的方法public Connection getConnection()獲得連接public void freeConnection(Connection conn)釋放連接,返回給連接池public void check()檢查連接是否還正常public void release()關(guān)閉連接(5)PoolManager.java連接池管理,和對外交互的類,決定連接池的生產(chǎn)(shngchn)與銷毀。PoolManager類的方法的說明方法名作用synchronized public static PoolManager getInstance(String

39、 setfile)返回某個連接池的管理對象synchronized public static PoolManager getInstance()返回默認的連接池管理對象private PoolManager(GetPoolSet poolset1)構(gòu)造器,創(chuàng)建連接池管理對象private ConnectionPool createPool(GetPoolSet poolset)創(chuàng)建連接池public Connection getConnection()獲得連接public void freeConnection(Connection connection1)釋放連接public void c

40、losemypool()關(guān)閉連接池public void release()關(guān)閉所有的連接池服務(wù)器端監(jiān)聽線程的設(shè)計服務(wù)器在監(jiān)聽到一個客戶以后,它就會創(chuàng)建一個線程去管理這個客戶。至于如何去管理這個客戶,服務(wù)器端不做任何干涉,完全由監(jiān)聽線程決定。監(jiān)聽線程主要對客戶端的請求進行響應(yīng),做到有求必應(yīng)。接收到信息后,首先判斷該信息是哪種類型,如果是要訪問數(shù)據(jù)庫服務(wù)器,則直接根據(jù)發(fā)送信息內(nèi)容操作數(shù)據(jù)庫。如果是聊天內(nèi)容,服務(wù)器會將該信息再次轉(zhuǎn)發(fā)到目的地。這些判斷將會全放部在一個線程的run方法中。4.3.2 傳遞(chund)包的設(shè)計由于請求的服務(wù)不同,包的類型應(yīng)該所區(qū)別。所以在設(shè)計(shj)的時候,應(yīng)該在包

41、中加一個存儲包類型的屬性并提供設(shè)置和獲取這個屬性的方法。以下就是對包抽象出來的應(yīng)該有的方法,所有要傳輸?shù)姆椒ū仨殞崿F(xiàn)以下接口中的方法:package javaqq.datagram;import java.io.Serializable;public interface DatagramPacket extends Serializable / define class number for the packet which need to send to otherspublic static final int MESSAGESHOW_PIC_PERSONAL = 1;public sta

42、tic final int MESSAGESHOW_PHOTO = 2;public static final int MESSAGESHOW_WORD_PERSONAL = 3;public static final int MESSAGESHOW_WORD_GROUP = 4;public static final int MESSAGESHOW_PIC_GROUP = 5;/ define class number for the packet which not need to send to otherspublic static final int DATABASEHANDLE_F

43、IND = 11;public static final int DATABASEHANDLE_DEAL = 12;public static final int DATABASEHANDLE_RESULT = 13;public static final int DATABASEHANDLE_FLAG = 14;public static final int USER_INFO = 21;public static final int USER_LOGIN = 22;public static final int USER_REGISTER = 23;public static final

44、int USER_REGISTERINFO = 24;/find infomationpublic static final int FIND_USER=31;public static final int RETURN_USERINFO=32;public static final int FIND_GROUP=33;public static final int RETURN_GROUPINFO=34;public static final int JOIN_GROUP=35;public static final int RETURN_GROUPMEMBERS=36;/ system i

45、nformationpublic static final int SYSTEM_INFO = 91;public static final int SYSTEM_ON_OR_OFFLINE = 92;public int getType();public Object getData();public long getFromuserid();/ if (getTouerid()=0),then the datapacket will be sended to serverpublic long getTouserid();public String getTalkroomid();服務(wù)器在

46、接收包的時候(sh hou),就調(diào)用它的getType()獲得type的值,并采取相應(yīng)的措施。4.3.3 聊天(lio tin)客戶端設(shè)計聊天窗口發(fā)送文件(wnjin)文字與圖片的代碼如下:/發(fā)送文字public void insertString(String s, SimpleAttributeSet attributset) Try doc.insertString(doc.getLength(), s, attributset);doc.insertString(doc.getLength(), n, null);showScroll.getVerticalScrollBar().se

47、tValue(showScroll.getVerticalScrollBar().getMaximum()+20);showText.setCaretPosition(showText.getDocument().getLength(); catch (BadLocationException e)e.printStackTrace();/發(fā)送(f sn)圖片public void insertIcon(String str) String picurl = TalkFrame.class.getResource(pic).getPath()+ File.separator;try Image

48、Icon icon = new ImageIcon(picurl + str);showText.setCaretPosition(doc.getLength();showText.insertIcon(icon);doc.insertString(doc.getLength(), n, null);showScroll.getVerticalScrollBar().setValue(showScroll.getVerticalScrollBar().getMaximum();catch (Exception e) / TODO Auto-generated catch blocke.prin

49、tStackTrace();4.3.4 文件傳輸設(shè)計(shj)文件傳輸客戶端設(shè)計(shj)從Socket中讀取數(shù)據(jù),并將數(shù)據(jù)寫入到文件中,代碼如下: while (!stop) int read = 0;if (getDis() != null) read = getDis().read(buf); / 將數(shù)據(jù)(shj)讀入緩沖區(qū),并返回讀取數(shù)據(jù)長度 System.out.println(read + read); ElseSystem.out.println(數(shù)據(jù)輸入(shr)流不存在!);break;if (read = -1) fileOut.close();break;System.o

50、ut.println(read);received += read;System.out.println(寫數(shù)據(jù)(shj)一次);/ 將緩沖區(qū)中的數(shù)據(jù)寫入文件中fileOut.write(buf, 0, read); / while文件傳輸服務(wù)端設(shè)計從文件中讀取數(shù)據(jù),并將數(shù)據(jù)發(fā)送到客戶端,代碼如下:while (!isStop() int read = 0;if (fis != null) read = fis.read(buf); / 從文件讀取部分字節(jié)數(shù)據(jù)到buf緩沖區(qū)中System.out.println(read: + read);if (read = -1) / 若讀到文件(wnji

51、n)結(jié)尾,退出break;dos.write(buf, 0, read); / 將buf緩沖區(qū)中的數(shù)據(jù)(shj)寫入網(wǎng)絡(luò)輸出流dos.flush();第五章(w zhn) 系統(tǒng)測試5.1 注冊測試輸入以下信息:注冊填寫圖,得到:(登陸賬號:46)返回注冊賬號圖5.2 登陸(dng l)測試(csh)輸入以下信息:(賬號(zhn ho):1,密碼:123)登陸填寫圖登陸成功的結(jié)果:登陸成功后的主界面圖5.3 私聊測試1)首先登陸兩個賬號,如(賬號1密碼123,賬號2密碼123)2)打開聊天窗口,如打開(d ki)兩個聊天窗口3)相互(xingh)發(fā)送信息兩人相互(xingh)發(fā)送信息圖5.4 群聊測試1)首先登陸三個賬號,如(賬號1密碼123,賬號2密碼123,賬號3密碼123)2)打開三個對話窗口3)各發(fā)一條信息(如:我是某某)結(jié)果為:群聊測試(csh)圖5.5 文件傳輸測試(csh)1)登陸賬號1密碼(m m)123,啟動文件傳輸服務(wù)器端(),設(shè)置本機IP地址,添加共享文件文件發(fā)送端測試圖2)登陸賬號2密碼(m m)123,設(shè)置服務(wù)器端口與IP,并點擊連接按鈕文件(wnjin)發(fā)送客戶端測試1 選中一個文件(wnjin)并添加到下載列表,點擊下載按鈕。文件發(fā)送客戶端測試2 成功(chnggng)下載的文件:下載(xi zi)后的文件基于Java的仿QQ聊天程序“MINI Q”

溫馨提示

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

評論

0/150

提交評論