Java即時聊天系統(tǒng)的設計與實現(xiàn)_第1頁
Java即時聊天系統(tǒng)的設計與實現(xiàn)_第2頁
Java即時聊天系統(tǒng)的設計與實現(xiàn)_第3頁
Java即時聊天系統(tǒng)的設計與實現(xiàn)_第4頁
Java即時聊天系統(tǒng)的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、c/s架構(gòu)的即時聊天系統(tǒng)的設計與實現(xiàn)摘要:隨著信息時代的飛速發(fā)展,尤其是互聯(lián)網(wǎng)技術(shù)的興起,使人們愈來愈傾向于通過網(wǎng)絡來交流、傳遞消息。網(wǎng)絡即時聊天系統(tǒng)正是這樣一個被廣泛應用的媒介。借助它,人們可以方便地進行實時對話,文件傳送等。本文以一個“即時通訊系統(tǒng)”的設計和開發(fā)為背景,詳細介紹了以java語言和mysql數(shù)據(jù)庫為平臺開發(fā)軟件系統(tǒng)的過程。系統(tǒng)的實現(xiàn)是基于tcp/ip通信協(xié)議,使用的是客戶端/服務器模式,用到了java里面的swing、多線程、jdbc、socket等高級編程技術(shù)。通過直接使用java提供的serversocket和objectinputstream等類將客戶端和服務器端發(fā)送的

2、各類消息封裝成統(tǒng)一的數(shù)據(jù)流以實現(xiàn)消息的交換。本系統(tǒng)的開發(fā)過程遵循了基本的軟件工程學的方法,實現(xiàn)了即時通訊、群組聊天、文件傳送等功能。 關(guān)鍵詞:java;數(shù)據(jù)庫;socket編程;即時通訊系統(tǒng);tcp/ip協(xié)議the instant messaging system based on c/s structureabstract: with the rapid development of the information age, especially the rise of internet technology, more and more people tend to communicate

3、 and deliver the messages through the internet.instant messaging system is such a widely used medium. with it,the real-time dialogue and file transfer can be easily carried out. taking the design and development of the instant messaging system as the background , this article describes in detail the

4、 process of developing software systems with java and mysql. the realization of the system is based on the tcp / ip communication protocol, and uses a client / server mode .many advanced java technologies such as swing ,java multi-threading, jdbc, socket programming and so on are used. by directly u

5、sing the serversocket ,objectinputstream and other classes supported in java api, messages sented by the client and server side are packaged into a uified data stream in order to achieve the exchange of messages. the whole development process of this system follows software engineering methods,and i

6、nstant messaging, group chatting, file transferring and other functions are realized.keywords: java; database; socket programming; instant messaging system; tcp/ip protocol目 錄第一章 引言11.1選題背景和意義11.2本文的主要工作2第二章 基于c/s架構(gòu)的即時通訊系統(tǒng)概述32.1系統(tǒng)的可行性分析32.2系統(tǒng)的實現(xiàn)目標和基本功能42.3系統(tǒng)開發(fā)環(huán)境和關(guān)鍵技術(shù)介紹4第三章 基于c/s架構(gòu)的即時通訊系統(tǒng)設計931系統(tǒng)詳細設計9

7、311 系統(tǒng)總體流程圖9312 系統(tǒng)總體功能模塊劃分10313 系統(tǒng)用例圖11314 系統(tǒng)數(shù)據(jù)流圖133.2 數(shù)據(jù)庫設計143.3 系統(tǒng)關(guān)鍵類結(jié)構(gòu)設計19第四章 基于c/s架構(gòu)的即時通訊系功能實現(xiàn)244.1注冊模塊功能實現(xiàn)244.2登錄模塊功能實現(xiàn)264.3聊天模塊功能實現(xiàn)284.4文件傳送模塊功能實現(xiàn)324.5后臺管理模塊功能實現(xiàn)36第五章 總結(jié)40致謝43參考文獻44第一章 引言1.1選題背景和意義隨著經(jīng)濟全球化的發(fā)展,世界各地的不同人、組織、機構(gòu)之間的聯(lián)系越來越密切。同時伴隨著互聯(lián)網(wǎng)技術(shù)的普及和發(fā)展,網(wǎng)絡即時通信工具已經(jīng)作為一種廉價、方便的信息交流工具越來越受到人們的青睞。在21世紀初的

8、短短十幾年間,即時通信系統(tǒng)(im)的發(fā)展不斷地取得了驚人的成就。從早期只能互相發(fā)送字符并顯示在雙方的屏幕上的實時通信程序到現(xiàn)在的圖形化、面向互聯(lián)網(wǎng)、多功能的即時通信系統(tǒng),科學技術(shù)的進步和整合不斷地促使著即時通信系統(tǒng)功能越來越豐富,用處越來越廣泛。從最早的即時通訊軟件icq誕生至今,市場上不斷涌現(xiàn)出類似的產(chǎn)品。不少廠商分別推出了自己的im,如騰訊qq、阿里旺旺、新浪uc、移動飛信等,這些都是我們所熟悉的pc端的即時通訊軟件。隨著智能手機、平板電腦的普及,一些移動端的即時通信系統(tǒng)也如雨后春筍般涌現(xiàn)出來,如小米公司的米聊,騰訊公司的微信,還有年輕人之間很流行的陌陌、游戲玩家常用的yy語音等。這些軟件

