2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  2015屆本科畢業(yè)論文(設(shè)計)</p><p>  基于JAVA語言的網(wǎng)絡(luò)聊天軟件</p><p>  代碼:http://download.csdn.net/detail/syqwe/8890181</p><p>  姓 名: XXXX </p><p>  系 別:

2、 計算機(jī)與信息技術(shù)學(xué)院 </p><p>  專 業(yè): 計算機(jī)科學(xué)與技術(shù) </p><p>  學(xué) 號: XXXXXXXX </p><p>  指導(dǎo)教師: XXXXXX </p><p>  2015年 05月 08日 </p><p

3、><b>  目 錄</b></p><p><b>  摘要II</b></p><p>  AbstractII</p><p><b>  1 軟件介紹3</b></p><p><b>  1.1 背景3</b></p>

4、<p><b>  1.2 目的3</b></p><p><b>  2 開發(fā)技術(shù)3</b></p><p>  2.1 界面層技術(shù)3</p><p>  2.2 通信層技術(shù)3</p><p>  2.3 數(shù)據(jù)層技術(shù)3</p><p><b>

5、;  3 開發(fā)環(huán)境4</b></p><p>  3.1 硬件環(huán)境4</p><p>  3.2 軟件環(huán)境4</p><p><b>  4 需求分析4</b></p><p>  4.1 客戶端需求分析4</p><p>  4.2 服務(wù)器需求分析4</p>

6、<p>  4.3 數(shù)據(jù)層需求分析4</p><p><b>  5 系統(tǒng)架構(gòu)5</b></p><p><b>  6 設(shè)計實現(xiàn)5</b></p><p>  6.1 消息封裝類Message5</p><p><b>  6.2 服務(wù)器6</b><

7、;/p><p>  6.2.1 主服務(wù)器Server6</p><p>  6.2.2 虛擬服務(wù)器VirtualServer6</p><p>  6.2.3 登錄驗證Logon7</p><p>  6.2.4 Hibernate配置文件8</p><p>  6.2.5 Hibernate會話工廠8</

8、p><p>  6.2.6數(shù)據(jù)操作類 UserDao9</p><p>  6.2.7 數(shù)據(jù)操作類 CrowdDao10</p><p>  6.2.8 表結(jié)構(gòu)設(shè)計10</p><p>  6.2.9 用戶類User11</p><p>  6.2.10 群組類Crowd11</p><p&g

9、t;  6.3 客戶端11</p><p>  6.3.1 Client11</p><p>  6.3.2 登錄界面Logon13</p><p>  6.3.3 好友界面Friend14</p><p>  6.3.4 聊天界面Chart15</p><p>  6.3.5 游戲界面Game16<

10、/p><p>  6.3.6 游戲規(guī)則17</p><p>  6.3.7 算法思路17</p><p><b>  7測試說明18</b></p><p><b>  總結(jié)感想18</b></p><p><b>  參考文獻(xiàn)20</b><

11、/p><p><b>  致 謝20</b></p><p>  基于JAVA語言的網(wǎng)絡(luò)聊天軟件</p><p><b>  摘要</b></p><p>  本聊天軟件是使用Java編程語言來完成開發(fā)的。在軟件的開發(fā)過程中,使用Socket來進(jìn)行網(wǎng)絡(luò)通信,使用Swing來繪制界面,使用開源的對象關(guān)系

12、映射框架Hibernate來進(jìn)行數(shù)據(jù)訪問。其中Hibernate能夠使程序員以面向?qū)ο蟮乃季S來處理關(guān)系型數(shù)據(jù)。本聊天軟件不僅支持聊天,還加入了“連連看”游戲。該游戲讓人們之間的交流得到延伸,讓彼此之間的關(guān)系更進(jìn)一步。本聊天軟件主要有以下三個功能:一、登錄驗證;二、聊天通信;三、游戲互動。</p><p><b>  關(guān)鍵詞</b></p><p>  聊天;Java;

13、Swing;套接字;Hibernate</p><p>  Network Chat Software Based on JAVA Language</p><p><b>  Abstract</b></p><p>  This chat software was developed by using the Java programmin

14、g language to complete. In the process of software development, Socket is used for network communication, Swing is used to draw the interface, object relational mapping framework Hibernate open source is used for data ac

15、cess.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 communic

16、ation bet</p><p><b>  Keywords</b></p><p>  Chat; Java; Socket; Swing; Hibernate</p><p><b>  1 軟件介紹</b></p><p><b>  1.1 背景</b></p

17、><p>  在當(dāng)今世界,人們的追求早已不局限于物質(zhì)生活,而更多的是渴望在精神領(lǐng)域上得到滿足,這突出表現(xiàn)在我們的人際交往上。人們渴望與遠(yuǎn)在天涯又或是近在咫尺的親朋好友無拘無束地溝通,而此時此刻一款即時通訊工具對于我們來說,它的重要性不言而喻!</p><p>  在計算機(jī)網(wǎng)絡(luò)愈來愈普及的今天,人們對于網(wǎng)絡(luò)的依賴也愈來愈大,類似于QQ、MSN等聊天工具早已融入到我們?nèi)粘I钪?,為我們的生活帶來?/p>

