基于java語言的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與實(shí)現(xiàn)畢業(yè)論文_第1頁
基于java語言的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與實(shí)現(xiàn)畢業(yè)論文_第2頁
基于java語言的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與實(shí)現(xiàn)畢業(yè)論文_第3頁
基于java語言的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與實(shí)現(xiàn)畢業(yè)論文_第4頁
基于java語言的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與實(shí)現(xiàn)畢業(yè)論文_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2015屆本科畢業(yè)論文(設(shè)計(jì))基于JAVA語言的網(wǎng)絡(luò)聊天軟件代碼:/detail/syqwe/8890181姓 名: XXXX 系 別: 計(jì)算機(jī)與信息技術(shù)學(xué)院 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 號(hào): XXXXXXXX 指導(dǎo)教師: XXXXXX 2015年 05月 08日 目 錄摘要IIAbstractII1 軟件介紹31.1 背景31.2 目的32 開發(fā)技術(shù)32.1 界面層技術(shù)32.2 通信層技術(shù)32.3 數(shù)據(jù)層技術(shù)33 開發(fā)環(huán)境43.1 硬件環(huán)境43.2 軟件環(huán)境44 需求分析44.1 客戶端需求分析44.2 服務(wù)器需求分析44.3 數(shù)據(jù)層需求分析

2、45 系統(tǒng)架構(gòu)56 設(shè)計(jì)實(shí)現(xiàn)56.1 消息封裝類Message56.2 服務(wù)器66.2.1 主服務(wù)器Server66.2.2 虛擬服務(wù)器VirtualServer66.2.3 登錄驗(yàn)證Logon76.2.4 Hibernate配置文件86.2.5 Hibernate會(huì)話工廠86.2.6數(shù)據(jù)操作類 UserDao96.2.7 數(shù)據(jù)操作類 CrowdDao106.2.8 表結(jié)構(gòu)設(shè)計(jì)106.2.9 用戶類User116.2.10 群組類Crowd116.3 客戶端116.3.1 Client116.3.2 登錄界面Logon136.3.3 好友界面Friend146.3.4 聊天界面Chart156

3、.3.5 游戲界面Game166.3.6 游戲規(guī)則176.3.7 算法思路177測(cè)試說明18總結(jié)感想19參考文獻(xiàn)20致 謝20基于JAVA語言的網(wǎng)絡(luò)聊天軟件摘要本聊天軟件是使用Java編程語言來完成開發(fā)的。在軟件的開發(fā)過程中,使用Socket來進(jìn)行網(wǎng)絡(luò)通信,使用Swing來繪制界面,使用開源的對(duì)象關(guān)系映射框架Hibernate來進(jìn)行數(shù)據(jù)訪問。其中Hibernate能夠使程序員以面向?qū)ο蟮乃季S來處理關(guān)系型數(shù)據(jù)。本聊天軟件不僅支持聊天,還加入了“連連看”游戲。該游戲讓人們之間的交流得到延伸,讓彼此之間的關(guān)系更進(jìn)一步。本聊天軟件主要有以下三個(gè)功能:一、登錄驗(yàn)證;二、聊天通信;三、游戲互動(dòng)。關(guān)鍵詞聊天

4、;Java;Swing;套接字;HibernateNetwork Chat Software Based on JAVA LanguageAbstractThis chat software was developed by using the Java programming language to complete. In the process of software development, Socket is used for network communication, Swing is used to draw the interface, object relational m

5、apping framework Hibernate open source is used for data access.Hibernate allows programmers to deal with relational data in object-oriented thinking. This chat software not only support chat at the same time, also joined the LinkUpFree game. The game allows communication between people has been exte

6、nded, so that the relationship between each other more.This software mainly has the following three functions: First, landing validation; Second, chat communications; Three, the interaction of the game.KeywordsChat; Java; Socket; Swing; Hibernate1 軟件介紹1.1 背景在當(dāng)今世界,人們的追求早已不局限于物質(zhì)生活,而更多的是渴望在精神領(lǐng)域上得到滿足,這突