9、本身功能也越來越豐富,遠遠超出了單純的即時聊天系統(tǒng)的范疇?,F(xiàn)在的即時通信系統(tǒng)不僅僅是人們的溝通工具,還成為了人們利用其進行電子商務、工作、學習等交流的平臺1516。在當今社會,不管是個人用戶還是企業(yè)用戶,對溝通的需求總是在不斷地發(fā)展。傳統(tǒng)的溝通交流方式如電話、傳真、郵件等已經(jīng)不能完全滿足人們學習、工作、生活的需要。隨著計算機軟件、計算機網(wǎng)絡和移動通信技術(shù)的發(fā)展融合,集方便、廉價、快捷、實時等優(yōu)點于一身的即時通訊系統(tǒng)可以說是繼電子郵件、萬維網(wǎng)之后,互聯(lián)網(wǎng)上最具有殺傷力的應用。很難想象一臺個人電腦沒有安裝像qq這樣的即時通訊軟件。雖然即時聊天系統(tǒng)設計的初衷是聊天,但正如前面所說,其功能已經(jīng)超出了聊

10、天的范疇,隨著企業(yè)即時通訊工具(eim)的出現(xiàn),im系統(tǒng)更是成了企業(yè)信息發(fā)布、資源共享、問題探討和網(wǎng)絡營銷的一把利器。通過現(xiàn)有的技術(shù),企業(yè)完全可以摒棄通用的免費的即時通訊系統(tǒng),轉(zhuǎn)而根據(jù)自己企業(yè)的需求定制開發(fā)自己專屬的內(nèi)部即時通訊系統(tǒng),以實現(xiàn)更好的管理,提高員工的工作效率。我們的生活中溝通無處不在,即時聊天系統(tǒng)這類廣泛使用的基礎軟件的研究開發(fā)意義深遠15。1.2本文的主要工作本文圍繞一個簡單實用的即時聊天系統(tǒng)的開發(fā),詳細介紹了使用java編程語言、java api和mysql數(shù)據(jù)庫構(gòu)建一個軟件系統(tǒng)的過程。整個系統(tǒng)的分析、設計、開發(fā)、測試等過程遵循了軟件工程學的方法。論文分為如下幾個部分:第一部分

11、,闡述了對即時聊天系統(tǒng)的分析。包括系統(tǒng)的可行性分析、系統(tǒng)實現(xiàn)的目標和基本功能分析以及使用的一些關(guān)鍵技術(shù)分析。第二部分,闡述了整個系統(tǒng)的設計過程。包括系統(tǒng)總體設計、功能模塊劃分、數(shù)據(jù)庫設計和關(guān)鍵類的設計。第三部分,詳細介紹了整個系統(tǒng)的實現(xiàn)。針對每一個功能的具體實現(xiàn)展開介紹,包括使用到的開發(fā)技術(shù)、類庫,第三方jar包等等。第四部分,總結(jié)與展望。針對系統(tǒng)的優(yōu)點和不足對系統(tǒng)進行了總結(jié)與展望。第二章 基于c/s架構(gòu)的即時通訊系統(tǒng)概述2.1系統(tǒng)的可行性分析進行可行性研究就是在行動以前,對要辦的事進行調(diào)查,確認其可行與不可行,即:可行則行,不可行則止??尚行匝芯康哪康牟皇墙鉀Q問題,而是研究在當前的具體條件下

12、,開發(fā)新系統(tǒng)是否具備必要的資源和其它條件。為了達到這個目的,必須認真了解用戶的要求及現(xiàn)實環(huán)境,探索若干種可供選擇的解絕方案,并對每種解決方案的可行性進行仔細論證。一般來說應從以下幾個方面進行論證12:技術(shù)可行性:使用現(xiàn)有的技術(shù)能是否實現(xiàn)這個系統(tǒng)經(jīng)濟可行性:這個系統(tǒng)的經(jīng)濟效益是否超過它的開發(fā)成本操作可行性:系統(tǒng)的操作方式在這個用戶組織內(nèi)是否行得通 在對本系統(tǒng)的分析中,同樣是從上面三個方面入手。本系統(tǒng)的可行性分析包括以下幾個方面的內(nèi)容:(1)技術(shù)可行性:基于網(wǎng)絡通信原理,利用java提供的swing、socket等api和多線程編程、jdbc等技術(shù)可以開發(fā)出簡單實用美觀的即時聊天系統(tǒng),因此技術(shù)上是