18、歡樂和便利。因此,我力圖開發(fā)一個在線的即時聊天軟件以滿足我們在日常生活中交流的需要,為我們的生活增光涂色。</p><p><b>  1.2 目的</b></p><p>  本聊天軟件以通信為其核心,同時融入了娛樂的元素,一款十分經(jīng)典的“連連看”游戲。讓我們在聊天的同時還能與好友一起通過游戲來增進(jìn)彼此的感情,讓彼此的心更加靠近,讓我們的生活從此不再單調(diào)。</

19、p><p>  本聊天軟件是在Windows環(huán)境下進(jìn)行開發(fā)的。通過Swing實現(xiàn)操作界面的設(shè)計,使用Java語言中的Socket(套接字)來實現(xiàn)網(wǎng)絡(luò)之間的通信,使用Hibernate框架來進(jìn)行數(shù)據(jù)的增刪改查,而MySQL數(shù)據(jù)庫則用于數(shù)據(jù)的存儲與管理。在開發(fā)的過程中綜合運(yùn)用自己所學(xué)到的各種技術(shù),一方面強(qiáng)化我在學(xué)校里學(xué)到的知識與專業(yè)技能,另一方面也使得我更好地去理解有關(guān)軟件開發(fā)的流程與思想。這些能力與經(jīng)驗都將為我后續(xù)的學(xué)

20、習(xí)和工作打下堅實牢固的基礎(chǔ),不斷地提升個人的職業(yè)素養(yǎng)。</p><p>  同時,本聊天軟件將不斷與信息領(lǐng)域的系統(tǒng)相互集成和滲透,向校園、集團(tuán)等群體進(jìn)行拓展,應(yīng)用將突破個體,并應(yīng)用于遠(yuǎn)程教學(xué)、遠(yuǎn)程演示、網(wǎng)絡(luò)會議等。以豐富的接入方式,以保質(zhì)保量的服務(wù),以友好的用戶體驗呈現(xiàn)在世人面前。并且不斷地擴(kuò)大功能與應(yīng)用范圍,滿足未來時代的話音。</p><p><b>  2 開發(fā)技術(shù)<

21、/b></p><p>  本聊天軟件用到的技術(shù)涉及到3個層面,它們分別是:界面層、通信層、數(shù)據(jù)持久化層。</p><p><b>  2.1 界面層技術(shù)</b></p><p>  使用Java中的Swing來進(jìn)行操作界面的開發(fā)。Swing是一款功能強(qiáng)大,使用方便,跨平臺的圖形界面開發(fā)工具包,專門用于開發(fā)Java應(yīng)用程序的用戶界面。Sw

22、ing允許您設(shè)定自己喜愛的界面風(fēng)格,它可以是跨平臺的Java風(fēng)格,也可以是我們熟悉的Window風(fēng)格,這一點是其他界面開發(fā)工具很難比擬的。</p><p><b>  2.2 通信層技術(shù)</b></p><p>  利用java中的Socket(套接字)來完成客戶端與服務(wù)器的交互。該Socket是基于TCP/IP通信協(xié)議的數(shù)據(jù)傳輸對象,它提供了安全可靠的通信機(jī)制。在服

23、務(wù)器使用ServerSocket創(chuàng)建監(jiān)聽端口,而在客戶端則使用Socket來連接服務(wù)器。在連接成功時,應(yīng)用程序的客戶端和服務(wù)器都將產(chǎn)生一個Socket實例,本聊天程序就是通過利用這個Socket實例來實現(xiàn)兩段的通信和其他功能。在通信的過程中我也使用了多線程編程技術(shù)以實現(xiàn)復(fù)雜的交互行為。尤其是在服務(wù)器端,服務(wù)器每接收一個客戶端就會產(chǎn)生一個虛擬服務(wù)器來單獨(dú)為其服務(wù)。通過該技術(shù)的運(yùn)用使得本聊天軟件可以允許多人同時在線與自己的好友暢懷的交流。&

24、lt;/p><p><b>  2.3 數(shù)據(jù)層技術(shù)</b></p><p>  考慮到現(xiàn)如今框架技術(shù)的興起,在數(shù)據(jù)層的處理上我也使用了開源的對象關(guān)系映射框架Hibernate。它對Java的數(shù)據(jù)庫連接(JDBC)進(jìn)行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用面向?qū)ο缶幊趟季S來操縱數(shù)據(jù)庫。</p><p>  本聊天軟件使用MySQ

25、L作為數(shù)據(jù)持久化存的儲器。MySQL是一個真正的多用戶、多線程數(shù)據(jù)庫服務(wù)器,是以客戶端/服務(wù)器架構(gòu)實現(xiàn)的,它由一個服務(wù)器守護(hù)線程和很多不同的客戶程序和庫組成。MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),通過表來管理數(shù)據(jù),增加了處理數(shù)據(jù)的速度并提高了操作的靈活性。Hibernate+MySQL的組合在數(shù)據(jù)的處理上讓我變得得心應(yīng)手,同時也讓這個程序變得更加強(qiáng)壯與穩(wěn)健。</p><p><b>  3 開發(fā)環(huán)境&l