7、出表現(xiàn)在我們的人際交往上。人們渴望與遠(yuǎn)在天涯又或是近在咫尺的親朋好友無拘無束地溝通,而此時(shí)此刻一款即時(shí)通訊工具對(duì)于我們來說,它的重要性不言而喻!在計(jì)算機(jī)網(wǎng)絡(luò)愈來愈普及的今天,人們對(duì)于網(wǎng)絡(luò)的依賴也愈來愈大,類似于QQ、MSN等聊天工具早已融入到我們?nèi)粘I钪校瑸槲覀兊纳顜砹藲g樂和便利。因此,我力圖開發(fā)一個(gè)在線的即時(shí)聊天軟件以滿足我們?cè)谌粘I钪薪涣鞯男枰?,為我們的生活增光涂色?.2 目的本聊天軟件以通信為其核心,同時(shí)融入了娛樂的元素,一款十分經(jīng)典的“連連看”游戲。讓我們?cè)诹奶斓耐瑫r(shí)還能與好友一起通過游戲來增進(jìn)彼此的感情,讓彼此的心更加靠近,讓我們的生活從此不再單調(diào)。本聊天軟件是在Windo

8、ws環(huán)境下進(jìn)行開發(fā)的。通過Swing實(shí)現(xiàn)操作界面的設(shè)計(jì),使用Java語言中的Socket(套接字)來實(shí)現(xiàn)網(wǎng)絡(luò)之間的通信,使用Hibernate框架來進(jìn)行數(shù)據(jù)的增刪改查,而MySQL數(shù)據(jù)庫則用于數(shù)據(jù)的存儲(chǔ)與管理。在開發(fā)的過程中綜合運(yùn)用自己所學(xué)到的各種技術(shù),一方面強(qiáng)化我在學(xué)校里學(xué)到的知識(shí)與專業(yè)技能,另一方面也使得我更好地去理解有關(guān)軟件開發(fā)的流程與思想。這些能力與經(jīng)驗(yàn)都將為我后續(xù)的學(xué)習(xí)和工作打下堅(jiān)實(shí)牢固的基礎(chǔ),不斷地提升個(gè)人的職業(yè)素養(yǎng)。同時(shí),本聊天軟件將不斷與信息領(lǐng)域的系統(tǒng)相互集成和滲透,向校園、集團(tuán)等群體進(jìn)行拓展,應(yīng)用將突破個(gè)體,并應(yīng)用于遠(yuǎn)程教學(xué)、遠(yuǎn)程演示、網(wǎng)絡(luò)會(huì)議等。以豐富的接入方式,以保質(zhì)保量

9、的服務(wù),以友好的用戶體驗(yàn)呈現(xiàn)在世人面前。并且不斷地?cái)U(kuò)大功能與應(yīng)用范圍,滿足未來時(shí)代的話音。2 開發(fā)技術(shù)本聊天軟件用到的技術(shù)涉及到3個(gè)層面,它們分別是:界面層、通信層、數(shù)據(jù)持久化層。2.1 界面層技術(shù)使用Java中的Swing來進(jìn)行操作界面的開發(fā)。Swing是一款功能強(qiáng)大,使用方便,跨平臺(tái)的圖形界面開發(fā)工具包,專門用于開發(fā)Java應(yīng)用程序的用戶界面。Swing允許您設(shè)定自己喜愛的界面風(fēng)格,它可以是跨平臺(tái)的Java風(fēng)格,也可以是我們熟悉的Window風(fēng)格,這一點(diǎn)是其他界面開發(fā)工具很難比擬的。2.2 通信層技術(shù)利用java中的Socket(套接字)來完成客戶端與服務(wù)器的交互。該Socket是基于TC

10、P/IP通信協(xié)議的數(shù)據(jù)傳輸對(duì)象,它提供了安全可靠的通信機(jī)制。在服務(wù)器使用ServerSocket創(chuàng)建監(jiān)聽端口,而在客戶端則使用Socket來連接服務(wù)器。在連接成功時(shí),應(yīng)用程序的客戶端和服務(wù)器都將產(chǎn)生一個(gè)Socket實(shí)例,本聊天程序就是通過利用這個(gè)Socket實(shí)例來實(shí)現(xiàn)兩段的通信和其他功能。在通信的過程中我也使用了多線程編程技術(shù)以實(shí)現(xiàn)復(fù)雜的交互行為。尤其是在服務(wù)器端,服務(wù)器每接收一個(gè)客戶端就會(huì)產(chǎn)生一個(gè)虛擬服務(wù)器來單獨(dú)為其服務(wù)。通過該技術(shù)的運(yùn)用使得本聊天軟件可以允許多人同時(shí)在線與自己的好友暢懷的交流。2.3 數(shù)據(jù)層技術(shù)考慮到現(xiàn)如今框架技術(shù)的興起,在數(shù)據(jù)層的處理上我也使用了開源的對(duì)象關(guān)系映射框架Hi