13、可行的。(2)經(jīng)濟可行性:個人電腦和網(wǎng)絡的普及使得我們不需要太多的經(jīng)濟投入。在軟件方面,可以采用免費的ide如eclipse和輕量級數(shù)據(jù)庫mysql。無需太多的經(jīng)濟投入即可為局域網(wǎng)內(nèi)的即時通訊系統(tǒng)的實現(xiàn)提供支持。(3)操作可行性:一方面可以讓本地機同時作為客戶端和服務器實現(xiàn)一臺機器上的即時通訊。另一方面,只要一臺以上計算機連接在同一個局域網(wǎng)內(nèi),并且在作為客戶端機器的本系統(tǒng)中設置需要連接的作為服務器端機器的ip地址,本系統(tǒng)就可以實現(xiàn)局域網(wǎng)通訊,所以操作上完全不存在問題。如果要實現(xiàn)internet上通訊,理論上只需要將服務器端運行在一個有固定ip的公網(wǎng)上就可以。綜上所述,這種c/s架構(gòu)的即時通訊系

14、統(tǒng)的開發(fā)是可行的。2.2系統(tǒng)的實現(xiàn)目標和基本功能對于個人用戶而言,能夠?qū)崿F(xiàn)好友即時通訊,傳遞實時信息,讓用戶隨時隨地都可與好友保持暢快有效的溝通。對于企業(yè)用戶而言,能夠?qū)崿F(xiàn)建立員工交流平臺,統(tǒng)一信息發(fā)布平臺,減少運營成本,促進企業(yè)辦公效率。商業(yè)即時通訊系統(tǒng)的功能越來越多樣化,一些功能也很新穎,如現(xiàn)在流行的語音對講功能。本系統(tǒng)不比商業(yè)系統(tǒng),沒有考慮過多的復雜性,主要實現(xiàn)了基本的通訊功能,以滿足學習研究之用。其基本功能有用戶注冊、客戶端登錄、一對一實時聊天、群組聊天、傳送文件、服務器后臺管理。2.3系統(tǒng)開發(fā)環(huán)境和關(guān)鍵技術(shù)介紹(1)java語言簡介java是一種可以撰寫跨平臺應用軟件的面向?qū)ο蟮某绦?/p>

15、設計語言,是由sun microsystems公司于1995年5月推出的java程序設計語言和java平臺(即javase, javaee, javame)的總稱。java 技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于個人pc、數(shù)據(jù)中心、游戲控制臺、科學超級計算機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,java更具備了顯著優(yōu)勢和廣闊前景18。java之所以被開發(fā),是要達到以下五個目的2: 應當使用面向?qū)ο蟪绦蛟O計方法學 應當允許同一程序在不同的計算機平臺執(zhí)行 應當包括內(nèi)建的對計算機網(wǎng)絡的支持 應當被設計成安全地執(zhí)行遠端代碼 應

16、當易于使用,并借鑒以前那些面向?qū)ο笳Z言(如c+)的長處。java語言有著簡單、面向?qū)ο蟆⒎植际?、健壯、安全、可移植等特性,因此受到了眾多程序開發(fā)人員的青睞。(2)eclipse簡介eclipse是著名的跨平臺開源集成開發(fā)環(huán)境(ide)。它是一個開放源代碼的、基于java的可擴展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構(gòu)建開發(fā)環(huán)境。人們最初主要用它來做java語言開發(fā),目前亦有人通過插件使其作為c+、python、php等其他語言的開發(fā)工具。eclipse本身就是用java語言開發(fā)的,它的設計思想是:一切皆是插件。eclipse核心很小,其它所有功能都以插件的形式附加于

17、eclipse核心之上。eclipse基本內(nèi)核包括:圖形api (swt/jface), java開發(fā)環(huán)境插件(jdt ),插件開發(fā)環(huán)境(pde)等。這些特性使得eclipse擁有較佳的靈活性,許多軟件開發(fā)商以eclipse為框架開發(fā)自己的ide13。(3)mysql簡介 mysql是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典mysql ab公司開發(fā),目前屬于oracle公司。mysql是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。與其他的大型數(shù)據(jù)庫例如oracle、db2、sql server等相比,mysql自有它的不足

18、之處,如規(guī)模小、功能有限等,但是這絲毫也沒有減少它受歡迎的程度。對于一般的個人使用者和中小型企業(yè)來說,mysql提供的功能已經(jīng)綽綽有余,而且由于mysql是開放源碼軟件,因此可以大大降低總體擁有成本。mysql軟件采用了雙授權(quán)政策,它分為社區(qū)版和商業(yè)版,由于其體積小、速度快、成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇mysql作為網(wǎng)站數(shù)據(jù)庫。本系統(tǒng)采用的后臺數(shù)據(jù)庫即為社區(qū)版7。(4)網(wǎng)絡通信協(xié)議簡介網(wǎng)絡通信協(xié)議為連接不同操作系統(tǒng)和不同硬件體系結(jié)構(gòu)的互聯(lián)網(wǎng)絡提供通信支持,是一種網(wǎng)絡通用語言。網(wǎng)絡通信的層次結(jié)構(gòu)和網(wǎng)絡通信的協(xié)議,是開發(fā)網(wǎng)絡程序的基礎。目前在網(wǎng)絡編程方面最常用的是tc