26、t;/b></p><p><b>  3.1 硬件環(huán)境</b></p><p>  硬件配置:AMD X64 兼容桌面平臺。</p><p><b>  3.2 軟件環(huán)境</b></p><p>  操作系統(tǒng):Windows8.1企業(yè)版。</p><p>  JDK版

27、本:JDK_8。</p><p>  數(shù)據(jù)庫:MySQL Server5.6。</p><p>  開發(fā)工具:MyEclipse2015。</p><p>  第三方工具包:Hibernate。</p><p><b>  4 需求分析</b></p><p>  本聊天軟件是在C/S模式下完成開

28、發(fā)的,整個系統(tǒng)分為兩個重要的組成部分:客戶端、服務(wù)器。</p><p>  在客戶端用戶可以通過登錄模塊進(jìn)行登錄操作,登錄成功的用戶則進(jìn)入到好友列表界面;選中指定的好友,就可以發(fā)起與該好友的會話,通過聊天模塊與好友相互噓寒問暖;在聊天模塊中,既可以發(fā)送消息,同時也可以發(fā)起與該好友的游戲互動,在PK中一決雌雄。</p><p>  在服務(wù)器,服務(wù)器要為每個用戶進(jìn)行服務(wù),對用戶登錄信息進(jìn)行驗證

29、,接受來自用戶的消息請求并按照消息的類型進(jìn)行各種不同的操作和處理。</p><p>  4.1 客戶端需求分析</p><p>  客戶端實現(xiàn)的功能主要有:</p><p>  1.登錄模塊:用戶在登錄界面中輸入個人身份信息,由客戶端將信息傳遞至服務(wù)器進(jìn)行用戶合法性的驗證,驗證成功,則跳轉(zhuǎn)到聊天模塊,否則給出相關(guān)提示。</p><p>  2

30、.好友模塊:顯示好友列表,通過該模塊可以發(fā)起與好友的會話或者游戲。</p><p>  3.聊天模塊:能夠及時的發(fā)送用戶的文本消息,同時能夠即時地將好友發(fā)過來的消息展現(xiàn)出來。</p><p>  4.游戲模塊:開啟兩個好友之間的游戲互動。</p><p>  5.界面效果:布局整潔、大方;色彩光鮮、奪目;操作簡單、舒適。</p><p>  

31、4.2 服務(wù)器需求分析</p><p>  服務(wù)器作為后臺程序,實現(xiàn)的功能主要有:</p><p>  1.能夠接收每個客戶端的通信連接。</p><p>  2.調(diào)用數(shù)據(jù)訪問層來驗證用戶的個人信息。</p><p>  3.能夠及時接受用戶的聊天消息并進(jìn)行消息的轉(zhuǎn)發(fā)。</p><p>  4.3 數(shù)據(jù)層需求分析<

32、;/p><p>  數(shù)據(jù)層實現(xiàn)的功能主要有:響應(yīng)來自服務(wù)器的數(shù)據(jù)訪問請求。</p><p><b>  5 系統(tǒng)架構(gòu)</b></p><p>  本系統(tǒng)以客戶端、服務(wù)器以及數(shù)據(jù)庫三維一體構(gòu)建起了系統(tǒng)的整個架構(gòu)。</p><p><b>  圖5-1 系統(tǒng)架構(gòu)</b></p><p&g

33、t;  客戶端:用戶在客戶端的所有操作都依賴于客戶端的守護(hù)線程Client來完成,該線程負(fù)責(zé)與服務(wù)器進(jìn)行數(shù)據(jù)交互。當(dāng)用戶需要登錄時,由登錄模塊調(diào)用Client向服務(wù)器發(fā)送身份驗證請求。服務(wù)器接收到該驗證請求之后便進(jìn)行驗證處理并返回驗證結(jié)果給Client。如果Client判定驗證成功則從驗證結(jié)果中提取出個人信息并開啟好友模塊;當(dāng)用戶在好友模塊中打開了一個聊天模塊后,便可以調(diào)用Client來進(jìn)行聊天消息的傳遞;如果打開的是游戲模塊,則先完成

34、游戲的一方調(diào)用Client向另一方發(fā)送獲勝消息,并終止另一方的游戲。</p><p>  服務(wù)器:服務(wù)器分為主服務(wù)器與虛擬服務(wù)器。主服務(wù)器Server作為服務(wù)器的守護(hù)線程,主要負(fù)責(zé)接收客戶端的連接,在服務(wù)器接收到一個客戶端后,就開啟一個虛擬服務(wù)器VirtualServer來為該用戶服務(wù);虛擬服務(wù)器通過調(diào)用底層的登錄模塊等來為用戶提供登錄驗證等服務(wù)。</p><p>  本架構(gòu)中,借用了Sp

