版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 2015屆本科畢業(yè)論文(設(shè)計(jì))</p><p> 基于JAVA語言的網(wǎng)絡(luò)聊天軟件</p><p> 代碼:http://download.csdn.net/detail/syqwe/8890181</p><p> 姓 名: XXXX </p><p> 系 別:
2、 計(jì)算機(jī)與信息技術(shù)學(xué)院 </p><p> 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 學(xué) 號(hào): 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è)計(jì)實(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 登錄驗(yàn)證Logon7</p><p> 6.2.4 Hibernate配置文件8</p><p> 6.2.5 Hibernate會(huì)話工廠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è)計(jì)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測(cè)試說明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來繪制界面,使用開源的對(duì)象關(guān)系
12、映射框架Hibernate來進(jìn)行數(shù)據(jù)訪問。其中Hibernate能夠使程序員以面向?qū)ο蟮乃季S來處理關(guān)系型數(shù)據(jù)。本聊天軟件不僅支持聊天,還加入了“連連看”游戲。該游戲讓人們之間的交流得到延伸,讓彼此之間的關(guān)系更進(jìn)一步。本聊天軟件主要有以下三個(gè)功能:一、登錄驗(yàn)證;二、聊天通信;三、游戲互動(dòng)。</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)在天涯又或是近在咫尺的親朋好友無拘無束地溝通,而此時(shí)此刻一款即時(shí)通訊工具對(duì)于我們來說,它的重要性不言而喻!</p><p> 在計(jì)算機(jī)網(wǎng)絡(luò)愈來愈普及的今天,人們對(duì)于網(wǎng)絡(luò)的依賴也愈來愈大,類似于QQ、MSN等聊天工具早已融入到我們?nèi)粘I钪?,為我們的生活帶來?/p>
18、歡樂和便利。因此,我力圖開發(fā)一個(gè)在線的即時(shí)聊天軟件以滿足我們?cè)谌粘I钪薪涣鞯男枰?,為我們的生活增光涂色?lt;/p><p><b> 1.2 目的</b></p><p> 本聊天軟件以通信為其核心,同時(shí)融入了娛樂的元素,一款十分經(jīng)典的“連連看”游戲。讓我們?cè)诹奶斓耐瑫r(shí)還能與好友一起通過游戲來增進(jìn)彼此的感情,讓彼此的心更加靠近,讓我們的生活從此不再單調(diào)。</
19、p><p> 本聊天軟件是在Windows環(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é)
20、習(xí)和工作打下堅(jiān)實(shí)牢固的基礎(chǔ),不斷地提升個(gè)人的職業(yè)素養(yǎng)。</p><p> 同時(shí),本聊天軟件將不斷與信息領(lǐng)域的系統(tǒng)相互集成和滲透,向校園、集團(tuán)等群體進(jìn)行拓展,應(yīng)用將突破個(gè)體,并應(yīng)用于遠(yuǎn)程教學(xué)、遠(yuǎn)程演示、網(wǎng)絡(luò)會(huì)議等。以豐富的接入方式,以保質(zhì)保量的服務(wù),以友好的用戶體驗(yàn)呈現(xiàn)在世人面前。并且不斷地?cái)U(kuò)大功能與應(yīng)用范圍,滿足未來時(shí)代的話音。</p><p><b> 2 開發(fā)技術(shù)<
21、/b></p><p> 本聊天軟件用到的技術(shù)涉及到3個(gè)層面,它們分別是:界面層、通信層、數(shù)據(jù)持久化層。</p><p><b> 2.1 界面層技術(shù)</b></p><p> 使用Java中的Swing來進(jìn)行操作界面的開發(fā)。Swing是一款功能強(qiáng)大,使用方便,跨平臺(tái)的圖形界面開發(fā)工具包,專門用于開發(fā)Java應(yīng)用程序的用戶界面。Sw
22、ing允許您設(shè)定自己喜愛的界面風(fēng)格,它可以是跨平臺(tái)的Java風(fēng)格,也可以是我們熟悉的Window風(fēng)格,這一點(diǎn)是其他界面開發(fā)工具很難比擬的。</p><p><b> 2.2 通信層技術(shù)</b></p><p> 利用java中的Socket(套接字)來完成客戶端與服務(wù)器的交互。該Socket是基于TCP/IP通信協(xié)議的數(shù)據(jù)傳輸對(duì)象,它提供了安全可靠的通信機(jī)制。在服
23、務(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í)在線與自己的好友暢懷的交流。&
24、lt;/p><p><b> 2.3 數(shù)據(jù)層技術(shù)</b></p><p> 考慮到現(xiàn)如今框架技術(shù)的興起,在數(shù)據(jù)層的處理上我也使用了開源的對(duì)象關(guān)系映射框架Hibernate。它對(duì)Java的數(shù)據(jù)庫連接(JDBC)進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用面向?qū)ο缶幊趟季S來操縱數(shù)據(jù)庫。</p><p> 本聊天軟件使用MySQ
25、L作為數(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)健。</p><p><b> 3 開發(fā)環(huán)境&l
26、t;/b></p><p><b> 3.1 硬件環(huán)境</b></p><p> 硬件配置:AMD X64 兼容桌面平臺(tái)。</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ā)的,整個(gè)系統(tǒng)分為兩個(gè)重要的組成部分:客戶端、服務(wù)器。</p><p> 在客戶端用戶可以通過登錄模塊進(jìn)行登錄操作,登錄成功的用戶則進(jìn)入到好友列表界面;選中指定的好友,就可以發(fā)起與該好友的會(huì)話,通過聊天模塊與好友相互噓寒問暖;在聊天模塊中,既可以發(fā)送消息,同時(shí)也可以發(fā)起與該好友的游戲互動(dòng),在PK中一決雌雄。</p><p> 在服務(wù)器,服務(wù)器要為每個(gè)用戶進(jìn)行服務(wù),對(duì)用戶登錄信息進(jìn)行驗(yàn)證
29、,接受來自用戶的消息請(qǐng)求并按照消息的類型進(jìn)行各種不同的操作和處理。</p><p> 4.1 客戶端需求分析</p><p> 客戶端實(shí)現(xiàn)的功能主要有:</p><p> 1.登錄模塊:用戶在登錄界面中輸入個(gè)人身份信息,由客戶端將信息傳遞至服務(wù)器進(jìn)行用戶合法性的驗(yàn)證,驗(yàn)證成功,則跳轉(zhuǎn)到聊天模塊,否則給出相關(guān)提示。</p><p> 2
30、.好友模塊:顯示好友列表,通過該模塊可以發(fā)起與好友的會(huì)話或者游戲。</p><p> 3.聊天模塊:能夠及時(shí)的發(fā)送用戶的文本消息,同時(shí)能夠即時(shí)地將好友發(fā)過來的消息展現(xiàn)出來。</p><p> 4.游戲模塊:開啟兩個(gè)好友之間的游戲互動(dòng)。</p><p> 5.界面效果:布局整潔、大方;色彩光鮮、奪目;操作簡(jiǎn)單、舒適。</p><p>
31、4.2 服務(wù)器需求分析</p><p> 服務(wù)器作為后臺(tái)程序,實(shí)現(xiàn)的功能主要有:</p><p> 1.能夠接收每個(gè)客戶端的通信連接。</p><p> 2.調(diào)用數(shù)據(jù)訪問層來驗(yàn)證用戶的個(gè)人信息。</p><p> 3.能夠及時(shí)接受用戶的聊天消息并進(jìn)行消息的轉(zhuǎn)發(fā)。</p><p> 4.3 數(shù)據(jù)層需求分析<
32、;/p><p> 數(shù)據(jù)層實(shí)現(xiàn)的功能主要有:響應(yīng)來自服務(wù)器的數(shù)據(jù)訪問請(qǐng)求。</p><p><b> 5 系統(tǒng)架構(gòu)</b></p><p> 本系統(tǒng)以客戶端、服務(wù)器以及數(shù)據(jù)庫三維一體構(gòu)建起了系統(tǒng)的整個(gè)架構(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)用戶需要登錄時(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è)聊天模塊后,便可以調(diào)用Client來進(jìn)行聊天消息的傳遞;如果打開的是游戲模塊,則先完成
34、游戲的一方調(diào)用Client向另一方發(fā)送獲勝消息,并終止另一方的游戲。</p><p> 服務(wù)器:服務(wù)器分為主服務(wù)器與虛擬服務(wù)器。主服務(wù)器Server作為服務(wù)器的守護(hù)線程,主要負(fù)責(zé)接收客戶端的連接,在服務(wù)器接收到一個(gè)客戶端后,就開啟一個(gè)虛擬服務(wù)器VirtualServer來為該用戶服務(wù);虛擬服務(wù)器通過調(diào)用底層的登錄模塊等來為用戶提供登錄驗(yàn)證等服務(wù)。</p><p> 本架構(gòu)中,借用了Sp
35、ring中的分層思想,這也是在軟件項(xiàng)目開發(fā)過程中經(jīng)常采用的方案。將操作或功能分為不同的層次,各層次之間想對(duì)獨(dú)立,高層調(diào)用底層的功能,低層為高層提供服務(wù)。一方面,可以將同種類型的操作放在一起集中管理。另一方面,將操作提取出來,提高了代碼的復(fù)用性和程序的擴(kuò)展性。分層使得程序流程變得清晰明了,而且維護(hù)成本相對(duì)低廉[1]。</p><p><b> 6 設(shè)計(jì)實(shí)現(xiàn)</b></p>&l
36、t;p> 6.1 消息封裝類Message</p><p> Socket: 套接字,在本聊天軟件中作為客戶端與服務(wù)器之間通信載體,為系統(tǒng)的交互提供支撐。為了方便開發(fā),我將客戶端與服務(wù)器之間傳送的消息封裝成一個(gè)消息對(duì)象類Message.。繼而使用從Socket獲取的對(duì)象輸入流、對(duì)象輸出流來收發(fā)消息對(duì)象[2]。</p><p> 封裝的消息類代碼如下所示:</p>
37、<p> //消息封裝類實(shí)現(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)建的時(shí)間</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)的操作了。為了實(shí)現(xiàn)消息載體以對(duì)象的形式在網(wǎng)絡(luò)間進(jìn)行傳遞,該消息類必須實(shí)現(xiàn)Java中的序列化接口,這一點(diǎn)是其他通過字節(jié)流或者字符流
40、傳遞消息所不同的。</p><p><b> 6.2 服務(wù)器</b></p><p> 6.2.1 主服務(wù)器Server</p><p> 主服務(wù)器主要充當(dāng)一個(gè)前置服務(wù),用來接收客戶端的連接。在獲得一個(gè)客戶端的連接后就會(huì)產(chǎn)生一個(gè)虛擬服務(wù)器,并將該連接委托給虛擬服務(wù)器讓它來為用戶提供服務(wù)。同時(shí)主服務(wù)器也維護(hù)著所有的虛擬服務(wù)器,它扮演著一個(gè)管
41、理者的角色[3]。</p><p> //服務(wù)器維護(hù)的虛擬服務(wù)器列表,一個(gè)Map集合,通過<用戶的賬號(hào):為該用戶服務(wù)的虛擬服務(wù)器>這種鍵值對(duì)的對(duì)應(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)行一對(duì)一的服務(wù)。所有的消息都經(jīng)過它來處理。當(dāng)虛擬服務(wù)器之間需要交互時(shí),虛擬服務(wù)器可以從主
45、服務(wù)器那里拿到主服務(wù)器所維護(hù)的虛擬服務(wù)器列表。并從中根據(jù)鍵值對(duì)來獲取指定的虛擬服務(wù)器,然后再進(jìn)行后續(xù)的操作。</p><p> 該類實(shí)現(xiàn)了Runnable接口,該接口是將線程所運(yùn)行的程序代碼提取出來封裝成為一個(gè)對(duì)象。Runnable對(duì)象可以用來創(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> //接收來自客戶端封裝的消息對(duì)象</p><p> Message msg = null; </p><
47、;p> while(b) {</p><p><b> try {</b></p><p> msg = (Message)input.readObject();//客戶端Client發(fā)送過來的消息對(duì)象</p><p> //根據(jù)消息的類型進(jìn)行不同的處理</p><p> if(msg.getType(
48、) == 10) {//登錄驗(yàn)證操作</p><p> Message returnMsg = new Login().validate(msg.getSender());//登錄驗(yàn)證</p><p> if(returnMsg.getType() == 13) {</p><p> //驗(yàn)證成功,則將該虛擬服務(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) {//邀請(qǐng)好友進(jìn)行游戲</p><p> Server.getUsersOL().get(msg.getAccep
52、ter().getAccount()).send(msg);</p><p> }else if(msg.getType() == 41) {//好友同意游戲邀請(qǐng),雙方開始游戲</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) {//拒絕好友的游戲邀請(qǐng)</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時(shí),虛擬服務(wù)器就調(diào)用登
57、錄驗(yàn)證Logon來對(duì)用戶的信息進(jìn)行驗(yàn)證,根據(jù)登錄驗(yàn)證的驗(yàn)證結(jié)果,再返回相應(yīng)的消息給客戶端的Client。</p><p> 6.2.3 登錄驗(yàn)證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();//返回驗(yàn)證的結(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){ //密碼不對(duì)</p><p> msg.setType(12); msg.setContent("密碼不對(duì)!");</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> 登錄驗(yàn)證,主要分為三步:</p><p> 1.首先驗(yàn)證用戶的賬號(hào)合法性,即
63、該賬號(hào)是否存在。只有賬號(hào)存在才會(huì)進(jìn)行后續(xù)的驗(yàn)證。</p><p> 2.如果用戶的賬號(hào)存在,再驗(yàn)證密碼是否與賬號(hào)匹配,如果匹配成功,則返回該用戶的信息。</p><p> 3.接下來則從主服務(wù)那里去判定該用戶是否已經(jīng)登錄,對(duì)于已登錄的用戶則不再給予登錄操作。</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> <!—在控制臺(tái)打印出執(zhí)行數(shù)據(jù)訪問的SQL語句 --></p&g
65、t;<p> <property name="show_sql">true</property></p><p> <!—連接數(shù)據(jù)庫所使用的驅(qū)動(dòng)程序 --></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ù)庫的方言,該方言用于對(duì)數(shù)據(jù)庫的操作進(jìn)行解釋 --></p><p> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property></p><p> <!—開啟數(shù)據(jù)庫定義語言,用于自動(dòng)創(chuàng)建表結(jié)
69、構(gòu) --></p><p> <property name="hibernate.hbm2ddl.auto">create</property></p><p> <!-- 映射的實(shí)體類 --></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會(huì)話工
71、廠</p><p> 在完成了配置之后,為了可以使用它來進(jìn)行數(shù)據(jù)的操作,我們需要先創(chuàng)建會(huì)話工廠,因?yàn)閿?shù)據(jù)的操作是基于會(huì)話的。會(huì)話工廠的代碼如下:</p><p> public class Hibernate {</p><p> private static SessionFactory sf = null;//會(huì)話工廠</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> 這里的會(huì)話工廠SessionFactory使用的是Java設(shè)計(jì)模式中的單例模式,唯一的SessionFactory對(duì)象能夠保證數(shù)據(jù)操作的可控性,讓我們能夠利用事務(wù)有效的保證被操作數(shù)據(jù)的一致性。</p><p> 在配置文件中羅列出了所使
76、用的實(shí)體類,通過在實(shí)體類中使用相應(yīng)的注解標(biāo)明,Hibernate就可以將一個(gè)實(shí)體類映射為一張表,而實(shí)體類的屬性則將映射為表中的字段。實(shí)體類就相當(dāng)于一張表,為了操縱它,我為實(shí)體類分別寫了一個(gè)操作類。利用會(huì)話Session來實(shí)現(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();}//獲取會(huì)話</p><p> public User findByAccount(Integer account) {//根據(jù)賬號(hào)來查詢用戶</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ù)賬號(hào)和密碼來查詢用戶</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> 以上兩個(gè)數(shù)據(jù)訪問類都使用了基于Criteria的查詢方式,該方式是面向?qū)ο蟮?,通過為該對(duì)象設(shè)置一些相應(yīng)的屬性值,就可以獲取滿足條件的數(shù)據(jù)。如:c.add(Restrictions..eq("account", account))等價(jià)于where account
89、= account.從思想的層面上來講很大程度上有別于傳統(tǒng)的SQL查詢方式。Hibernate還提供了封裝過的save(Object);update(Object);delete(Object)等方法供我們使用,以便提高開發(fā)效率。通過如此簡(jiǎn)單而又精煉的代碼即可完成對(duì)數(shù)據(jù)的處理,極大地解放了程序員的勞動(dòng)力。</p><p> 6.2.8 表結(jié)構(gòu)設(shè)計(jì)</p><p> 表6-1 User實(shí)
90、體類對(duì)應(yīng)的表</p><p> 表6-2 Crowd實(shí)體類對(duì)應(yīng)的表</p><p> 關(guān)于用戶的信息主要有兩張表。一張是用戶自身的信息表,該表用來存儲(chǔ)用戶的個(gè)人資料;另一張表是群組表,用來記錄每個(gè)用戶所擁有的群組信息。每個(gè)用戶可以擁有多個(gè)群組(如:朋友、陌生人等),而每個(gè)群組又可以擁有多名用戶(如:朋友列表下有張三、李四兩個(gè)人)。兩張表是多對(duì)多關(guān)系[4]。</p><
91、;p> 需要指明的是,在這兩張表里面都沒有通過外鍵來建立關(guān)聯(lián)關(guān)系,這是因?yàn)榭梢酝ㄟ^Hibernate的注解@ManyToMany來完成關(guān)聯(lián)關(guān)系的映射。Hibernate在處理這個(gè)注解時(shí),自動(dòng)地去幫我們創(chuàng)建一張中間表,并用它來維護(hù)表之間的關(guān)聯(lián)關(guān)系,這使得我們?cè)跇?gòu)建表結(jié)構(gòu)的時(shí)候變得異常輕松。</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;//賬號(hào)</
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)明它是一個(gè)實(shí)體類。</p><p> 2.通過@Tabel(na
100、me=”tableName”)來指明該實(shí)體類與數(shù)據(jù)庫中哪一張表相對(duì)應(yīng)。</p><p> 3.通過@Id來指明表中的主鍵。</p><p> 4.通過@GeneratedValue(strategy = GenerationType.AUTO)來指明主鍵的增長(zhǎng)策略。</p><p> 5.通過@Column(name = "name")來指
101、明類中的某個(gè)屬性與數(shù)據(jù)庫表中哪個(gè)字段名相匹配。</p><p> 6.通過@ManyToMany(fetch = FetchType.EAGER)來指明兩個(gè)實(shí)體類之間的多對(duì)多關(guān)系。</p><p> 使用了Hibernate之后,作為程序員的我們完全可以使用面向?qū)ο蟮乃季S來處理數(shù)據(jù)。尤其是在Hibernate的配置文件中使用了<property name="hibern
102、ate.hbm2ddl.auto">create</property>之后,Hibernamte甚至能夠自動(dòng)幫我們依據(jù)實(shí)體類來創(chuàng)建相應(yīng)的表結(jié)構(gòu),我們無需再為操作數(shù)據(jù)庫而苦惱。</p><p><b> 6.3 客戶端</b></p><p> 6.3.1 Client</p><p> 對(duì)于客戶端所有的通信操作
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) {//密碼不對(duì)</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) {//收到來自好友的游戲邀請(qǐng)</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) {//好友拒絕來游戲邀請(qǐng)</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> 這個(gè)位于客戶端的后臺(tái)守護(hù)線程,接收服務(wù)器推送過來的消息。 類似于虛擬服務(wù)器它也根據(jù)消息的類型,對(duì)消息進(jìn)行分類處理,同時(shí)也將用戶的操作封裝成消息對(duì)象傳遞給虛擬服務(wù)器。</p><p> 當(dāng)一個(gè)用戶與多個(gè)好友進(jìn)行會(huì)話時(shí),為了方便管理與每個(gè)好友的會(huì)話,在該類中使用了一個(gè)map集合。當(dāng)該類收到來自某個(gè)好友的聊天消息,在提取出
113、消息內(nèi)容后,從map中根據(jù)鍵值對(duì)<好友的賬號(hào):與好友聊天的窗體>來得到指定好友的聊天窗體,將聊天數(shù)據(jù)交給該聊天窗體進(jìn)行顯示。該類只是負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行收發(fā),而數(shù)據(jù)的顯示等操作,則交給上層的界面來完成。彼此各司其職,這樣就實(shí)現(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("賬號(hào):");//賬號(hào)標(biāo)簽</p><p> private JLabel passwordLabel = new JLabel("密碼:"
117、);//密碼標(biāo)簽</p><p> private JTextField account = new JTextField();//賬號(hào)文本框</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來放置各個(gè)組件在面板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();//用戶的昵稱、等級(jí)</p><p> private JLabel name = new JLabel();//用戶昵稱</p><p> private JLabel level = new JLabel();//用戶等級(jí)</p><p> private JScrollPane jsp =
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于java語言的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與實(shí)現(xiàn)
- 基于socket網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與設(shè)計(jì)畢業(yè)論文
- 畢業(yè)論文-基于java聊天系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)---畢業(yè)論文
- 畢業(yè)論文---基于cs架構(gòu)的java網(wǎng)絡(luò)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)論文---基于cs架構(gòu)的java網(wǎng)絡(luò)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)論文 基于java即時(shí)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)論文-基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)---畢業(yè)論文
- 基于java即時(shí)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_畢業(yè)論文
- 基于java即時(shí)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_畢業(yè)論文
- 畢業(yè)論文-基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) (2)
- 基于java的聊天系統(tǒng)的設(shè)計(jì)于實(shí)現(xiàn)——畢業(yè)論文
- 基于java的聊天系統(tǒng)的設(shè)計(jì)于實(shí)現(xiàn)——畢業(yè)論文
- 本科畢業(yè)論文-基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的聊天室設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 基于java的聊天室設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 論文-基于Socket的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與設(shè)計(jì).doc
- 基于java網(wǎng)絡(luò)聊天系統(tǒng)畢業(yè)設(shè)計(jì)論文
- 畢業(yè)論文范文——基于java的聊天系統(tǒng)的設(shè)計(jì)于實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論