19、p/ip和udp通信協(xié)議。通過這些協(xié)議,網(wǎng)絡通信的各主機可以用一種統(tǒng)一而非雜亂的規(guī)范,高效便捷地相互發(fā)送和接收消息。本系統(tǒng)在通訊功能實現(xiàn)中采用了tcp傳輸協(xié)議,直接使用的java api提供的類socket和serversocket等來實現(xiàn)69。tcp傳輸協(xié)議說明tcp協(xié)議是面向連接的協(xié)議,比如說在客戶端a和b進行連接之前必須首先建立數(shù)據(jù)通路,就向打電話一樣,在通話之前必須先撥號,等待對方的接聽以后才能進行通話。tcp協(xié)議中數(shù)據(jù)傳輸采取的是同步方式,當數(shù)據(jù)發(fā)送到對方時,必須等待接收方的應答信號后才能繼續(xù)下一次的發(fā)送工作,即通常所講的三次握手。由于tcp協(xié)議采用的是這種連接方式,因此由它建立的連

20、接是可靠的。在網(wǎng)絡不是十分理想的情況下,速度犧牲很大,但是卻能夠保證所傳輸?shù)臄?shù)據(jù)的正確性。 udp傳輸協(xié)議說明udp協(xié)議采用的是面向無連接的通信方式,它在通信前不需要提前建立通信鏈路,它是異步的,數(shù)據(jù)的發(fā)送比較迅速,不需要等待應答信號。優(yōu)點是發(fā)送速度較快,但是在數(shù)據(jù)的一致性方面不好,在網(wǎng)絡差的情況下,容易丟失數(shù)據(jù)包。另外,使用udp傳輸數(shù)據(jù)時對數(shù)據(jù)是有大小限制的,每個被傳輸?shù)陌仨毾薅ㄔ?4kb之內(nèi)6。java socket(套接字)說明在java語言里,使用socket(套接字)模型來封裝網(wǎng)絡傳輸?shù)木唧w動作。java提供了socket的相關(guān)包,java中socket的設計采用了面向?qū)ο蟮乃悸?/p>

21、,模擬了tcp協(xié)議里客戶端和服務器端的通信流程,并封裝了創(chuàng)建連接、發(fā)送接收數(shù)據(jù)流、斷開連接等方法。所以,使用socket包,程序員不僅可以創(chuàng)建客戶端和服務器之間的通信信道,還能實現(xiàn)發(fā)送和接收數(shù)據(jù)流等的網(wǎng)絡通信功能。針對一個特定的連接和通信過程,服務器和客戶端程序里都有一個socket對象,我們可以想象一下其場景,在通信過程中,有一條虛擬的“光纜”構(gòu)架在服務器和客戶端之間,光纜的兩頭都插在了socket這“插座”里。事實上,java采用socket包是對tcp協(xié)議的進一步抽象,更向程序員屏蔽了tcp通信的細節(jié),具體表現(xiàn)在以下兩方面 9。 在使用socket類里的方法建立信道的時候,socket類

22、屏蔽了通過三次握手建立信道的全部流程,直接向程序員返回信道類的句柄(socket類的實例)或是出錯信息。 socket類向程序員屏蔽了服務器和客戶端之間的物理硬件指標和底層的連接方式,所以我們在使用socket類開發(fā)網(wǎng)絡程序時,可以簡單地調(diào)用其提供的方法來傳輸數(shù)據(jù),而不必關(guān)心數(shù)據(jù)流的傳輸和接收方式6。java中的socket通信流程如圖2-1所示。構(gòu)造server端數(shù)據(jù)輸入流對象構(gòu)造server端數(shù)據(jù)輸出流對象在數(shù)據(jù)流中發(fā)送、接收客戶消息建立客戶端socket連接socket client=new socket(“serverhost”,8888);構(gòu)造client端數(shù)據(jù)輸入流對象構(gòu)造clie

23、nt端數(shù)據(jù)輸出流對象在數(shù)據(jù)流中發(fā)送、接收客戶消息建立服務器端套接字對象監(jiān)視端口serversocket server=new serversocket(8888);關(guān)閉server端的輸入流輸出流socket連接關(guān)閉client端的輸入流輸出流socket連接接收連接返回新socket對象socket socket=server.accept();主動連接新建一個socket連接監(jiān)聽圖 2-1 socket客戶-服務器的通信流程圖第三章 基于c/s架構(gòu)的即時通訊系統(tǒng)設計31系統(tǒng)詳細設計 3.1.1 系統(tǒng)總體流程圖在系統(tǒng)開發(fā)之前,先對系統(tǒng)進行了整體設計,系統(tǒng)流程圖如圖3-1。開始啟動服務器否判斷