35、ring中的分層思想,這也是在軟件項目開發(fā)過程中經(jīng)常采用的方案。將操作或功能分為不同的層次,各層次之間想對獨(dú)立,高層調(diào)用底層的功能,低層為高層提供服務(wù)。一方面,可以將同種類型的操作放在一起集中管理。另一方面,將操作提取出來,提高了代碼的復(fù)用性和程序的擴(kuò)展性。分層使得程序流程變得清晰明了,而且維護(hù)成本相對低廉[1]。</p><p><b>  6 設(shè)計實現(xiàn)</b></p>&l

36、t;p>  6.1 消息封裝類Message</p><p>  Socket: 套接字,在本聊天軟件中作為客戶端與服務(wù)器之間通信載體,為系統(tǒng)的交互提供支撐。為了方便開發(fā),我將客戶端與服務(wù)器之間傳送的消息封裝成一個消息對象類Message.。繼而使用從Socket獲取的對象輸入流、對象輸出流來收發(fā)消息對象[2]。</p><p>  封裝的消息類代碼如下所示:</p>

37、<p>  //消息封裝類實現(xiàn)了序列化接口</p><p>  public class Message implements Serializable{ </p><p>  private static final long serialVersionUID = -2842889997276284663L;</p><p>  private Inte

38、ger type;//消息的類型</p><p>  private Date senDate= new Date();//消息創(chuàng)建的時間</p><p>  private User sender; //消息的發(fā)送者</p><p>  private User accepter; //消息的接收者</p><p>  private St

39、ring content; //消息的內(nèi)容</p><p><b>  }</b></p><p>  其中,消息的類型在服務(wù)器和客戶端都遵循著統(tǒng)一的標(biāo)準(zhǔn)。這樣的話,客戶端發(fā)給服務(wù)器什么樣的消息,服務(wù)器在解析出消息的類型之后, 就可以進(jìn)行相應(yīng)的操作了。為了實現(xiàn)消息載體以對象的形式在網(wǎng)絡(luò)間進(jìn)行傳遞,該消息類必須實現(xiàn)Java中的序列化接口,這一點是其他通過字節(jié)流或者字符流

40、傳遞消息所不同的。</p><p><b>  6.2 服務(wù)器</b></p><p>  6.2.1 主服務(wù)器Server</p><p>  主服務(wù)器主要充當(dāng)一個前置服務(wù),用來接收客戶端的連接。在獲得一個客戶端的連接后就會產(chǎn)生一個虛擬服務(wù)器,并將該連接委托給虛擬服務(wù)器讓它來為用戶提供服務(wù)。同時主服務(wù)器也維護(hù)著所有的虛擬服務(wù)器,它扮演著一個管

41、理者的角色[3]。</p><p>  //服務(wù)器維護(hù)的虛擬服務(wù)器列表,一個Map集合,通過<用戶的賬號:為該用戶服務(wù)的虛擬服務(wù)器>這種鍵值對的對應(yīng)關(guān)系來管理虛擬服務(wù)器。</p><p>  private static HashMap<Integer, VirtualServer> usersOL = new HashMap<Integer, Virtual

42、Server>();</p><p><b>  try {</b></p><p>  serverSocket = new ServerSocket(port);</p><p>  //這里通過無限循環(huán),來不停地接受用戶的連接。</p><p>  while(true) { </p><

43、;p>  clientSocket = serverSocket.accept();//接收客戶端的連接</p><p>  new Thread(new VirtualServer(clientSocket)).start();//開啟虛擬服務(wù)器來為其服務(wù)</p><p><b>  }</b></p><p>  } catch (I

44、OException e) {//異常處理</p><p><b>  }</b></p><p>  6.2.2 虛擬服務(wù)器VirtualServer</p><p>  虛擬服務(wù)器才是真正的服務(wù)載體,當(dāng)它接收從主服務(wù)器哪里得到的來自客戶端的連接后,便可進(jìn)行一對一的服務(wù)。所有的消息都經(jīng)過它來處理。當(dāng)虛擬服務(wù)器之間需要交互時,虛擬服務(wù)器可以從主

45、服務(wù)器那里拿到主服務(wù)器所維護(hù)的虛擬服務(wù)器列表。并從中根據(jù)鍵值對來獲取指定的虛擬服務(wù)器,然后再進(jìn)行后續(xù)的操作。</p><p>  該類實現(xiàn)了Runnable接口,該接口是將線程所運(yùn)行的程序代碼提取出來封裝成為一個對象。Runnable對象可以用來創(chuàng)建線程。</p><p>  private User user = null;//虛擬服務(wù)器所服務(wù)的用戶</p><p&g

46、t;<b>  @Override</b></p><p>  public void run() {</p><p>  Boolean b = true;//線程結(jié)束控制符</p><p>  //接收來自客戶端封裝的消息對象</p><p>  Message msg = null; </p><

47、;p>  while(b) {</p><p><b>  try {</b></p><p>  msg = (Message)input.readObject();//客戶端Client發(fā)送過來的消息對象</p><p>  //根據(jù)消息的類型進(jìn)行不同的處理</p><p>  if(msg.getType(

48、) == 10) {//登錄驗證操作</p><p>  Message returnMsg = new Login().validate(msg.getSender());//登錄驗證</p><p>  if(returnMsg.getType() == 13) {</p><p>  //驗證成功,則將該虛擬服務(wù)器添加到主服務(wù)器管理的虛擬服務(wù)器列表</p

49、><p>  Server.getUsersOL().put(returnMsg.getAccepter().getAccount(), this);</p><p><b>  }</b></p><p>  send(returnMsg);</p><p>  }else if(msg.getType() == 20)

50、{//轉(zhuǎn)發(fā)聊天消息Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg); </p><p>  send(msg);</p><p>  }else if(msg.getType() == 30) {//退出操作</p><p>  Server.getUsers

51、OL().remove(user.getAccount());</p><p>  Thread.currentThread().interrupt();//結(jié)束當(dāng)前線程</p><p>  }else if(msg.getType() == 40) {//邀請好友進(jìn)行游戲</p><p>  Server.getUsersOL().get(msg.getAccep

52、ter().getAccount()).send(msg);</p><p>  }else if(msg.getType() == 41) {//好友同意游戲邀請,雙方開始游戲</p><p>  Message m = new Message();</p><p>  m.setType(42); m.setAccepter(msg.getAccepter()

53、);</p><p>  Server.getUsersOL().get(msg.getAccepter().getAccount()).send(m); </p><p>  m.setAccepter(msg.getSender());</p><p><b>  send(m);</b></p><p>  }e