11、bernate。它對(duì)Java的數(shù)據(jù)庫連接(JDBC)進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用面向?qū)ο缶幊趟季S來操縱數(shù)據(jù)庫。本聊天軟件使用MySQL作為數(shù)據(jù)持久化存的儲(chǔ)器。MySQL是一個(gè)真正的多用戶、多線程數(shù)據(jù)庫服務(wù)器,是以客戶端/服務(wù)器架構(gòu)實(shí)現(xiàn)的,它由一個(gè)服務(wù)器守護(hù)線程和很多不同的客戶程序和庫組成。MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),通過表來管理數(shù)據(jù),增加了處理數(shù)據(jù)的速度并提高了操作的靈活性。Hibernate+MySQL的組合在數(shù)據(jù)的處理上讓我變得得心應(yīng)手,同時(shí)也讓這個(gè)程序變得更加強(qiáng)壯與穩(wěn)健。3 開發(fā)環(huán)境3.1 硬件環(huán)境硬件配置:AMD X64 兼容桌面平臺(tái)。3.

12、2 軟件環(huán)境操作系統(tǒng):Windows8.1企業(yè)版。JDK版本:JDK_8。數(shù)據(jù)庫:MySQL Server5.6。開發(fā)工具:MyEclipse2015。第三方工具包:Hibernate。4 需求分析本聊天軟件是在C/S模式下完成開發(fā)的,整個(gè)系統(tǒng)分為兩個(gè)重要的組成部分:客戶端、服務(wù)器。在客戶端用戶可以通過登錄模塊進(jìn)行登錄操作,登錄成功的用戶則進(jìn)入到好友列表界面;選中指定的好友,就可以發(fā)起與該好友的會(huì)話,通過聊天模塊與好友相互噓寒問暖;在聊天模塊中,既可以發(fā)送消息,同時(shí)也可以發(fā)起與該好友的游戲互動(dòng),在PK中一決雌雄。在服務(wù)器,服務(wù)器要為每個(gè)用戶進(jìn)行服務(wù),對(duì)用戶登錄信息進(jìn)行驗(yàn)證,接受來自用戶的消息請(qǐng)

13、求并按照消息的類型進(jìn)行各種不同的操作和處理。4.1 客戶端需求分析客戶端實(shí)現(xiàn)的功能主要有:1.登錄模塊:用戶在登錄界面中輸入個(gè)人身份信息,由客戶端將信息傳遞至服務(wù)器進(jìn)行用戶合法性的驗(yàn)證,驗(yàn)證成功,則跳轉(zhuǎn)到聊天模塊,否則給出相關(guān)提示。2.好友模塊:顯示好友列表,通過該模塊可以發(fā)起與好友的會(huì)話或者游戲。3.聊天模塊:能夠及時(shí)的發(fā)送用戶的文本消息,同時(shí)能夠即時(shí)地將好友發(fā)過來的消息展現(xiàn)出來。4.游戲模塊:開啟兩個(gè)好友之間的游戲互動(dòng)。5.界面效果:布局整潔、大方;色彩光鮮、奪目;操作簡單、舒適。4.2 服務(wù)器需求分析服務(wù)器作為后臺(tái)程序,實(shí)現(xiàn)的功能主要有:1.能夠接收每個(gè)客戶端的通信連接。2.調(diào)用數(shù)據(jù)訪問

14、層來驗(yàn)證用戶的個(gè)人信息。3.能夠及時(shí)接受用戶的聊天消息并進(jìn)行消息的轉(zhuǎn)發(fā)。4.3 數(shù)據(jù)層需求分析數(shù)據(jù)層實(shí)現(xiàn)的功能主要有:響應(yīng)來自服務(wù)器的數(shù)據(jù)訪問請(qǐng)求。5 系統(tǒng)架構(gòu)本系統(tǒng)以客戶端、服務(wù)器以及數(shù)據(jù)庫三維一體構(gòu)建起了系統(tǒng)的整個(gè)架構(gòu)。圖5-1 系統(tǒng)架構(gòu)客戶端:用戶在客戶端的所有操作都依賴于客戶端的守護(hù)線程Client來完成,該線程負(fù)責(zé)與服務(wù)器進(jìn)行數(shù)據(jù)交互。當(dāng)用戶需要登錄時(shí),由登錄模塊調(diào)用Client向服務(wù)器發(fā)送身份驗(yàn)證請(qǐng)求。服務(wù)器接收到該驗(yàn)證請(qǐng)求之后便進(jìn)行驗(yàn)證處理并返回驗(yàn)證結(jié)果給Client。如果Client判定驗(yàn)證成功則從驗(yàn)證結(jié)果中提取出個(gè)人信息并開啟好友模塊;當(dāng)用戶在好友模塊中打開了一個(gè)聊天模塊后,