24、啟動信息是啟動客戶端否注冊用戶判斷登錄信息是登錄成功即時聊天退出客戶端關(guān)閉服務器結(jié)束圖3-1系統(tǒng)總體流程圖 3.1.2 系統(tǒng)總體功能模塊劃分本系統(tǒng)主要分為注冊、登錄、聊天、文件傳送、后臺管理五大模塊。整個系統(tǒng)的詳細結(jié)構(gòu)如圖3-2所示。圖 3-2 系統(tǒng)總體功能模塊劃分注冊模塊基于c/s架構(gòu)的即時聊天系統(tǒng)文件模塊登錄模塊聊天模塊后臺管理模塊發(fā)送文字發(fā)送表情發(fā)送文件接收文件服務管理用戶管理消息管理群組聊天各個功能模塊設計如下:1、注冊模塊在登錄界面上有注冊按鈕,用戶可以點擊注冊,填入個人相關(guān)資料,提交給服務器。服務器接收到信息后通過純jdbc方式或者jdbcodbc橋接的方式連接數(shù)據(jù)庫并添加記錄。2

25、、登錄模塊用戶在客戶端輸入賬號和密碼,然后建立與服務器端的連接,告訴服務器執(zhí)行登錄操作。服務器收到后,開始通過jdbc讀取數(shù)據(jù)庫,然后與用戶輸入的信息進行比對,如果成功,便打開主程序窗口。然后客戶端向服務器請求讀取好友列表,服務器收到該請求后從數(shù)據(jù)庫中取出該用戶的好友列表,然后向客戶端發(fā)送這些信息,客戶收到后就在主窗口顯示好友。3、實時聊天模塊客戶端首先發(fā)送消息到服務器端,服務器端程序判斷客戶端發(fā)來的信息類型,如果是普通的聊天消息就根據(jù)發(fā)送者信息和接受者信息進行消息轉(zhuǎn)發(fā)。例如客戶端a向客戶端b發(fā)送消息的處理過程如下:首先a向服務器發(fā)送消息,服務器程序判斷消息類型,如果是普通的聊天消息,則解析該

26、消息,得到該消息的發(fā)送者a,接受者b。接著判斷b是否在線,如果在線就將消息發(fā)送過去,否則將消息存入數(shù)據(jù)庫。b接收到a發(fā)來的信息,如果是未建立對話窗口,則在屏幕右下角出現(xiàn)彈窗提示。此外還有群組聊天功能,可以在“官方聊天室”功能中實現(xiàn)一對多的聊天,即在聊天室發(fā)送的消息是面向所有在線用戶的。4、傳送文件模塊 在聊天主界面上有文件傳送功能,可以選擇任意的本地文件進行雙向傳送。不管是何種格式的文件,在底層全部通過objectoutputsteam/objectinputsteam等java提供的不同形式的流處理對象轉(zhuǎn)化為二進制的字節(jié)流傳送。在接收端再從這些i/o流中讀取還原原始數(shù)據(jù)。5、系統(tǒng)后臺管理模塊

27、(1)服務管理:服務器端的管理員可以在這里啟動后臺的服務器,發(fā)布聊天室公告或者彈窗公告給所有在線用戶。如果未開啟服務器,則在客戶端無法登錄,并會返回相應的消息提示。(2)用戶管理:可以根據(jù)用戶名或者用戶id查詢已注冊的用戶詳細信息,并且可以修改、保存相關(guān)信息。這是一個對數(shù)據(jù)庫的簡單的增刪改查的操作。(3)消息管理:當一個用戶給其不在線的用戶發(fā)送消息時,系統(tǒng)會理解為發(fā)送的是離線消息。此消息將會存入數(shù)據(jù)庫,等目標用戶上線后再將消息推送過去。 3.1.3 系統(tǒng)用例圖用例( use case)是軟件工程或系統(tǒng)工程中對系統(tǒng)如何反應外界請求的描述,是一種通過用戶的使用場景來獲取需求的技術(shù)。用例圖是由主角、

28、用例以及它們之間的關(guān)系構(gòu)成的圖,該圖說明了用例模型中的關(guān)系12。本系統(tǒng)的用例圖如圖3-3、3-4所示。普通用戶用例圖:用戶注冊文字登錄聊天文件接收文件發(fā)送文件表情圖 3-3普通用戶用例圖后臺管理員用例圖:服務器管理員查找用戶查看在線用戶刪除用戶查看聊天記錄關(guān)閉服務器圖 3-4后臺管理員用例圖啟動服務器3.1.4 系統(tǒng)數(shù)據(jù)流圖數(shù)據(jù)流圖(dfd),是從數(shù)據(jù)傳遞和加工角度,以圖形方式來表達系統(tǒng)的邏輯功能、數(shù)據(jù)在系統(tǒng)內(nèi)部的邏輯流向和邏輯變換過程。是結(jié)構(gòu)化系統(tǒng)分析方法的主要表達工具及用于表示軟件模型的一種圖示方法 12。本系統(tǒng)的數(shù)據(jù)流圖如圖3-5至圖3-7所示。(1)頂層數(shù)據(jù)流圖聊天用戶聊天用戶局域網(wǎng)即