54、lse if(msg.getType() == 43) {//拒絕好友的游戲邀請</p><p>  Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg);</p><p>  }else if(msg.getType() == 44) {//由獲勝方通知失敗方,勝負(fù)情況</p><p>

55、  Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg);</p><p><b>  }</b></p><p>  } catch (Exception e){ //異常處理</p><p>  b = false; //如果出現(xiàn)異常則修改線程終止符,使線程結(jié)束。

56、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  從源碼中可以看出,虛擬服務(wù)器主要的工作,就是解析消息的類型,并根據(jù)消息的類型進(jìn)行相應(yīng)的處理。例如在消息的類型為10時,虛擬服務(wù)器就調(diào)用登

57、錄驗證Logon來對用戶的信息進(jìn)行驗證,根據(jù)登錄驗證的驗證結(jié)果,再返回相應(yīng)的消息給客戶端的Client。</p><p>  6.2.3 登錄驗證Logon</p><p>  private static UserDao userDao = new UserDao();//調(diào)用底層的用戶數(shù)據(jù)訪問功能</p><p>  public Message validat

58、e(User user) {</p><p>  Message msg = new Message();//返回驗證的結(jié)果信息</p><p>  User u = userDao.findByAccount(user.getAccount());//賬戶存在</p><p>  if(u == null) {//賬戶不存在</p><p>

59、;  msg.setType(11); msg.setContent("賬戶不存在!");</p><p>  }else{//該賬戶存在</p><p>  u = userDao.findByAccountAndPassword(user.getAccount(), user.getPassword());</p><p>  if(u ==

60、 null){ //密碼不對</p><p>  msg.setType(12); msg.setContent("密碼不對!");</p><p>  }else{//賬戶、密碼正確</p><p>  if(Server.getUsersOL().get(user.getAccount()) == null) {//可以登陸</p>

61、;<p>  msg.setType(13);msg.setAccepter(u);</p><p>  }else{//已登錄</p><p>  msg.setType(14); msg.setContent("不能重復(fù)登錄!");</p><p><b>  }</b></p><p&

62、gt;<b>  }</b></p><p><b>  }</b></p><p>  return msg;</p><p><b>  }}</b></p><p>  登錄驗證,主要分為三步:</p><p>  1.首先驗證用戶的賬號合法性,即

63、該賬號是否存在。只有賬號存在才會進(jìn)行后續(xù)的驗證。</p><p>  2.如果用戶的賬號存在,再驗證密碼是否與賬號匹配,如果匹配成功,則返回該用戶的信息。</p><p>  3.接下來則從主服務(wù)那里去判定該用戶是否已經(jīng)登錄,對于已登錄的用戶則不再給予登錄操作。</p><p>  6.2.4 Hibernate配置文件 </p><p> 

64、 訪問數(shù)據(jù)的操作要借助Hibernate框架來完成。使用了Hibernate,我們就可以不用再寫很復(fù)雜繁瑣的JDBC語句去建立與數(shù)據(jù)庫的連接,而將這些操作全都交給Hibernate來完成。Hibernate的配置文件如下:</p><p>  <session-factory></p><p>  <!—在控制臺打印出執(zhí)行數(shù)據(jù)訪問的SQL語句 --></p&g

