




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2015屆本科畢業論文(設計)基于JAVA語言的網絡聊天軟件代碼:姓 名:XXXX 系 別:計算機與信息技術學院專 業: 計算機科學與技術 學號:XXXXXXXX 指導教師: XXXXXX 2015年05月08日 目錄摘要IIAbstractII1 軟件介紹31.1 背景31.2 目的32 開發技術32.1 界面層技術32.2 通信層技術32.3 數據層技術33 開發環境43.1 硬件環境43.2 軟件環境44 需求分析44.1 客戶端需求分析44.2 服務器需求分析44.3 數據層需求分析45 系統架構56 設計實現56.1 消息封裝類Message56.2 服務器66.2.1 主服務器Se
2、rver66.2.2 虛擬服務器VirtualServer66.2.3 登錄驗證Logon76.2.4 Hibernate配置文件86.2.5 Hibernate會話工廠8數據操作類 UserDao96.2.7 數據操作類 CrowdDao106.2.8 表結構設計106.2.9 用戶類User116.2.10 群組類Crowd116.3 客戶端116.3.1 Client116.3.2 登錄界面Logon136.3.3 好友界面Friend146.3.4 聊天界面Chart156.3.5 游戲界面Game166.3.6 游戲規則176.3.7 算法思路177測試說明18總結感想19參考文獻2
3、0致謝20基于JAVA語言的網絡聊天軟件摘要本聊天軟件是使用Java編程語言來完成開發的。在軟件的開發過程中,使用Socket來進行網絡通信,使用Swing來繪制界面,使用開源的對象關系映射框架Hibernate來進行數據訪問。其中Hibernate能夠使程序員以面向對象的思維來處理關系型數據。本聊天軟件不僅支持聊天,還加入了“連連看”游戲。該游戲讓人們之間的交流得到延伸,讓彼此之間的關系更進一步。本聊天軟件主要有以下三個功能:一、登錄驗證;二、聊天通信;三、游戲互動。關鍵詞聊天;Java;Swing;套接字;HibernateNetworkChatSoftwareBasedonJAVALan
4、guageAbstractThischatsoftwarewasdevelopedbyusingtheJavaprogramminglanguagetocomplete. Intheprocessofsoftwaredevelopment, Socket is used for network communication, Swing is used to draw the interface, object relational mapping framework Hibernate open source is used for data access.Hibernateallowspro
5、grammerstodealwithrelationaldatainobject-orientedthinking. Thischatsoftwarenotonlysupportchatatthesametime, alsojoinedthe "LinkUpFree" game. Thegameallowscommunicationbetweenpeoplehasbeenextended, sothattherelationshipbetweeneachothermore.Thissoftwaremainlyhasthefollowingthreefunctions: Fi
6、rst, landingvalidation; Second, chatcommunications; Three, theinteractionofthegame.KeywordsChat; Java; Socket; Swing; Hibernate1軟件介紹1.1 背景在當今世界,人們的追求早已不局限于物質生活,而更多的是渴望在精神領域上得到滿足,這突出表現在我們的人際交往上。人們渴望與遠在天涯又或是近在咫尺的親朋好友無拘無束地溝通,而此時此刻一款即時通訊工具對于我們來說,它的重要性不言而喻!在計算機網絡愈來愈普及的今天,人們對于網絡的依賴也愈來愈大,類似于QQ、MSN等聊天工具早已融入
7、到我們日常生活中,為我們的生活帶來了歡樂和便利。因此,我力圖開發一個在線的即時聊天軟件以滿足我們在日常生活中交流的需要,為我們的生活增光涂色。1.2 目的本聊天軟件以通信為其核心,同時融入了娛樂的元素,一款十分經典的“連連看”游戲。讓我們在聊天的同時還能與好友一起通過游戲來增進彼此的感情,讓彼此的心更加靠近,讓我們的生活從此不再單調。本聊天軟件是在Windows環境下進行開發的。通過Swing實現操作界面的設計,使用Java語言中的Socket(套接字)來實現網絡之間的通信,使用Hibernate框架來進行數據的增刪改查,而MySQL數據庫則用于數據的存儲與管理。在開發的過程中綜合運用自己所學
8、到的各種技術,一方面強化我在學校里學到的知識與專業技能,另一方面也使得我更好地去理解有關軟件開發的流程與思想。這些能力與經驗都將為我后續的學習和工作打下堅實牢固的基礎,不斷地提升個人的職業素養。同時,本聊天軟件將不斷與信息領域的系統相互集成和滲透,向校園、集團等群體進行拓展,應用將突破個體,并應用于遠程教學、遠程演示、網絡會議等。以豐富的接入方式,以保質保量的服務,以友好的用戶體驗呈現在世人面前。并且不斷地擴大功能與應用范圍,滿足未來時代的話音。2 開發技術本聊天軟件用到的技術涉及到3個層面,它們分別是:界面層、通信層、數據持久化層。2.1界面層技術使用Java中的Swing來進行操作界面的開
9、發。Swing是一款功能強大,使用方便,跨平臺的圖形界面開發工具包,專門用于開發Java應用程序的用戶界面。Swing允許您設定自己喜愛的界面風格,它可以是跨平臺的Java風格,也可以是我們熟悉的Window風格,這一點是其他界面開發工具很難比擬的。2.2 通信層技術利用java中的Socket(套接字)來完成客戶端與服務器的交互。該Socket是基于TCP/IP通信協議的數據傳輸對象,它提供了安全可靠的通信機制。在服務器使用ServerSocket創建監聽端口,而在客戶端則使用Socket來連接服務器。在連接成功時,應用程序的客戶端和服務器都將產生一個Socket實例,本聊天程序就是通過利用
10、這個Socket實例來實現兩段的通信和其他功能。在通信的過程中我也使用了多線程編程技術以實現復雜的交互行為。尤其是在服務器端,服務器每接收一個客戶端就會產生一個虛擬服務器來單獨為其服務。通過該技術的運用使得本聊天軟件可以允許多人同時在線與自己的好友暢懷的交流。2.3數據層技術考慮到現如今框架技術的興起,在數據層的處理上我也使用了開源的對象關系映射框架Hibernate。它對Java的數據庫連接(JDBC)進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用面向對象編程思維來操縱數據庫。本聊天軟件使用MySQL作為數據持久化存的儲器。MySQL是一個真正的多用戶、多線程數據庫服務器,
11、是以客戶端/服務器架構實現的,它由一個服務器守護線程和很多不同的客戶程序和庫組成。MySQL是一種關系型數據庫管理系統,通過表來管理數據,增加了處理數據的速度并提高了操作的靈活性。Hibernate+MySQL的組合在數據的處理上讓我變得得心應手,同時也讓這個程序變得更加強壯與穩健。3 開發環境3.1 硬件環境硬件配置:AMDX64 兼容桌面平臺。3.2 軟件環境操作系統:Windows8.1企業版。JDK版本:JDK_8。數據庫:MySQLServer5.6。開發工具:MyEclipse2015。第三方工具包:Hibernate。4 需求分析本聊天軟件是在C/S模式下完成開發的,整個系統分為
12、兩個重要的組成部分:客戶端、服務器。在客戶端用戶可以通過登錄模塊進行登錄操作,登錄成功的用戶則進入到好友列表界面;選中指定的好友,就可以發起與該好友的會話,通過聊天模塊與好友相互噓寒問暖;在聊天模塊中,既可以發送消息,同時也可以發起與該好友的游戲互動,在PK中一決雌雄。在服務器,服務器要為每個用戶進行服務,對用戶登錄信息進行驗證,接受來自用戶的消息請求并按照消息的類型進行各種不同的操作和處理。4.1客戶端需求分析客戶端實現的功能主要有:1.登錄模塊:用戶在登錄界面中輸入個人身份信息,由客戶端將信息傳遞至服務器進行用戶合法性的驗證,驗證成功,則跳轉到聊天模塊,否則給出相關提示。2.好友模塊:顯示
13、好友列表,通過該模塊可以發起與好友的會話或者游戲。3.聊天模塊:能夠及時的發送用戶的文本消息,同時能夠即時地將好友發過來的消息展現出來。4.游戲模塊:開啟兩個好友之間的游戲互動。5.界面效果:布局整潔、大方;色彩光鮮、奪目;操作簡單、舒適。4.2服務器需求分析服務器作為后臺程序,實現的功能主要有:1.能夠接收每個客戶端的通信連接。2.調用數據訪問層來驗證用戶的個人信息。3.能夠及時接受用戶的聊天消息并進行消息的轉發。4.3數據層需求分析數據層實現的功能主要有:響應來自服務器的數據訪問請求。5 系統架構本系統以客戶端、服務器以及數據庫三維一體構建起了系統的整個架構。圖5-1 系統架構客戶端:用戶
14、在客戶端的所有操作都依賴于客戶端的守護線程Client來完成,該線程負責與服務器進行數據交互。當用戶需要登錄時,由登錄模塊調用Client向服務器發送身份驗證請求。服務器接收到該驗證請求之后便進行驗證處理并返回驗證結果給Client。如果Client判定驗證成功則從驗證結果中提取出個人信息并開啟好友模塊;當用戶在好友模塊中打開了一個聊天模塊后,便可以調用Client來進行聊天消息的傳遞;如果打開的是游戲模塊,則先完成游戲的一方調用Client向另一方發送獲勝消息,并終止另一方的游戲。服務器:服務器分為主服務器與虛擬服務器。主服務器Server作為服務器的守護線程,主要負責接收客戶端的連接,在服
15、務器接收到一個客戶端后,就開啟一個虛擬服務器VirtualServer來為該用戶服務;虛擬服務器通過調用底層的登錄模塊等來為用戶提供登錄驗證等服務。本架構中,借用了Spring中的分層思想,這也是在軟件項目開發過程中經常采用的方案。將操作或功能分為不同的層次,各層次之間想對獨立,高層調用底層的功能,低層為高層提供服務。一方面,可以將同種類型的操作放在一起集中管理。另一方面,將操作提取出來,提高了代碼的復用性和程序的擴展性。分層使得程序流程變得清晰明了,而且維護成本相對低廉1。6 設計實現6.1 消息封裝類MessageSocket: 套接字,在本聊天軟件中作為客戶端與服務器之間通信載體,為系統
16、的交互提供支撐。為了方便開發,我將客戶端與服務器之間傳送的消息封裝成一個消息對象類Message.。繼而使用從Socket獲取的對象輸入流、對象輸出流來收發消息對象2。封裝的消息類代碼如下所示:/消息封裝類實現了序列化接口publicclassMessageimplementsSerializable privatestaticfinallongserialVersionUID = -2842889997276284663L;privateIntegertype;/消息的類型privateDatesenDate= newDate();/消息創建的時間privateUsersender; /消息
17、的發送者privateUseraccepter; /消息的接收者privateStringcontent; /消息的內容其中,消息的類型在服務器和客戶端都遵循著統一的標準。這樣的話,客戶端發給服務器什么樣的消息,服務器在解析出消息的類型之后, 就可以進行相應的操作了。為了實現消息載體以對象的形式在網絡間進行傳遞,該消息類必須實現Java中的序列化接口,這一點是其他通過字節流或者字符流傳遞消息所不同的。6.2 服務器6.2.1 主服務器Server主服務器主要充當一個前置服務,用來接收客戶端的連接。在獲得一個客戶端的連接后就會產生一個虛擬服務器,并將該連接委托給虛擬服務器讓它來為用戶提供服務。同
18、時主服務器也維護著所有的虛擬服務器,它扮演著一個管理者的角色3。/服務器維護的虛擬服務器列表,一個Map集合,通過<用戶的賬號:為該用戶服務的虛擬服務器>這種鍵值對的對應關系來管理虛擬服務器。privatestaticHashMap<Integer, VirtualServer> usersOL = newHashMap<Integer, VirtualServer>();try serverSocket = newServerSocket(port);/這里通過無限循環,來不停地接受用戶的連接。while(true) clientSocket = serv
19、erSocket.accept();/接收客戶端的連接newThread(newVirtualServer(clientSocket).start();/開啟虛擬服務器來為其服務 catch (IOExceptione) /異常處理6.2.2 虛擬服務器VirtualServer虛擬服務器才是真正的服務載體,當它接收從主服務器哪里得到的來自客戶端的連接后,便可進行一對一的服務。所有的消息都經過它來處理。當虛擬服務器之間需要交互時,虛擬服務器可以從主服務器那里拿到主服務器所維護的虛擬服務器列表。并從中根據鍵值對來獲取指定的虛擬服務器,然后再進行后續的操作。該類實現了Runnable接口,該接口是
20、將線程所運行的程序代碼提取出來封裝成為一個對象。Runnable對象可以用來創建線程。privateUseruser = null;/虛擬服務器所服務的用戶Overridepublicvoidrun() Booleanb = true;/線程結束控制符/接收來自客戶端封裝的消息對象Messagemsg = null; while(b) try msg = (Message)input.readObject();/客戶端Client發送過來的消息對象/根據消息的類型進行不同的處理if(msg.getType() = 10) /登錄驗證操作MessagereturnMsg = newLogin()
21、.validate(msg.getSender();/登錄驗證if(returnMsg.getType() = 13) /驗證成功,則將該虛擬服務器添加到主服務器管理的虛擬服務器列表Server.getUsersOL().put(returnMsg.getAccepter().getAccount(), this);send(returnMsg);elseif(msg.getType() = 20) /轉發聊天消息Server.getUsersOL().get(msg.getAccepter().getAccount().send(msg);send(msg);elseif(msg.getTy
22、pe() = 30) /退出操作Server.getUsersOL().remove(user.getAccount();Thread.currentThread().interrupt();/結束當前線程elseif(msg.getType() = 40) /邀請好友進行游戲Server.getUsersOL().get(msg.getAccepter().getAccount().send(msg);elseif(msg.getType() = 41) /好友同意游戲邀請,雙方開始游戲Messagem = newMessage();m.setType(42); m.setAccepter(
23、msg.getAccepter();Server.getUsersOL().get(msg.getAccepter().getAccount().send(m); m.setAccepter(msg.getSender();send(m);elseif(msg.getType() = 43) /拒絕好友的游戲邀請Server.getUsersOL().get(msg.getAccepter().getAccount().send(msg);elseif(msg.getType() = 44) /由獲勝方通知失敗方,勝負情況Server.getUsersOL().get(msg.getAccep
24、ter().getAccount().send(msg); catch (Exceptione)/異常處理b = false;/如果出現異常則修改線程終止符,使線程結束。從源碼中可以看出,虛擬服務器主要的工作,就是解析消息的類型,并根據消息的類型進行相應的處理。例如在消息的類型為10時,虛擬服務器就調用登錄驗證Logon來對用戶的信息進行驗證,根據登錄驗證的驗證結果,再返回相應的消息給客戶端的Client。6.2.3 登錄驗證LogonprivatestaticUserDaouserDao = newUserDao();/調用底層的用戶數據訪問功能publicMessagevalidate(U
25、seruser) Messagemsg = newMessage();/返回驗證的結果信息Useru = userDao.findByAccount(user.getAccount();/賬戶存在if(u = null) /賬戶不存在msg.setType(11); msg.setContent("賬戶不存在!");else/該賬戶存在u = userDao.findByAccountAndPassword(user.getAccount(), user.getPassword();if(u = null)/密碼不對msg.setType(12); msg.setConte
26、nt("密碼不對!");else/賬戶、密碼正確if(Server.getUsersOL().get(user.getAccount() = null) /可以登陸msg.setType(13);msg.setAccepter(u);else/已登錄msg.setType(14); msg.setContent("不能重復登錄!");returnmsg;登錄驗證,主要分為三步:1.首先驗證用戶的賬號合法性,即該賬號是否存在。只有賬號存在才會進行后續的驗證。2.如果用戶的賬號存在,再驗證密碼是否與賬號匹配,如果匹配成功,則返回該用戶的信息。3.接下來則從主
27、服務那里去判定該用戶是否已經登錄,對于已登錄的用戶則不再給予登錄操作。6.2.4Hibernate配置文件訪問數據的操作要借助Hibernate框架來完成。使用了Hibernate,我們就可以不用再寫很復雜繁瑣的JDBC語句去建立與數據庫的連接,而將這些操作全都交給Hibernate來完成。Hibernate的配置文件如下:<session-factory><!在控制臺打印出執行數據訪問的SQL語句 -><propertyname="show_sql">true</property><!連接數據庫所使用的驅動程序 -&g
28、t;<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!- 連接數據庫的地址 -><propertyname="hibernate.connection.url">jdbc:mysql:/localhost:3306/NFC</property><propertyname="hibernate.connection.username">root<
29、;/property><propertyname="hibernate.connection.password">846255</property><!- 數據庫的方言,該方言用于對數據庫的操作進行解釋 -><propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!開啟數據庫定義語言,用于自動創建表結構 -><propertyname="hibernate.h
30、bm2ddl.auto">create</property><!- 映射的實體類 -><mappingclass = "cn.newcapec.model.Crowd"/><mappingclass = "cn.newcapec.model.User"/></session-factory></hibernate-configuration>6.2.5 Hibernate會話工廠在完成了配置之后,為了可以使用它來進行數據的操作,我們需要先創建會話工廠,因為數據的操作是
31、基于會話的。會話工廠的代碼如下:publicclassHibernate privatestaticSessionFactorysf = null;/會話工廠privatestaticSessionsession = null;static Configurationcf = newConfiguration();cf.configure();/在默認路徑下,讀取配置文件。ServiceRegistrysr = newStandardServiceRegistryBuilder().applySettings(cf.getProperties().build();sf = cf.buildSe
32、ssionFactory(sr);session = sf.openSession();privateHibernate() publicstaticSessionFactorygetSessionFactory() returnsf;publicstaticSessiongetSession() returnsession;這里的會話工廠SessionFactory使用的是Java設計模式中的單例模式,唯一的SessionFactory對象能夠保證數據操作的可控性,讓我們能夠利用事務有效的保證被操作數據的一致性。在配置文件中羅列出了所使用的實體類,通過在實體類中使用相應的注解標明,Hiber
33、nate就可以將一個實體類映射為一張表,而實體類的屬性則將映射為表中的字段。實體類就相當于一張表,為了操縱它,我為實體類分別寫了一個操作類。利用會話Session來實現數據的增刪改查。6.2.6數據操作類 UserDaopublicclassUserDao privateSessionsession = null;publicUserDao() session = Hibernate.getSession();/獲取會話publicUserfindByAccount(Integeraccount) /根據賬號來查詢用戶Criteriac = session.createCriteria(Use
34、r.class);c.add(Restrictions.eq("account", account);Useruser = (User)c.uniqueResult();returnuser;/根據賬號和密碼來查詢用戶publicUserfindByAccountAndPassword(Integeraccount, Stringpassword) Criteriac = session.createCriteria(User.class);c.add(Restrictions.eq("account", account);c.add(Restricti
35、ons.eq("password", password);Useruser = (User)c.uniqueResult();returnuser;/查詢全部用戶publicList<User> queryAll() Criteriac = session.createCriteria(User.class);SuppressWarnings("unchecked")List<User> users = c.list();returnusers;6.2.7數據操作類 CrowdDaopublicclassCrowdDao /群組數
36、據訪問層privateSessionsession = null;publicCrowdDao() session = Hibernate.getSession();publicvoidsave(Crowdcrowd) /保存群組Transactiontransaction = session.beginTransaction();session.save(crowd);mit();publicvoidupdate(Crowdcrowd) /更新群組Transactiontransaction = session.beginTransaction();session.update(crowd)
37、;mit();publicvoiddelete(Crowdcrowd) /刪除群組Transactiontransaction = session.beginTransaction();session.delete(crowd);mit();以上兩個數據訪問類都使用了基于Criteria的查詢方式,該方式是面向對象的,通過為該對象設置一些相應的屬性值,就可以獲取滿足條件的數據。如:c.add(Restrictions.eq("account", account)等價于whereaccount = account.從思想的層面上來講很大程度上有別于傳統的SQL查詢方式。Hib
38、ernate還提供了封裝過的save(Object);update(Object);delete(Object)等方法供我們使用,以便提高開發效率。通過如此簡單而又精煉的代碼即可完成對數據的處理,極大地解放了程序員的勞動力。6.2.8表結構設計表6-1User實體類對應的表字段數據類型備注accountInt賬號passwordvarchar密碼namevarchar昵稱idInt主鍵表6-2Crowd實體類對應的表字段數據類型備注namevarchar群組名稱idInt主鍵關于用戶的信息主要有兩張表。一張是用戶自身的信息表,該表用來存儲用戶的個人資料;另一張表是群組表,用來記錄每個用戶所擁有
39、的群組信息。每個用戶可以擁有多個群組(如:朋友、陌生人等),而每個群組又可以擁有多名用戶(如:朋友列表下有張三、李四兩個人)。兩張表是多對多關系4。需要指明的是,在這兩張表里面都沒有通過外鍵來建立關聯關系,這是因為可以通過Hibernate的注解ManyToMany來完成關聯關系的映射。Hibernate在處理這個注解時,自動地去幫我們創建一張中間表,并用它來維護表之間的關聯關系,這使得我們在構建表結構的時候變得異常輕松。6.2.9用戶類UserEntityTable(name = "User")publicclassUserimplementsSerializable p
40、rivatestaticfinallongserialVersionUID = 1L;IdGeneratedValue(strategy = GenerationType.AUTO)Column(name = "id", unique = true)privateIntegerid;/主鍵Column(name = "account")privateIntegeraccount;/賬號Column(name = "password")privateStringpassword;/密碼Column(name = "name&q
41、uot;)privateStringname;/昵稱ManyToMany(mappedBy = "users", fetch = FetchType.EAGER)privateList<Crowd> crowds = newArrayList<Crowd>();/用戶所屬的群組6.2.10 群組類CrowdEntityTable(name = "Crowd")publicclassCrowdimplementsSerializableprivatestaticfinallongserialVersionUID = 1L;IdGen
42、eratedValue(strategy = GenerationType.AUTO) Column(name = "id")privateIntegerid;/主鍵Column(name = "name")privateStringname;/群組的名稱ManyToMany(fetch = FetchType.EAGER)/(mappedBy = "crowds")privateList<User> users = newArrayList<User>();/群組所包含的用戶publicCrowd() 1.通
43、過Entry來標明它是一個實體類。2.通過Tabel(name=”tableName”)來指明該實體類與數據庫中哪一張表相對應。3.通過Id來指明表中的主鍵。4.通過GeneratedValue(strategy = GenerationType.AUTO)來指明主鍵的增長策略。5.通過Column(name = "name")來指明類中的某個屬性與數據庫表中哪個字段名相匹配。6.通過ManyToMany(fetch = FetchType.EAGER)來指明兩個實體類之間的多對多關系。使用了Hibernate之后,作為程序員的我們完全可以使用面向對象的思維來處理數據。尤其
44、是在Hibernate的配置文件中使用了<propertyname="hibernate.hbm2ddl.auto">create</property>之后,Hibernamte甚至能夠自動幫我們依據實體類來創建相應的表結構,我們無需再為操作數據庫而苦惱。6.3 客戶端6.3.1Client對于客戶端所有的通信操作都是基于該Client來完成,它是客戶端的守護線程publicUseruser = null;/Client所服務的用戶privateMap<Integer, Chart> map = newHashMap<Integer
45、, Chart>();/用戶的聊天窗體MapOverridepublicvoidrun() while(true) try Messagemsg = (Message)input.readObject();if(msg.getType() = 11) /賬戶不存在Logon.getInstance().setInfo(msg.getContent();elseif(msg.getType() = 12) /密碼不對Logon.getInstance().setInfo(msg.getContent();elseif(msg.getType() = 13)/可以登陸Useruser = m
46、sg.getAccepter();setUser(user);Logon.getInstance().setVisible(false);Friend.getInstance().setName(user.getName();elseif(msg.getType() = 14) /已登錄Logon.getInstance().setInfo(msg.getContent();elseif(msg.getType() = 20) /轉發聊天消息this.getMap().get(msg.getSender().getAccount().append(msg);elseif(msg.getType
47、() = 40) /收到來自好友的游戲邀請Friend.getInstance().requestGame(msg.getSender();elseif(msg.getType() = 42) /好友同意開始游戲Friend.getInstance().startGame(msg.getAccepter();elseif(msg.getType() = 43) /好友拒絕來游戲邀請Friend.getInstance().refuseGame(msg.getSender();elseif(msg.getType() = 44) /勝負已分,游戲中止/Game.getInstance().los
48、eGame(); catch (Exceptione) /異常處理 這個位于客戶端的后臺守護線程,接收服務器推送過來的消息。 類似于虛擬服務器它也根據消息的類型,對消息進行分類處理,同時也將用戶的操作封裝成消息對象傳遞給虛擬服務器。當一個用戶與多個好友進行會話時,為了方便管理與每個好友的會話,在該類中使用了一個map集合。當該類收到來自某個好友的聊天消息,在提取出消息內容后,從map中根據鍵值對<好友的賬號:與好友聊天的窗體>來得到指定好友的聊天窗體,將聊天數據交給該聊天窗體進行顯示。該類只是負責對數據進行收發,而數據的顯示等操作,則交給上層的界面來完成。彼此各司其職,這樣就實現了
49、分層的效果。6.3.2 登錄界面Logon圖6-1 登錄界面/登錄界面所用到的控件privatestaticLogonlogon = newLogon();/窗體本身privateJPanelhead = newJPanel();/頭部privateJLabelmin = newJLabel(newImageIcon("image/min.png");/最小化privateJLabelclose = newJLabel(newImageIcon("image/close.png");/關閉privateJPanelbody = newJPanel();/
50、身體privateJLabelinfo = newJLabel();/信息提示privateJLabelaccountLabel = newJLabel("賬號:");/賬號標簽privateJLabelpasswordLabel = newJLabel("密碼:");/密碼標簽privateJTextFieldaccount = newJTextField();/賬號文本框privateJPasswordFieldpassword = newJPasswordField();/密碼文本框privateJButtonlogin = newJButton(
51、"登錄");/登錄按鈕privateJPanelfoot = newJPanel();/尾部privateJLabelset =newJLabel(newImageIcon("image/set.png");/設置登錄界面使用來Swing的網格包布局GridBagLayout來放置各個組件在面板JPanel中的位置。6.3.3 好友界面Friend圖6-2 好友界面/省略了與登錄界面外層布局的內容privateJPanelbody = newJPanel();/身體privateJPanelshow = newJPanel();/用戶信息展示privat
52、eJLabelimg = newJLabel(newImageIcon("image/me.png");/用戶照片privateJPanelinfo = newJPanel();/用戶的昵稱、等級privateJLabelname = newJLabel();/用戶昵稱privateJLabellevel = newJLabel();/用戶等級privateJScrollPanejsp = null;/容納好友列表的窗體privateJTreetree = null;/用戶的好友列表在好友界面中,通過遍歷Client傳過來的用戶信息User中的List<Crowd&g
53、t;來構建好友列表樹JTree,這里使用了邊界布局的方式來放置組件。6.3.4 聊天界面Chart圖6-3 聊天界面privateJPanelbody = newJPanel();/身體privateJTextAreaoutput = newJTextArea();/顯示框privateJScrollPaneread = newJScrollPane(output);/顯示框的滾動窗體privateJTextAreainput = newJTextArea();/輸入框privateJScrollPanewrite = newJScrollPane(input);/輸入框的滾動窗體privat
54、eJPaneljp = newJPanel();/輸入框的滾動窗體privateJButtonenter = newJButton("發送");/發送按鈕privateJButtoncancel = newJButton("取消");/取消按鈕privateUserfriend = null;/聊天的好友聊天界面中利用JTextArea來顯示聊天對話的內容,當聊天內容過多時,可以拖動外層滾動面板JScrollPane提供的滾動條來翻閱查看。6.3.5 游戲界面Game圖6-4 游戲界面在游戲界面,產生8*8=64個網格,所以需要32對按鈕,其中每一對中的
55、兩個按鈕都是一樣的。這樣就可以保證所有的按鈕都會有一個與之匹配。因為在該網格中無法按位置來獲取其中的按鈕,所以我使用了一個二維數組來模擬網格的位置?!斑B連看”游戲的界面代碼如下:publicclassGameextendsJFrameprivatestaticfinallongserialVersionUID = 1L;JMenuBarjmb = null;/菜單欄JMenufile = null;/文件菜單JMenucustomize =null;/自定義菜單JMenuItemdifficulty = null;/自定義難度JMenuItemcontent =null;/自定義內容JMenu
56、Itemclose = null;/關閉JMenustart = null;/開始游戲JMenunewGame = null;/新游戲JMenuinfo = null;/信息JPanelgamespace = null;/游戲場所JButtonjb = null;/隨機按鈕JButtonfirst = null;/第一次點擊的按鈕JButtonsecond = null;/第二次點擊的按鈕ArrayList<JButton> al = null;/按鈕集合,用于幫助產生隨機按鈕Randomr = newRandom();/隨機體intcount = 64;/剩余按鈕計數器JButton jbMap = null;/按鈕二維數組,用于記錄按鈕的狀態和生
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國可互換投影透鏡頭行業市場全景分析及前景機遇研判報告
- 2025年中國聚對苯二甲酸乙二醇酯瓶行業市場全景分析及前景機遇研判報告
- 煙草項目調研分析
- 中國甲魚養殖行業市場發展現狀及發展趨勢與投資分析研究報告(2024-2030)
- 2025年中國泵浦消防車行業發展監測及投資戰略研究報告
- 經營廚具項目投資可行性研究分析報告(2024-2030版)
- 2025年中國佛燈行業市場發展前景及發展趨勢與投資戰略研究報告
- 2025年 云南省工業鍋爐G1證考試練習題附答案
- 2025年 繼電保護作業人員理論考試練習題附答案
- 中國環衛機械設備行業市場調查研究及發展戰略規劃報告
- 米亞羅-孟屯河谷風景名勝區旅游基礎設施建設項目環評報告
- 沖突管理與溝通技巧
- 滁州市第一人民醫院醫療暫存間環保設施提升改造項目環境影響報告表
- 籍貫對照表完整版
- 警用無人機考試題庫(全真題庫)
- 中等職業學校英語課程標準(2020年版)(word精排版)
- 高邊坡作業安全專項施工方案與高邊坡安全專項施工方案匯編
- 醫保業務知識題庫
- 等級醫院評審中應注意的迎評禮儀
- 吉林省長春市東北師大附中明珠學校2023年物理八年級第二學期期末統考模擬試題含解析
- LD 52-1994氣瓶防震圈
評論
0/150
提交評論