29、時聊天系統(tǒng)圖3-5頂層數(shù)據(jù)流圖(2)客戶端數(shù)據(jù)流圖登錄界面好友列表界面好友聊天界面查看用戶信息聊天室界面連接到服務器線程socket連接圖 3-6 客戶端數(shù)據(jù)流圖socket連接服務器端控制臺數(shù)據(jù)庫操作驗證用戶密碼連接到客戶端線程圖 3-7 服務器端數(shù)據(jù)流圖(3)服務器端數(shù)據(jù)流圖3.2 數(shù)據(jù)庫設計1、數(shù)據(jù)庫需求分析根據(jù)即時聊天系統(tǒng)的功能模塊分析可知,一個最最簡單的聊天系統(tǒng)至少應該包括一張用戶基本檔案的數(shù)據(jù)表。由于本系統(tǒng)功能設計理念較為簡單,因此只包含了兩張數(shù)據(jù)表:用戶表(users)和消息表(msg)。用戶表用于存儲用戶信息,消息表用于存儲用戶的離線聊天消息,因此本系統(tǒng)需要的數(shù)據(jù)源包括用戶信息

30、、離線聊天消息。2、概要設計根據(jù)數(shù)據(jù)庫的需求分析設計規(guī)劃出的數(shù)據(jù)實體有:賬戶實體、用戶信息實體、離線消息實體。每一個實體都是現(xiàn)實中實際存在的對象的抽象,并存在一定的數(shù)據(jù)關(guān)系。圖3-8至3-10給出本系統(tǒng)的總體e-r圖和數(shù)據(jù)庫中各信息實體的e-r圖45。系統(tǒng)總體e-r模型:圖3-8系統(tǒng)總體e-r圖賬 戶賬戶名賬戶密碼賬戶id擁 有用戶信息上次登錄日期用戶性別用戶狀態(tài)用戶ip上次退出日期用戶頭像用戶生日用戶郵箱擁 有離線消息消息id消息發(fā)送時間消息類型消息發(fā)送者消息內(nèi)容消息接受者111n用戶的基本信息e-r模型:用戶(用戶id,用戶名,用戶密碼,用戶ip地址,用戶狀態(tài),用戶性別,用戶郵箱,用戶最近

31、一次登錄日期,用戶上一次退出日期,用戶簽名,用戶頭像,用戶生日)用戶信息用戶id上次登錄日期用戶性別用戶狀態(tài)用戶ip用戶密碼用戶名上次退出日期用戶頭像用戶生日用戶郵箱圖 3-9用戶信息e-r圖離線消息的e-r模型:消息(消息id,消息內(nèi)容,消息發(fā)送者,消息接收者,消息發(fā)送時間)消息信息圖 3-10聊天消息e-r圖消息id消息發(fā)送時間消息類型消息發(fā)送者消息內(nèi)容消息接受者3、邏輯設計本系統(tǒng)的數(shù)據(jù)庫名稱是myim,該數(shù)據(jù)庫中包含了兩張表,分別為用戶信息表、聊天消息表。下面簡要介紹這兩個表的設計。(1)用戶信息表: 該表中記錄了本系統(tǒng)所有注冊用戶的用戶名及其密碼,以及其它一些個人信息。用戶可以在客戶端

32、登錄窗口通過輸入用戶名和匹配的密碼登錄,用戶信息中只要有兩者之一與該表內(nèi)容不符便無法登錄,系統(tǒng)會給出出錯提示。該表的設計如下:表1 用戶信息表字段名數(shù)據(jù)類型是否是主鍵u_idint是u_namevarchar(50)否u_pwdvarchar(50)否u_ipvarchar(50)否u_statevarchar(10)否u_gendervarchar(50)否u_emailvarchar(50)否u_last_logindate否u_last_exitdate否u_head_imgvarchar(50)否u_birthdaydate否(2)離線消息表:記錄了用戶發(fā)送給離線好友的消息,管理員可以