65、t;<p>  <property name="show_sql">true</property></p><p>  <!—連接數(shù)據(jù)庫所使用的驅(qū)動程序 --></p><p>  <property name="hibernate.connection.driver_class">com

66、.mysql.jdbc.Driver</property></p><p>  <!-- 連接數(shù)據(jù)庫的地址 --></p><p>  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/NFC</property></p>

67、<p>  <property name="hibernate.connection.username">root</property></p><p>  <property name="hibernate.connection.password">846255</property></p>&l

68、t;p>  <!-- 數(shù)據(jù)庫的方言,該方言用于對數(shù)據(jù)庫的操作進(jìn)行解釋 --></p><p>  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property></p><p>  <!—開啟數(shù)據(jù)庫定義語言,用于自動創(chuàng)建表結(jié)

69、構(gòu) --></p><p>  <property name="hibernate.hbm2ddl.auto">create</property></p><p>  <!-- 映射的實體類 --></p><p>  <mapping class = "cn.newcapec.mode

70、l.Crowd"/></p><p>  <mapping class = "cn.newcapec.model.User"/></p><p>  </session-factory></hibernate-configuration></p><p>  6.2.5 Hibernate會話工

71、廠</p><p>  在完成了配置之后,為了可以使用它來進(jìn)行數(shù)據(jù)的操作,我們需要先創(chuàng)建會話工廠,因為數(shù)據(jù)的操作是基于會話的。會話工廠的代碼如下:</p><p>  public class Hibernate {</p><p>  private static SessionFactory sf = null;//會話工廠</p><p&g

72、t;  private static Session session = null;</p><p><b>  static {</b></p><p>  Configuration cf = new Configuration();</p><p>  cf.configure();//在默認(rèn)路徑下,讀取配置文件。</p>

73、<p>  ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(cf.getProperties()).build();</p><p>  sf = cf.buildSessionFactory(sr);</p><p>  session = sf.openSession();<

74、/p><p><b>  }</b></p><p>  private Hibernate() {}</p><p>  public static SessionFactory getSessionFactory() {returnsf;}</p><p>  public static Session getSess

75、ion() {returnsession;}</p><p><b>  }</b></p><p>  這里的會話工廠SessionFactory使用的是Java設(shè)計模式中的單例模式,唯一的SessionFactory對象能夠保證數(shù)據(jù)操作的可控性,讓我們能夠利用事務(wù)有效的保證被操作數(shù)據(jù)的一致性。</p><p>  在配置文件中羅列出了所使

76、用的實體類,通過在實體類中使用相應(yīng)的注解標(biāo)明,Hibernate就可以將一個實體類映射為一張表,而實體類的屬性則將映射為表中的字段。實體類就相當(dāng)于一張表,為了操縱它,我為實體類分別寫了一個操作類。利用會話Session來實現(xiàn)數(shù)據(jù)的增刪改查。</p><p>  6.2.6 數(shù)據(jù)操作類 UserDao</p><p>  public class UserDao {</p>&

77、lt;p>  private Session session = null;</p><p>  public UserDao() {session = Hibernate.getSession();}//獲取會話</p><p>  public User findByAccount(Integer account) {//根據(jù)賬號來查詢用戶</p><p>

78、;  Criteria c = session.createCriteria(User.class);</p><p>  c.add(Restrictions.eq("account", account));</p><p>  User user = (User)c.uniqueResult();</p><p>  return user;

79、</p><p><b>  }</b></p><p>  //根據(jù)賬號和密碼來查詢用戶</p><p>  public User findByAccountAndPassword(Integer account, String password) {</p><p>  Criteria c = session.c

80、reateCriteria(User.class);</p><p>  c.add(Restrictions.eq("account", account));</p><p>  c.add(Restrictions.eq("password", password));</p><p>  User user = (User

81、)c.uniqueResult();</p><p>  return user;</p><p><b>  }</b></p><p><b>  //查詢?nèi)坑脩?lt;/b></p><p>  public List<User> queryAll() { </p>&l

82、t;p>  Criteria c = session.createCriteria(User.class);</p><p>  @SuppressWarnings("unchecked")</p><p>  List<User> users = c.list();</p><p>  return users;</p&

83、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  6.2.7 數(shù)據(jù)操作類 CrowdDao</p><p>  public class CrowdDao {//群組數(shù)據(jù)訪問層</p><p>  private Session sess

84、ion = null;</p><p>  public CrowdDao() {session = Hibernate.getSession();}</p><p>  public void save(Crowd crowd) {//保存群組</p><p>  Transaction transaction = session.beginTransaction

85、();</p><p>  session.save(crowd);</p><p>  transaction.commit();</p><p><b>  }</b></p><p>  public void update(Crowd crowd) {//更新群組</p><p>  Tr

86、ansaction transaction = session.beginTransaction();</p><p>  session.update(crowd);</p><p>  transaction.commit();</p><p><b>  }</b></p><p>  public void de

87、lete(Crowd crowd) {//刪除群組</p><p>  Transaction transaction = session.beginTransaction();</p><p>  session.delete(crowd);</p><p>  transaction.commit();</p><p><b>

88、  }</b></p><p><b>  }</b></p><p>  以上兩個數(shù)據(jù)訪問類都使用了基于Criteria的查詢方式,該方式是面向?qū)ο蟮模ㄟ^為該對象設(shè)置一些相應(yīng)的屬性值,就可以獲取滿足條件的數(shù)據(jù)。如:c.add(Restrictions..eq("account", account))等價于where account