15、便可以調(diào)用Client來進(jìn)行聊天消息的傳遞;如果打開的是游戲模塊,則先完成游戲的一方調(diào)用Client向另一方發(fā)送獲勝消息,并終止另一方的游戲。服務(wù)器:服務(wù)器分為主服務(wù)器與虛擬服務(wù)器。主服務(wù)器Server作為服務(wù)器的守護(hù)線程,主要負(fù)責(zé)接收客戶端的連接,在服務(wù)器接收到一個(gè)客戶端后,就開啟一個(gè)虛擬服務(wù)器VirtualServer來為該用戶服務(wù);虛擬服務(wù)器通過調(diào)用底層的登錄模塊等來為用戶提供登錄驗(yàn)證等服務(wù)。本架構(gòu)中,借用了Spring中的分層思想,這也是在軟件項(xiàng)目開發(fā)過程中經(jīng)常采用的方案。將操作或功能分為不同的層次,各層次之間想對(duì)獨(dú)立,高層調(diào)用底層的功能,低層為高層提供服務(wù)。一方面,可以將同種類型的操

16、作放在一起集中管理。另一方面,將操作提取出來,提高了代碼的復(fù)用性和程序的擴(kuò)展性。分層使得程序流程變得清晰明了,而且維護(hù)成本相對(duì)低廉1。6 設(shè)計(jì)實(shí)現(xiàn)6.1 消息封裝類MessageSocket: 套接字,在本聊天軟件中作為客戶端與服務(wù)器之間通信載體,為系統(tǒng)的交互提供支撐。為了方便開發(fā),我將客戶端與服務(wù)器之間傳送的消息封裝成一個(gè)消息對(duì)象類Message.。繼而使用從Socket獲取的對(duì)象輸入流、對(duì)象輸出流來收發(fā)消息對(duì)象2。封裝的消息類代碼如下所示:/消息封裝類實(shí)現(xiàn)了序列化接口public class Message implements Serializable private static fi

17、nal long serialVersionUID = -2842889997276284663L;private Integer type;/消息的類型private Date senDate= new Date();/消息創(chuàng)建的時(shí)間private User sender; /消息的發(fā)送者private User accepter; /消息的接收者private String content; /消息的內(nèi)容其中,消息的類型在服務(wù)器和客戶端都遵循著統(tǒng)一的標(biāo)準(zhǔn)。這樣的話,客戶端發(fā)給服務(wù)器什么樣的消息,服務(wù)器在解析出消息的類型之后, 就可以進(jìn)行相應(yīng)的操作了。為了實(shí)現(xiàn)消息載體以對(duì)象的形式在網(wǎng)絡(luò)間進(jìn)行

18、傳遞,該消息類必須實(shí)現(xiàn)Java中的序列化接口,這一點(diǎn)是其他通過字節(jié)流或者字符流傳遞消息所不同的。6.2 服務(wù)器6.2.1 主服務(wù)器Server主服務(wù)器主要充當(dāng)一個(gè)前置服務(wù),用來接收客戶端的連接。在獲得一個(gè)客戶端的連接后就會(huì)產(chǎn)生一個(gè)虛擬服務(wù)器,并將該連接委托給虛擬服務(wù)器讓它來為用戶提供服務(wù)。同時(shí)主服務(wù)器也維護(hù)著所有的虛擬服務(wù)器,它扮演著一個(gè)管理者的角色3。/服務(wù)器維護(hù)的虛擬服務(wù)器列表,一個(gè)Map集合,通過這種鍵值對(duì)的對(duì)應(yīng)關(guān)系來管理虛擬服務(wù)器。private static HashMap usersOL = new HashMap();try serverSocket = new ServerSo