33、查看。包括發(fā)送者、接受者和消息產(chǎn)生的時間等。表2 聊天消息表字段名數(shù)據(jù)類型是否是主鍵msg_idint是msg_contentvarchar(2000)否msg_sendfromint否msg_sendtoint否msg_typevarchar(2)否msg_sendtimedate否4、物理設計數(shù)據(jù)庫最終要存儲于存儲設備上,將一個給定邏輯結(jié)構(gòu)實施到具體的環(huán)境中時,邏輯數(shù)據(jù)模型要選取一個具體的工作環(huán)境,這個工作環(huán)境提供了數(shù)據(jù)存儲結(jié)構(gòu)與存取方法。圖3-11、圖3-12是在mysql中本系統(tǒng)數(shù)據(jù)庫的物理結(jié)構(gòu)的具體實現(xiàn)4。(1) users.dbf表圖 3-11 users表/*創(chuàng)建msg.dbf表

34、格*/create table users ( u_id int(11) not null auto_increment comment 用戶id, u_name varchar(50) not null comment 用戶名, u_pwd varchar(50) not null comment 密碼, u_ip varchar(50) default null comment ip地址, u_state varchar(50) default null comment 用戶狀態(tài), u_gender varchar(50) default null comment 性別, u_email

35、varchar(50) default null comment 電子郵件, u_last_login date default null comment 最后一次登錄, u_last_exit date default null comment 最后一次退出, u_signature varchar(100) default null comment 個性簽名, u_head_img varchar(100) default null comment 頭像, u_type varchar(50) default null comment 類型, u_birthday date default

36、 null comment 生日, primary key (u_id) engine=innodb auto_increment=7 default charset=utf8;(2) msg.dbf表圖 3-12 msg表/*創(chuàng)建msg.dbf表格*/create table msg ( msg_id int(11) not null auto_increment comment 消息id, msg_content varchar(2000) not null comment 消息內(nèi)容, msg_sendfrom int(11) not null comment 消息發(fā)送者, msg_sen

37、dto int(11) default null comment 消息接收者, msg_sendtime date not null comment 消息發(fā)送時間, msg_remark varchar(3000) default null comment 備用, msg_type varchar(2) default null comment 消息類型,如是群聊消息還是私聊消息, primary key (msg_id) engine=innodb default charset=utf8;3.3 系統(tǒng)關(guān)鍵類結(jié)構(gòu)設計本系統(tǒng)采用簡單的mvc設計模式,具體架構(gòu)如圖3-13所示。圖3-13 程序架

38、構(gòu)所謂mvc模式,即模型(model)-視圖(view)-控制器(controller)的縮寫,它是一種軟件設計規(guī)范,是一種使業(yè)務邏輯和數(shù)據(jù)顯示分離的代碼組織方法。它強制性地使應用程序的輸入、處理和輸出分開。mvc模式里包含三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。采用mvc模式組織系統(tǒng)有如下好處3:(1)耦合性低視圖層和業(yè)務層分離,這樣就允許更改視圖層代碼,而不用重新編譯模型和控制器代碼。運用了mvc的應用程序三個部件相互獨立,改變其中一個不會影響其他兩個。例如在本系統(tǒng)中,筆者采用的是mysql數(shù)據(jù)庫,如果把數(shù)據(jù)庫從mysql移植到oracle,只需改變模型即可,因為模型和控

39、制器、視圖向分離,所以很容易改變應用程序的數(shù)據(jù)層和業(yè)務規(guī)則。(2)重用性高mvc模式允許使用各種不同樣式的視圖來訪問同一個服務器端的代碼,因為多個視圖可以共享一個模型。例如在本系統(tǒng)中存在存在兩個不同的聊天窗口:一對一聊天、聊天室聊天,其實不管是哪種方式的聊天在后臺控制層都可以采用同一個控制器,不需要因為界面的不同而大動后臺的控制代碼,充分利用這一點以提高代碼重用性。(3)可維護性高mvc模式層次分明,結(jié)構(gòu)清晰,分離視圖層和業(yè)務邏輯層使得應用程序更容易維護和修改。(4)有利于軟件工程化管理由于不同的層各司其職每一層不同的應用具有某些相同的特征,有利于通過工程化、工具化的方式管理程序代碼。在本系統(tǒng)

40、中,很明顯的可以看出,模型層即為model包,視圖層即為view包,控制層即為tools包和db包,包的名稱取法因人而異,其本質(zhì)都是反映了mvc的思想。關(guān)鍵java類設計(1)msg類客戶端和服務器端通信時,不管是純粹的聊天內(nèi)容,還是一個返回好友列表的請求,亦或是客戶端登錄驗證的消息,其實發(fā)送的都是msg類的對象。msg類封裝了消息類型、發(fā)送雙方、發(fā)送時間等屬性,它是本系統(tǒng)中雙方通信的載體。表3 msg類屬性名作用private int msgid消息的id號,唯一識別該消息private string msgcontent消息的內(nèi)容private int sendfrom消息的發(fā)送者priv

41、ate int sendto消息的接收者private string sendtime消息發(fā)送時間private string msgtye消息類型(私聊、群消息)(2)users類用戶表的實體即轉(zhuǎn)化成java程序中的users類,該類封裝了用戶的各項信息,是實現(xiàn)不同用戶相互聊天的基本對象,也是建立通訊連接的主體。表4 users類屬性名作用private int id用戶id,唯一識別該用戶private string name用戶名private string pwd用戶密碼private string ip用戶登錄機器ipprivate string state用戶在線狀態(tài)private

42、 string gender用戶性別private string email用戶電子郵箱private string lastlogin用戶上一次登錄時間private string lastexit用戶上一次退出系統(tǒng)時間private string headimg用戶頭像(3) myserver和myclient類本系統(tǒng)設計的目的便是即時聊天,myserver類和myclient類便是實現(xiàn)通信功能的主干類,它是一個功能類,不是一個實體類,因此沒有封裝太多的屬性。此類的主要代碼如下:myserver類:public class myserver public myserver() try sy

43、stem.out.println(服務器在8888端口監(jiān)聽);serversocket ss = new serversocket(9988);while (true) socket s = ss.accept(); objectinputstream ois=new objectinputstream(s.getinputstream();user u=(user)ois.readobject();system.out.println(服務器接收到用戶id:+u.getuserid()+密碼:+u.getpasswd();message m=new message();objectoutpu

44、tstream oos=new objectoutputstream(s.getoutputstream();if (u.getpasswd().equals(123456) / 返回成功登錄的消息m.setmestype(1);oos.writeobject(m);/這里就單開一個線程,讓該線程與該客戶端保持通訊serconclientthread scct=new serconclientthread(s); /加入服務器端的hashmap便于統(tǒng)一管理manageclientthread.addclientthread(u.getuserid(), scct);thread t=new t

45、hread(scct);t.start();/通知在線的其他人我上線了scct.notifyother(u.getuserid(); else m.setmestype(2);oos.writeobject(m);s.close(); catch (exception e) e.printstacktrace();myclient類:public class clientconserver public socket s;/ 客戶端請求(參數(shù)聲明成object類型,客戶端只有第一次請求發(fā)送的是user對象)public boolean sendlogininfotoserver(object

46、o) boolean b = false;try system.out.println(正在向服務器發(fā)送請求.);s = new socket(, 9988); objectoutputstream oos = new objectoutputstream(s.getoutputstream();oos.writeobject(o);/讀取從服務器發(fā)來的信息,成功返回前一直阻塞objectinputstream ois = new objectinputstream(s.getinputstream();/ 根據(jù)服務器返回的message的類型判斷是否成功登錄message

47、ms = (message) ois.readobject();if (ms.getmestype().equals(1) clientconserverthread ccst=new clientconserverthread(s);/啟動該通訊線程ccst.start();manageclientconserverthread.addclientconserverthread(user)o).getuserid(), ccst);b = true; else s.close(); catch (exception e) e.printstacktrace(); finally return

48、 b;第四章 基于c/s架構(gòu)的即時通訊系功能實現(xiàn)4.1注冊模塊功能實現(xiàn)注冊模塊分析正如我們使用的qq一樣,使用之前我們要申請一個qq號。本系統(tǒng)雖然沒有設計這么復雜的流程,但是也必須在登錄前注冊賬號。只有后臺數(shù)據(jù)庫里存在的用戶才能使用本系統(tǒng)。注冊界面如圖4-1所示,填完消息點擊注冊即可。這個界面運用了emptyborder、jcombobox等java組件,將各個組件完美的組合在一個jpanel上,設置jframe對象的背景圖片,即可構(gòu)造出美觀的界面。為了使系統(tǒng)的界面更加美觀且易于構(gòu)建,本系統(tǒng)使用了兩個第三方包:absolutelayout.jar,swing-layout-1.0.3.jar。

49、圖 4-1注冊界面此外,信息填寫不完整或填寫有誤將有錯誤提示,如圖4-2。此處調(diào)用了joptionpane對象的showmessagedialog方法,通過設置該方法的參數(shù)顯示不同類型的提示框。郵箱地址的檢測用到了java里面的正則表達式相關(guān)知識,使用pattern對象對郵箱地址格式的正則式進行編譯,再調(diào)用matcher對象的matches方法判斷用戶輸入的郵箱是否與該格式匹配。圖4-2錯誤提示界面注冊完成后,通過jdbc技術(shù)連接mysql數(shù)據(jù)庫將記錄插入數(shù)據(jù)庫表中。注冊功能關(guān)鍵代碼如下:public void addevent() btnregister.addactionlistener(

50、new actionlistener() public void actionperformed(actionevent e) if (txtname.gettext().equals()joptionpane.showmessagedialog(null, 用戶名不能為空!, 錯誤,joptionpane.error_message);else if (new string(pwd.getpassword().equals()joptionpane.showmessagedialog(null, 密碼不能為空!, 錯誤,joptionpane.error_message);else if(!

51、newstring(pwd.getpassword().equals(new string(pwdre.getpassword()joptionpane.showmessagedialog(null, 兩次輸入的密碼不一致,請重新輸,錯誤, joptionpane.error_message);else try if (cs_tcp = null)cs_tcp=new cs_tcp(mytools.qqserverip,mytools.qqserverport);string sex = 男;if (comgender.getselectedindex() = 1)sex = 女;cs_tcp

52、.sendmessage(flag.register+ mytools.flagend/ 注冊標志+ txtname.gettext()+ mytools.split1/ 用戶名+ new string(pwd.getpassword()+ mytools.split1/ 密碼+ sex + mytools.split1/ 性別+ txtemail.gettext() + mytools.split1/ 電子郵件+ txtbirthday.gettext() + mytools.split1/ 生日+ txtsignat.gettext() + mytools.split1/ 個性簽名+ comboboxheadimage.getselectedindex();/ 頭像索引 catch (exception ee) ee.printstacktrace();joptionpane.showmessagedialog(null,連接服務器失??!請檢查您的網(wǎng)絡連接或確保服務器已啟動!, 錯誤,joptionpane.error_message););4.2登錄模塊功能實現(xiàn)登錄模塊分析登錄模塊用于驗證客戶端用戶的合法性,用戶輸入用戶名和密碼后通過msg對象將其封裝成客戶端消息,通過objectinputs

溫馨提示

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

評論

0/150

提交評論