89、= account.從思想的層面上來講很大程度上有別于傳統(tǒng)的SQL查詢方式。Hibernate還提供了封裝過的save(Object);update(Object);delete(Object)等方法供我們使用,以便提高開發(fā)效率。通過如此簡單而又精煉的代碼即可完成對數(shù)據(jù)的處理,極大地解放了程序員的勞動力。</p><p>  6.2.8 表結(jié)構(gòu)設(shè)計</p><p>  表6-1 User實

90、體類對應(yīng)的表</p><p>  表6-2 Crowd實體類對應(yīng)的表</p><p>  關(guān)于用戶的信息主要有兩張表。一張是用戶自身的信息表,該表用來存儲用戶的個人資料;另一張表是群組表,用來記錄每個用戶所擁有的群組信息。每個用戶可以擁有多個群組(如:朋友、陌生人等),而每個群組又可以擁有多名用戶(如:朋友列表下有張三、李四兩個人)。兩張表是多對多關(guān)系[4]。</p><

91、;p>  需要指明的是,在這兩張表里面都沒有通過外鍵來建立關(guān)聯(lián)關(guān)系,這是因為可以通過Hibernate的注解@ManyToMany來完成關(guān)聯(lián)關(guān)系的映射。Hibernate在處理這個注解時,自動地去幫我們創(chuàng)建一張中間表,并用它來維護(hù)表之間的關(guān)聯(lián)關(guān)系,這使得我們在構(gòu)建表結(jié)構(gòu)的時候變得異常輕松。</p><p>  6.2.9 用戶類User</p><p>  @Entity@Table

92、(name = "User")</p><p>  public class User implements Serializable {</p><p>  private static final long serialVersionUID = 1L;</p><p>  @Id@GeneratedValue(strategy = Gener

93、ationType.AUTO)@Column(name = "id", unique = true)</p><p>  private Integer id;//主鍵</p><p>  @Column(name = "account")</p><p>  private Integer account;//賬號</

94、p><p>  @Column(name = "password")</p><p>  private String password;//密碼</p><p>  @Column(name = "name")</p><p>  private String name;//昵稱</p>&

95、lt;p>  @ManyToMany(mappedBy = "users", fetch = FetchType.EAGER)</p><p>  private List<Crowd> crowds = new ArrayList<Crowd>();//用戶所屬的群組</p><p><b>  …</b></

96、p><p><b>  }</b></p><p>  6.2.10 群組類Crowd</p><p>  @Entity@Table(name = "Crowd")</p><p>  public class Crowd implements Serializable{</p><

97、;p>  private static final long serialVersionUID = 1L;</p><p>  @Id@GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id")</p><p>  private Integer id;//主鍵</p>&l

98、t;p>  @Column(name = "name")</p><p>  private String name;//群組的名稱</p><p>  @ManyToMany(fetch = FetchType.EAGER)//(mappedBy = "crowds")</p><p>  private List&l

99、t;User> users = new ArrayList<User>();//群組所包含的用戶</p><p>  public Crowd() {}</p><p><b>  }</b></p><p>  1.通過@Entry來標(biāo)明它是一個實體類。</p><p>  2.通過@Tabel(na

100、me=”tableName”)來指明該實體類與數(shù)據(jù)庫中哪一張表相對應(yīng)。</p><p>  3.通過@Id來指明表中的主鍵。</p><p>  4.通過@GeneratedValue(strategy = GenerationType.AUTO)來指明主鍵的增長策略。</p><p>  5.通過@Column(name = "name")來指

101、明類中的某個屬性與數(shù)據(jù)庫表中哪個字段名相匹配。</p><p>  6.通過@ManyToMany(fetch = FetchType.EAGER)來指明兩個實體類之間的多對多關(guān)系。</p><p>  使用了Hibernate之后,作為程序員的我們完全可以使用面向?qū)ο蟮乃季S來處理數(shù)據(jù)。尤其是在Hibernate的配置文件中使用了<property name="hibern

102、ate.hbm2ddl.auto">create</property>之后,Hibernamte甚至能夠自動幫我們依據(jù)實體類來創(chuàng)建相應(yīng)的表結(jié)構(gòu),我們無需再為操作數(shù)據(jù)庫而苦惱。</p><p><b>  6.3 客戶端</b></p><p>  6.3.1 Client</p><p>  對于客戶端所有的通信操作

103、都是基于該Client來完成,它是客戶端的守護(hù)線程</p><p>  public User user = null;//Client所服務(wù)的用戶</p><p>  private Map<Integer, Chart> map = new HashMap<Integer, Chart>();//用戶的聊天窗體Map</p><p>&l