19、cket(port);/這里通過無限循環(huán),來不停地接受用戶的連接。while(true) clientSocket = serverSocket.accept();/接收客戶端的連接new Thread(new VirtualServer(clientSocket).start();/開啟虛擬服務(wù)器來為其服務(wù) catch (IOException e) /異常處理6.2.2 虛擬服務(wù)器VirtualServer虛擬服務(wù)器才是真正的服務(wù)載體,當(dāng)它接收從主服務(wù)器哪里得到的來自客戶端的連接后,便可進(jìn)行一對(duì)一的服務(wù)。所有的消息都經(jīng)過它來處理。當(dāng)虛擬服務(wù)器之間需要交互時(shí),虛擬服務(wù)器可以從主服務(wù)器那里拿到

20、主服務(wù)器所維護(hù)的虛擬服務(wù)器列表。并從中根據(jù)鍵值對(duì)來獲取指定的虛擬服務(wù)器,然后再進(jìn)行后續(xù)的操作。該類實(shí)現(xiàn)了Runnable接口,該接口是將線程所運(yùn)行的程序代碼提取出來封裝成為一個(gè)對(duì)象。Runnable對(duì)象可以用來創(chuàng)建線程。private User user = null;/虛擬服務(wù)器所服務(wù)的用戶Overridepublic void run() Boolean b = true;/線程結(jié)束控制符/接收來自客戶端封裝的消息對(duì)象Message msg = null; while(b) try msg = (Message)input.readObject();/客戶端Client發(fā)送過來的消息對(duì)象/

21、根據(jù)消息的類型進(jìn)行不同的處理if(msg.getType() = 10) /登錄驗(yàn)證操作Message returnMsg = new Login().validate(msg.getSender();/登錄驗(yàn)證if(returnMsg.getType() = 13) /驗(yàn)證成功,則將該虛擬服務(wù)器添加到主服務(wù)器管理的虛擬服務(wù)器列表Server.getUsersOL().put(returnMsg.getAccepter().getAccount(), this);send(returnMsg);else if(msg.getType() = 20) /轉(zhuǎn)發(fā)聊天消息Server.getUsers

22、OL().get(msg.getAccepter().getAccount().send(msg); send(msg);else if(msg.getType() = 30) /退出操作Server.getUsersOL().remove(user.getAccount();Thread.currentThread().interrupt();/結(jié)束當(dāng)前線程else if(msg.getType() = 40) /邀請(qǐng)好友進(jìn)行游戲Server.getUsersOL().get(msg.getAccepter().getAccount().send(msg);else if(msg.getTy

23、pe() = 41) /好友同意游戲邀請(qǐng),雙方開始游戲Message m = new Message();m.setType(42); m.setAccepter(msg.getAccepter();Server.getUsersOL().get(msg.getAccepter().getAccount().send(m); m.setAccepter(msg.getSender();send(m);else if(msg.getType() = 43) /拒絕好友的游戲邀請(qǐng)Server.getUsersOL().get(msg.getAccepter().getAccount().send(

24、msg);else if(msg.getType() = 44) /由獲勝方通知失敗方,勝負(fù)情況Server.getUsersOL().get(msg.getAccepter().getAccount().send(msg); catch (Exception e) /異常處理b = false; /如果出現(xiàn)異常則修改線程終止符,使線程結(jié)束。從源碼中可以看出,虛擬服務(wù)器主要的工作,就是解析消息的類型,并根據(jù)消息的類型進(jìn)行相應(yīng)的處理。例如在消息的類型為10時(shí),虛擬服務(wù)器就調(diào)用登錄驗(yàn)證Logon來對(duì)用戶的信息進(jìn)行驗(yàn)證,根據(jù)登錄驗(yàn)證的驗(yàn)證結(jié)果,再返回相應(yīng)的消息給客戶端的Client。6.2.3 登錄

25、驗(yàn)證Logonprivate static UserDao userDao = new UserDao();/調(diào)用底層的用戶數(shù)據(jù)訪問功能public Message validate(User user) Message msg = new Message();/返回驗(yàn)證的結(jié)果信息User u = userDao.findByAccount(user.getAccount();/賬戶存在if(u = null) /賬戶不存在msg.setType(11); msg.setContent(賬戶不存在!);else/該賬戶存在u = userDao.findByAccountAndPassword

26、(user.getAccount(), user.getPassword();if(u = null) /密碼不對(duì)msg.setType(12); msg.setContent(密碼不對(duì)!);else/賬戶、密碼正確if(Server.getUsersOL().get(user.getAccount() = null) /可以登陸msg.setType(13);msg.setAccepter(u);else/已登錄msg.setType(14); msg.setContent(不能重復(fù)登錄!);return msg;登錄驗(yàn)證,主要分為三步:1.首先驗(yàn)證用戶的賬號(hào)合法性,即該賬號(hào)是否存在。只有賬

27、號(hào)存在才會(huì)進(jìn)行后續(xù)的驗(yàn)證。2.如果用戶的賬號(hào)存在,再驗(yàn)證密碼是否與賬號(hào)匹配,如果匹配成功,則返回該用戶的信息。3.接下來則從主服務(wù)那里去判定該用戶是否已經(jīng)登錄,對(duì)于已登錄的用戶則不再給予登錄操作。6.2.4 Hibernate配置文件 訪問數(shù)據(jù)的操作要借助Hibernate框架來完成。使用了Hibernate,我們就可以不用再寫很復(fù)雜繁瑣的JDBC語句去建立與數(shù)據(jù)庫的連接,而將這些操作全都交給Hibernate來完成。Hibernate的配置文件如下:truecom.mysql.jdbc.Driverjdbc:mysql:/localhost:3306/NFCroot846255org.hib

28、ernate.dialect.MySQLDialectcreate6.2.5 Hibernate會(huì)話工廠在完成了配置之后,為了可以使用它來進(jìn)行數(shù)據(jù)的操作,我們需要先創(chuàng)建會(huì)話工廠,因?yàn)閿?shù)據(jù)的操作是基于會(huì)話的。會(huì)話工廠的代碼如下:public class Hibernate private static SessionFactory sf = null;/會(huì)話工廠private static Session session = null;static Configuration cf = new Configuration();cf.configure();/在默認(rèn)路徑下,讀取配置文件。Servi

29、ceRegistry sr = new StandardServiceRegistryBuilder().applySettings(cf.getProperties().build();sf = cf.buildSessionFactory(sr);session = sf.openSession();private Hibernate() public static SessionFactory getSessionFactory() returnsf;public static Session getSession() returnsession;這里的會(huì)話工廠SessionFactor

30、y使用的是Java設(shè)計(jì)模式中的單例模式,唯一的SessionFactory對(duì)象能夠保證數(shù)據(jù)操作的可控性,讓我們能夠利用事務(wù)有效的保證被操作數(shù)據(jù)的一致性。在配置文件中羅列出了所使用的實(shí)體類,通過在實(shí)體類中使用相應(yīng)的注解標(biāo)明,Hibernate就可以將一個(gè)實(shí)體類映射為一張表,而實(shí)體類的屬性則將映射為表中的字段。實(shí)體類就相當(dāng)于一張表,為了操縱它,我為實(shí)體類分別寫了一個(gè)操作類。利用會(huì)話Session來實(shí)現(xiàn)數(shù)據(jù)的增刪改查。6.2.6 數(shù)據(jù)操作類 UserDaopublic class UserDao private Session session = null;public UserDao() sess

31、ion = Hibernate.getSession();/獲取會(huì)話public User findByAccount(Integer account) /根據(jù)賬號(hào)來查詢用戶Criteria c = session.createCriteria(User.class);c.add(Restrictions.eq(account, account);User user = (User)c.uniqueResult();return user;/根據(jù)賬號(hào)和密碼來查詢用戶public User findByAccountAndPassword(Integer account, String pass

32、word) Criteria c = session.createCriteria(User.class);c.add(Restrictions.eq(account, account);c.add(Restrictions.eq(password, password);User user = (User)c.uniqueResult();return user;/查詢?nèi)坑脩魀ublic List queryAll() Criteria c = session.createCriteria(User.class);SuppressWarnings(unchecked)List users =

33、 c.list();return users;6.2.7 數(shù)據(jù)操作類 CrowdDaopublic class CrowdDao /群組數(shù)據(jù)訪問層private Session session = null;public CrowdDao() session = Hibernate.getSession();public void save(Crowd crowd) /保存群組Transaction transaction = session.beginTransaction();session.save(crowd);mit();public void upda

34、te(Crowd crowd) /更新群組Transaction transaction = session.beginTransaction();session.update(crowd);mit();public void delete(Crowd crowd) /刪除群組Transaction transaction = session.beginTransaction();session.delete(crowd);mit();以上兩個(gè)數(shù)據(jù)訪問類都使用了基于Criteria的查詢方式,該方式是面向?qū)ο蟮模ㄟ^為該對(duì)象設(shè)置一些相

35、應(yīng)的屬性值,就可以獲取滿足條件的數(shù)據(jù)。如:c.add(Restrictions.eq(account, account)等價(jià)于where account = account.從思想的層面上來講很大程度上有別于傳統(tǒng)的SQL查詢方式。Hibernate還提供了封裝過的save(Object);update(Object);delete(Object)等方法供我們使用,以便提高開發(fā)效率。通過如此簡單而又精煉的代碼即可完成對(duì)數(shù)據(jù)的處理,極大地解放了程序員的勞動(dòng)力。6.2.8 表結(jié)構(gòu)設(shè)計(jì)表6-1 User實(shí)體類對(duì)應(yīng)的表字段數(shù)據(jù)類型備注accountInt賬號(hào)passwordvarchar密碼nameva

36、rchar昵稱idInt主鍵表6-2 Crowd實(shí)體類對(duì)應(yīng)的表字段數(shù)據(jù)類型備注namevarchar群組名稱idInt主鍵關(guān)于用戶的信息主要有兩張表。一張是用戶自身的信息表,該表用來存儲(chǔ)用戶的個(gè)人資料;另一張表是群組表,用來記錄每個(gè)用戶所擁有的群組信息。每個(gè)用戶可以擁有多個(gè)群組(如:朋友、陌生人等),而每個(gè)群組又可以擁有多名用戶(如:朋友列表下有張三、李四兩個(gè)人)。兩張表是多對(duì)多關(guān)系4。需要指明的是,在這兩張表里面都沒有通過外鍵來建立關(guān)聯(lián)關(guān)系,這是因?yàn)榭梢酝ㄟ^Hibernate的注解ManyToMany來完成關(guān)聯(lián)關(guān)系的映射。Hibernate在處理這個(gè)注解時(shí),自動(dòng)地去幫我們創(chuàng)建一張中間表,并用

37、它來維護(hù)表之間的關(guān)聯(lián)關(guān)系,這使得我們?cè)跇?gòu)建表結(jié)構(gòu)的時(shí)候變得異常輕松。6.2.9 用戶類UserEntityTable(name = User)public class User implements Serializable private static final long serialVersionUID = 1L;IdGeneratedValue(strategy = GenerationType.AUTO)Column(name = id, unique = true)private Integer id;/主鍵Column(name = account)private Integer

38、 account;/賬號(hào)Column(name = password)private String password;/密碼Column(name = name)private String name;/昵稱ManyToMany(mappedBy = users, fetch = FetchType.EAGER)private List crowds = new ArrayList();/用戶所屬的群組6.2.10 群組類CrowdEntityTable(name = Crowd)public class Crowd implements Serializableprivate static

39、final long serialVersionUID = 1L;IdGeneratedValue(strategy = GenerationType.AUTO) Column(name = id)private Integer id;/主鍵Column(name = name)private String name;/群組的名稱ManyToMany(fetch = FetchType.EAGER)/(mappedBy = crowds)private List users = new ArrayList();/群組所包含的用戶public Crowd() 1.通過Entry來標(biāo)明它是一個(gè)實(shí)體

40、類。2.通過Tabel(name=”tableName”)來指明該實(shí)體類與數(shù)據(jù)庫中哪一張表相對(duì)應(yīng)。3.通過Id來指明表中的主鍵。4.通過GeneratedValue(strategy = GenerationType.AUTO)來指明主鍵的增長策略。5.通過Column(name = name)來指明類中的某個(gè)屬性與數(shù)據(jù)庫表中哪個(gè)字段名相匹配。6.通過ManyToMany(fetch = FetchType.EAGER)來指明兩個(gè)實(shí)體類之間的多對(duì)多關(guān)系。使用了Hibernate之后,作為程序員的我們完全可以使用面向?qū)ο蟮乃季S來處理數(shù)據(jù)。尤其是在Hibernate的配置文件中使用了create之

41、后,Hibernamte甚至能夠自動(dòng)幫我們依據(jù)實(shí)體類來創(chuàng)建相應(yīng)的表結(jié)構(gòu),我們無需再為操作數(shù)據(jù)庫而苦惱。6.3 客戶端6.3.1 Client對(duì)于客戶端所有的通信操作都是基于該Client來完成,它是客戶端的守護(hù)線程public User user = null;/Client所服務(wù)的用戶private Map map = new HashMap();/用戶的聊天窗體MapOverridepublic void run() while(true) try Message msg = (Message)input.readObject();if(msg.getType() = 11) /賬戶不存在

42、Logon.getInstance().setInfo(msg.getContent();else if(msg.getType() = 12) /密碼不對(duì)Logon.getInstance().setInfo(msg.getContent();else if(msg.getType() = 13) /可以登陸User user = msg.getAccepter();setUser(user);Logon.getInstance().setVisible(false);Friend.getInstance().setName(user.getName();else if(msg.getTyp

43、e() = 14) /已登錄Logon.getInstance().setInfo(msg.getContent();else if(msg.getType() = 20) /轉(zhuǎn)發(fā)聊天消息this.getMap().get(msg.getSender().getAccount().append(msg);else if(msg.getType() = 40) /收到來自好友的游戲邀請(qǐng)F(tuán)riend.getInstance().requestGame(msg.getSender();else if(msg.getType() = 42) /好友同意開始游戲Friend.getInstance().

44、startGame(msg.getAccepter();else if(msg.getType() = 43) /好友拒絕來游戲邀請(qǐng)F(tuán)riend.getInstance().refuseGame(msg.getSender();else if(msg.getType() = 44) /勝負(fù)已分,游戲中止/Game.getInstance().loseGame(); catch (Exception e) /異常處理 這個(gè)位于客戶端的后臺(tái)守護(hù)線程,接收服務(wù)器推送過來的消息。 類似于虛擬服務(wù)器它也根據(jù)消息的類型,對(duì)消息進(jìn)行分類處理,同時(shí)也將用戶的操作封裝成消息對(duì)象傳遞給虛擬服務(wù)器。當(dāng)一個(gè)用戶與多個(gè)

45、好友進(jìn)行會(huì)話時(shí),為了方便管理與每個(gè)好友的會(huì)話,在該類中使用了一個(gè)map集合。當(dāng)該類收到來自某個(gè)好友的聊天消息,在提取出消息內(nèi)容后,從map中根據(jù)鍵值對(duì)來得到指定好友的聊天窗體,將聊天數(shù)據(jù)交給該聊天窗體進(jìn)行顯示。該類只是負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行收發(fā),而數(shù)據(jù)的顯示等操作,則交給上層的界面來完成。彼此各司其職,這樣就實(shí)現(xiàn)了分層的效果。6.3.2 登錄界面Logon圖6-1 登錄界面/登錄界面所用到的控件private static Logon logon = new Logon();/窗體本身private JPanel head = new JPanel();/頭部private JLabel min =

46、new JLabel(new ImageIcon(image/min.png);/最小化private JLabel close = new JLabel(new ImageIcon(image/close.png);/關(guān)閉private JPanel body = new JPanel();/身體private JLabel info = new JLabel();/信息提示private JLabel accountLabel = new JLabel(賬號(hào):);/賬號(hào)標(biāo)簽private JLabel passwordLabel = new JLabel(密碼:);/密碼標(biāo)簽private

47、 JTextField account = new JTextField();/賬號(hào)文本框private JPasswordField password = new JPasswordField();/密碼文本框private JButton login = new JButton(登錄);/登錄按鈕private JPanel foot = new JPanel();/尾部private JLabel set =new JLabel(new ImageIcon(image/set.png);/設(shè)置登錄界面使用來Swing的網(wǎng)格包布局GridBagLayout來放置各個(gè)組件在面板JPanel中

48、的位置。6.3.3 好友界面Friend圖6-2 好友界面/省略了與登錄界面外層布局的內(nèi)容private JPanel body = new JPanel();/身體private JPanel show = new JPanel();/用戶信息展示private JLabel img = new JLabel(new ImageIcon(image/me.png);/用戶照片private JPanel info = new JPanel();/用戶的昵稱、等級(jí)private JLabel name = new JLabel();/用戶昵稱private JLabel level = new

49、 JLabel();/用戶等級(jí)private JScrollPane jsp = null;/容納好友列表的窗體private JTree tree = null;/用戶的好友列表在好友界面中,通過遍歷Client傳過來的用戶信息User中的List來構(gòu)建好友列表樹JTree,這里使用了邊界布局的方式來放置組件。6.3.4 聊天界面Chart圖6-3 聊天界面private JPanel body = new JPanel();/身體private JTextArea output = new JTextArea();/顯示框private JScrollPane read = new JSc

50、rollPane(output);/顯示框的滾動(dòng)窗體private JTextArea input = new JTextArea();/輸入框private JScrollPane write = new JScrollPane(input);/輸入框的滾動(dòng)窗體private JPanel jp = new JPanel();/輸入框的滾動(dòng)窗體private JButton enter = new JButton(發(fā)送);/發(fā)送按鈕private JButton cancel = new JButton(取消);/取消按鈕private User friend = null;/聊天的好友聊天界面中利用JTextArea來顯示聊天對(duì)話的內(nèi)容,當(dāng)聊天內(nèi)容過多時(shí),可以拖動(dòng)外層滾動(dòng)面板JScrollPane提供的滾動(dòng)條來翻閱查看。6.3.5 游戲界面Game圖6-4 游戲界面在游戲界面,產(chǎn)生8*8=64個(gè)網(wǎng)格,所以需要32對(duì)按鈕,其中每一對(duì)中的兩個(gè)按鈕

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論