104、t;b>  @Override</b></p><p>  public void run() {</p><p>  while(true) {</p><p><b>  try {</b></p><p>  Message msg = (Message)input.readObject();

105、</p><p>  if(msg.getType() == 11) {//賬戶不存在</p><p>  Logon.getInstance().setInfo(msg.getContent());</p><p>  }else if(msg.getType() == 12) {//密碼不對</p><p>  Logon.getInst

106、ance().setInfo(msg.getContent());</p><p>  }else if(msg.getType() == 13){ //可以登陸</p><p>  User user = msg.getAccepter();</p><p>  setUser(user);</p><p>  Logon.getInsta

107、nce().setVisible(false);;</p><p>  Friend.getInstance().setName(user.getName());</p><p>  }else if(msg.getType() == 14) {//已登錄</p><p>  Logon.getInstance().setInfo(msg.getContent())

108、;</p><p>  }else if(msg.getType() == 20) {//轉(zhuǎn)發(fā)聊天消息</p><p>  this.getMap().get(msg.getSender().getAccount()).append(msg);</p><p>  }else if(msg.getType() == 40) {//收到來自好友的游戲邀請</p&

109、gt;<p>  Friend.getInstance().requestGame(msg.getSender());</p><p>  }else if(msg.getType() == 42) {//好友同意開始游戲</p><p>  Friend.getInstance().startGame(msg.getAccepter());</p><p

110、>  }else if(msg.getType() == 43) {//好友拒絕來游戲邀請</p><p>  Friend.getInstance().refuseGame(msg.getSender());</p><p>  }else if(msg.getType() == 44) {//勝負(fù)已分,游戲中止</p><p>  //Game.getIn

111、stance().loseGame();</p><p><b>  }</b></p><p>  } catch (Exception e) {//異常處理</p><p><b>  } </b></p><p><b>  }</b></p><p&

112、gt;<b>  }</b></p><p>  這個位于客戶端的后臺守護(hù)線程,接收服務(wù)器推送過來的消息。 類似于虛擬服務(wù)器它也根據(jù)消息的類型,對消息進(jìn)行分類處理,同時也將用戶的操作封裝成消息對象傳遞給虛擬服務(wù)器。</p><p>  當(dāng)一個用戶與多個好友進(jìn)行會話時,為了方便管理與每個好友的會話,在該類中使用了一個map集合。當(dāng)該類收到來自某個好友的聊天消息,在提取出

113、消息內(nèi)容后,從map中根據(jù)鍵值對<好友的賬號:與好友聊天的窗體>來得到指定好友的聊天窗體,將聊天數(shù)據(jù)交給該聊天窗體進(jìn)行顯示。該類只是負(fù)責(zé)對數(shù)據(jù)進(jìn)行收發(fā),而數(shù)據(jù)的顯示等操作,則交給上層的界面來完成。彼此各司其職,這樣就實現(xiàn)了分層的效果。</p><p>  6.3.2 登錄界面Logon</p><p><b>  圖6-1 登錄界面</b></p&g

114、t;<p>  //登錄界面所用到的控件</p><p>  private static Logon logon = new Logon();//窗體本身</p><p>  private JPanel head = new JPanel();//頭部</p><p>  private JLabel min = new JLabel(new Im

115、ageIcon("image/min.png"));//最小化</p><p>  private JLabel close = new JLabel(new ImageIcon("image/close.png"));//關(guān)閉</p><p>  private JPanel body = new JPanel();//身體</p>

116、<p>  private JLabel info = new JLabel();//信息提示</p><p>  private JLabel accountLabel = new JLabel("賬號:");//賬號標(biāo)簽</p><p>  private JLabel passwordLabel = new JLabel("密碼:"

117、);//密碼標(biāo)簽</p><p>  private JTextField account = new JTextField();//賬號文本框</p><p>  private JPasswordField password = new JPasswordField();//密碼文本框</p><p>  private JButton login = ne

118、w JButton("登錄");//登錄按鈕</p><p>  private JPanel foot = new JPanel();//尾部</p><p>  private JLabel set =new JLabel(new ImageIcon("image/set.png"));//設(shè)置</p><p>  登錄界

119、面使用來Swing的網(wǎng)格包布局GridBagLayout來放置各個組件在面板JPanel中的位置。</p><p>  6.3.3 好友界面Friend</p><p><b>  圖6-2 好友界面</b></p><p>  //省略了與登錄界面外層布局的內(nèi)容</p><p>  private JPanel bod

120、y = new JPanel();//身體</p><p>  private JPanel show = new JPanel();//用戶信息展示</p><p>  private JLabel img = new JLabel(new ImageIcon("image/me.png"));//用戶照片</p><p>  priva

121、te JPanel info = new JPanel();//用戶的昵稱、等級</p><p>  private JLabel name = new JLabel();//用戶昵稱</p><p>  private JLabel level = new JLabel();//用戶等級</p><p>  private JScrollPane jsp =

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論