基于java的局域網(wǎng)聊天系統(tǒng)-課程設計報告_第1頁
已閱讀1頁,還剩120頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  密級: </p><p>  NANCHANG UNIVERSITY</p><p><b>  課程設計報告</b></p><p>  CURRICULUM DESIGN REPORT</p><p> ?。?014 —2015 年)</p><p&g

2、t;  題 目 基于JAVA的局域網(wǎng)聊天系統(tǒng)開發(fā) </p><p>  學 院: 信息工程學院 系 計算機科學與技術</p><p>  專業(yè)班級: 計算機科學與技術xxx班 </p><p>  學生姓名

3、: 學號: </p><p>  指導教師: 職稱: </p><p>  起訖日期: </p><p>  基于JAVA的局域網(wǎng)聊天系統(tǒng)開發(fā)</p><p>  專

4、業(yè):計算機科學與技術 學 號:xxxxxxxxxx</p><p>  學生姓名:XXX 指導教師:LP</p><p><b>  摘要</b></p><p>  隨著計算機網(wǎng)絡技術的發(fā)展,各種各樣基于網(wǎng)絡的應用也隨之誕生,比如基于互聯(lián)網(wǎng)的信息發(fā)布,通信,數(shù)據(jù)共享等等。局域網(wǎng)的發(fā)展也同樣迅速。很多政府機構,

5、企業(yè),學校,都是先以一個統(tǒng)一的局域網(wǎng)聯(lián)結在一起,再分別接入INTERNET.因此基于局域網(wǎng)的即時通信工具,就這樣應運而生了。本文利用JAVA的UDP編程以及SWING圖形界面編程技術,在WINDOWS平臺上實現(xiàn)了具有美觀圖形界面的局域網(wǎng)聊天軟件.</p><p>  在本實現(xiàn)內(nèi)將客戶端和服務端綜合在一個程序之內(nèi),用多線程實現(xiàn)不同的并行任務。并模仿國內(nèi)的QQ進行了人性化的界面設計,使用起來更加簡單方便,并且功能十分

6、合理、實用。</p><p>  通過本局域網(wǎng)聊天軟件可以實現(xiàn)一對一、一對多的聊天,可以實現(xiàn)不同用戶不同的文字字體、風格、大小、顏色的發(fā)送和顯示,提供發(fā)送表情、文件、好友間的抖動提示以及聊天記錄的管理等功能。</p><p>  關鍵詞:局域網(wǎng)聊天; JAVA網(wǎng)絡編程; UDP;多線程</p><p>  LAN Chat System Developme

7、nt based on JAVA</p><p><b>  Abstract</b></p><p>  With the development of computer network technology, various kinds of applications based on network were born, such as the rel

8、ease of information, communication, data sharing based on the Internet and so on. The development of the LAN is also quick. Many government agencies, enterprises, schools, is the first in a unified network linked togeth

9、er, each with access to INTERNET. Thus Instant Communication Tools based on LAN were born. In this paper, by using JAVA UDP programming and SWING graphica</p><p>  In the implementation, the client and the s

10、erver were integrated within a program, implemented with multithreading. And imitating the domestic QQ interface humanization design, using more simple and convenient, and the function is very reasonable, practical.</

11、p><p>  Through our LAN chat software can achieve one to one, one to many chat, send different users’ different text font, style, size, color and display, provide the send of expression, file, the shake among f

12、riends and chat records management and other functions.</p><p>  Keyword: LAN Chat;JAVA network programming;UDP; multi-thread</p><p><b>  目錄</b></p><p><b>  摘要I&l

13、t;/b></p><p>  AbstractII</p><p><b>  第一章 前言1</b></p><p>  第二章 系統(tǒng)可行性分析2</p><p>  2.1 成本可行性分析2</p><p>  2.2 技術可行性分析2</p><p>

14、;  第三章 需求分析3</p><p>  3.1 功能需求分析3</p><p>  3.2性能需求分析3</p><p>  3.3 系統(tǒng)主要技術分析3</p><p>  3.2.1 JAVA DatagramSocket3</p><p>  3.2.2 JAVA MulticastSocket4

15、</p><p>  3.2.3 JAVA Swing5</p><p>  3.4 系統(tǒng)開發(fā)、運行環(huán)境分析5</p><p>  第四章 系統(tǒng)概要設計6</p><p>  4.1 系統(tǒng)功能模塊設計6</p><p>  4.2 系統(tǒng)數(shù)據(jù)流圖9</p><p>  第五章 系統(tǒng)詳細設

16、計10</p><p>  5.1 詳細設計概述10</p><p>  5.2 系統(tǒng)詳細設計10</p><p>  5.2.1登陸界面10</p><p>  5.2.2用戶主界面14</p><p>  5.2.3聊天界面16</p><p>  5.2.4輔助工具類19&l

17、t;/p><p>  第六章 系統(tǒng)實現(xiàn)21</p><p>  6.1 總體工程架構的實現(xiàn)21</p><p>  6.2 具體功能實現(xiàn)21</p><p><b>  結論24</b></p><p><b>  參考文獻25</b></p><p

18、><b>  前言</b></p><p>  近年來,隨著全球信息化進程的不斷發(fā)展,網(wǎng)絡也在飛速發(fā)展。出于高效、快速地處理各種事務的目的,越來越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來進行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴大,業(yè)務量的增加,在局域網(wǎng)上運行的應用越來越多,如知識庫、網(wǎng)絡會議、數(shù)據(jù)庫應用和數(shù)據(jù)的同步與備份等,

19、這些應用對局域網(wǎng)的信息吞吐、處理能力的要求也越來越高。這些在企業(yè)內(nèi)部原有局域網(wǎng)設計之初未曾考慮到的新情況的出現(xiàn)使得局域網(wǎng)不堪重負,容易發(fā)生信息阻塞,此時,局域網(wǎng)不但不能提高生產(chǎn)效率,反而成為企業(yè)發(fā)展的瓶頸。    </p><p>  為了解決上述矛盾,人們提出了許多方法。提升網(wǎng)絡帶寬及增加服務器的吞吐能力是解決此矛盾的一種方法。然而,從企業(yè)運行的成本方面考慮,無論是單純地

20、提升網(wǎng)絡帶寬或增加服務器的吞吐能力都不能從根本上解決局域網(wǎng)資源緊張的問題,對舊有局域網(wǎng)的大規(guī)模硬件改造反而會增加企業(yè)的負擔。</p><p>  我在本文中將討論一種基于DatagramSocket和MulticastSocket的局域網(wǎng)通信工具的設計與實現(xiàn)方法?;贒atagramSocket和MulticastSocket的局域網(wǎng)通信軟件可以為企業(yè)原有的局域網(wǎng)提供一種良好,安全,快速的通信機制。它的實現(xiàn)無需對

21、企業(yè)原有的局域網(wǎng)硬件進行任何改動,具有實現(xiàn)成本低廉的優(yōu)點,它的使用能有效地降低局域網(wǎng)通信負荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求。  </p><p>  基于DatagramSocket和MulticastSocket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實例之一,它很好地詮釋了DatagramSocket和MulticastSocket通信的原理,并且在企

22、業(yè)內(nèi)部通信、教學、討論等應用中都具有一定的實用價值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡帶寬資源低,占用服務器吞吐能力低,易于編程實現(xiàn)等優(yōu)點。 </p><p>  基于DatagramSocket和MulticastSocket的局域網(wǎng)通信軟件應用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴展以適應新型的網(wǎng)絡應用,如網(wǎng)絡教育,數(shù)據(jù)影音傳輸?shù)?,擁有廣泛的應用前景。</p><

23、p>  第二章 系統(tǒng)可行性分析</p><p>  可行性分析是基于客觀的、科學的,其在整個系統(tǒng)的設計與實現(xiàn)過程中有非常重要的意義,軟件可行性分析的目的是用合適的代價解決足夠的問題,其最終結果是對所設想的項目做出實施還是放棄。本局域網(wǎng)聊天系統(tǒng)將從成本和技術可行性進行分析。</p><p>  2.1 成本可行性分析</p><p>  因為本軟件只做開發(fā)學習使

24、用,所以暫且不考慮經(jīng)濟成本及盈利問題。</p><p>  2.2 技術可行性分析</p><p>  首先我已經(jīng)搭建好開發(fā)所需要的軟硬件平臺,并進行了合理而完善的需求分析,做好了充分的前期準備工作,其次因為本程序的平臺將基于WINDOWS,將要使用網(wǎng)絡通信技術,而WINDOWS有完善成熟的網(wǎng)絡通信接口,以及與VC開發(fā)環(huán)境的嚴密契合能力,加之相類似的更大規(guī)模的INTERNET通信工具產(chǎn)品也

25、已有例在先,所以這個程序的開發(fā)可行性在技術上是完全可行的。</p><p><b>  需求分析</b></p><p>  3.1 功能需求分析</p><p>  用戶端之間的信息發(fā)送,本程序需要實現(xiàn)的最基本的功能;</p><p>  當有用戶下線后,應在所有在線的用戶的“在線用戶列表”中消掉下線人的信息記錄;&l

26、t;/p><p>  在聊天是還應提供一些使用的輔助功能,在本局域網(wǎng)的聊天軟件中,提供有字體設置、表情發(fā)送、文件發(fā)送、窗口抖動、消息記錄管理等常用功能,能夠滿足用戶的基本要求。</p><p><b>  3.2性能需求分析</b></p><p>  首先要求程序要完全可靠,可以應付種種由于系統(tǒng)問題產(chǎn)生的錯誤,比如初始網(wǎng)絡失敗,對方突然下線等。要

27、求提前設想到類似的盡可能多的可能發(fā)生的事件,做出相應的應對措施,并向用戶提交簡單易懂清晰明白的提示信息。 </p><p>  程序要有良好的容錯性,當用戶進行非法操作時或者系統(tǒng)本身出現(xiàn)問題時要能以最好的方式退出程序,避免發(fā)生程序假死現(xiàn)象。 </p><p>  要求程序對所運行之系統(tǒng)的硬件條件要求盡可能低,運行時內(nèi)存占用盡可能小,響應速度要盡可能快。并且不發(fā)生內(nèi)存泄漏

28、之類影響系統(tǒng)運行的錯誤事件。并且要求易于維護及擴展。所以應該采用模塊化開發(fā),各個模塊之間不要有太多的聯(lián)系,以免維護困難。</p><p>  3.3 系統(tǒng)主要技術分析</p><p>  3.2.1 JAVA DatagramSocket</p><p><b>  1.基本概念:</b></p><p>  a.Dat

29、agramPacket與DatagramSocket位于java.net包中</p><p>  b.DatagramPacket表示存放數(shù)據(jù)的數(shù)據(jù)報,DatagramSocket表示接受或發(fā)送數(shù)據(jù)報的套接字</p><p>  c.由這兩個類所有構成的網(wǎng)絡鏈接是基于UDP協(xié)議,是一種不可靠的協(xié)議。</p><p>  注:為了解決UDP協(xié)議的不可靠問題,在軟件的聊

30、天的文件傳輸功能部分自定義了一套接收數(shù)據(jù)的規(guī)則,使得通過UDP協(xié)議傳輸文件不會出錯。</p><p><b>  2.使用方法:</b></p><p>  DatagramSocket():創(chuàng)建實例。通常用于客戶端編程,它并沒有特定監(jiān)聽的端口,僅僅使用一個臨時的。 DatagramSocket(int port):創(chuàng)建實例,并固定監(jiān)聽Port端口的報文。

31、 DatagramSocket(int port, InetAddress localAddr):這是個非常有用的構建器,當一臺機器擁有多于一個IP地址的時候,由它創(chuàng)建的實例僅僅接收來自LocalAddr的報文</p><p>  receive(DatagramPacket d):接收數(shù)據(jù)報文到d中。receive方法產(chǎn)生一個“阻塞”。 send(DatagramPacket d):發(fā)送

32、報文d到目的地。 setSoTimeout(int timeout):設置超時時間,單位為毫秒。 close():關閉DatagramSocket。在應用程序退出的時候,通常會主動釋放資源,關閉Socket,但是由于異常地退出可能造成資源無法回收。所以,應該在程序完成時,主動使用此方法關閉Socket,或在捕獲到異常拋出后關閉Sock。</p><p>  3.2.2 JAVA Multi

33、castSocket</p><p>  多播數(shù)據(jù)報套接字類用于發(fā)送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機的“組”的附加功能。</p><p>  多播組通過 D 類 IP 地址和標準 UDP 端口號指定。D 類 IP 地址在 224.0.0.0 和 

34、239.255.255.255 的范圍內(nèi)(包括兩者)。地址 224.0.0.0 被保留,不應使用。</p><p>  可以通過首先使用所需端口創(chuàng)建 MulticastSocket,然后調(diào)用 joinGroup(InetAddress groupAddr) 方法來加入多播組。將消息發(fā)送到多播組時,該主機和端口的所有預定接收者都將接收到消息(在數(shù)據(jù)包的生存時間范圍內(nèi),請參閱下文)。套接

35、字不必成為多播組的成員即可向其發(fā)送消息。</p><p>  當套接字預定多播組/端口時,它將接收由該組/端口的其他主機發(fā)送的數(shù)據(jù)報,像該組和端口的所有其他成員一樣。套接字通過 leaveGroup(InetAddress addr) 方法放棄組中的成員資格。多個 MulticastSocket 可以同時預定多播組和端口,并且都會接收到組數(shù)據(jù)報。</p><p>  同時,不允許

36、 applet 使用多播套接字。</p><p>  3.2.3 JAVA Swing</p><p>  Swing是一組Java程序元件,它能夠創(chuàng)建圖象用戶接口(GUI)元件,如按鈕和滾動條,它們獨立于特定操作系統(tǒng)的開窗口系統(tǒng)。Swing元件使用Java Foundation Classes(JFC)。</p><p>  互聯(lián)網(wǎng)基礎類(IFC) 是網(wǎng)景公司最初

37、為Java開發(fā)的圖形庫,第一次發(fā)布于1996年12月16日。</p><p>  在1997年4月2日,太陽微系統(tǒng)公司 和 網(wǎng)景公司宣稱他們要將IFC和其他技術合并形成 Java基礎類。作為IFC最初提供組件的附加品, Swing引進了一個機理:在不改變大量的程序代碼前提下允許程序中每個組件觀感的變化。支持可更換觀感技術的引入允許Swing組件在模擬原生組件外觀的同時又保持了平臺獨立的優(yōu)點。</p>

38、<p>  Swing 是一個為Java設計的GUI工具包。 Swing 是 JAVA API 的一部分。 Swing 包括了圖形用戶界面 (GUI) 器件 如:文本框,按鈕,分隔窗格和表。</p><p>  SWING 提供許多比AWT更好的屏幕顯示元素。它們用純Java寫成,所以同Java本身一樣可以跨平臺運行,這一點不像AWT。 它們是JFC的一部分。 它們支持可更換的觀感

39、和主題(各種操作系統(tǒng)默認的特有主題),然而不是真的使用原生平臺提供的設備,而是僅僅在表面上模仿它們。這意味著你可以在任意平臺上使用JAVA支持的任意觀感。 輕量級元件的缺點則是執(zhí)行速度較慢,優(yōu)點就是可以在所有平臺上采用統(tǒng)一的行為。</p><p>  3.4 系統(tǒng)開發(fā)、運行環(huán)境分析</p><p>  操作系統(tǒng):Microsoft Windows 7</p><p>

40、;  JDK:jdk1.8.0_20-windows</p><p>  JDK(Java Development Kit)是Sun Microsystems針對Java開發(fā)員的產(chǎn)品。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的Java SDK。JDK 是整個Java的核心,包括了Java運行環(huán)境,Java工具和Java基礎的類庫。</p><p>  開發(fā)工具:Eclipse 4.4

41、.0 或更高版本</p><p>  Eclipse企業(yè)級工作平臺(Eclipse Java EE IDE for Web Developers,簡稱Eclipse),利用它我們可以在數(shù)據(jù)庫和JavaEE的開發(fā)、發(fā)布,以及應用程序服務器的整合方面極大的提高工作效率。它是功能豐富的JavaEE集成開發(fā)環(huán)境,包括了完備的編碼、調(diào)試、測試和發(fā)布功能,完整支持HTML、Struts、JSF、CSS、Javascript、

42、SQL、Hibernate。</p><p>  第四章 系統(tǒng)概要設計</p><p>  4.1 系統(tǒng)功能模塊設計</p><p>  從模擬用戶的角度進行分析,對于一個局域網(wǎng)聊天系統(tǒng),首先要確定其功能是什么,也就是用戶想要系統(tǒng)做什么工作。經(jīng)過對系統(tǒng)的可行性分析、需求分析、技術分析后,結合調(diào)研的情況及用戶的使用需求,確定了本系統(tǒng)的功能模塊如下圖所示。</p&

43、gt;<p>  圖4.1 系統(tǒng)功能模塊圖</p><p><b>  功能模塊介紹:</b></p><p><b>  用戶登陸</b></p><p>  用戶登陸時使用,提供昵稱的輸入和用戶頭像的選擇等功能。用戶登陸界面共分為五部分如下圖所示:</p><p><b&g

44、t; ?、偬崾拘畔@示區(qū)域</b></p><p><b> ?、谳斎胗脩絷欠Q區(qū)域</b></p><p><b> ?、圻x擇頭像的列表</b></p><p><b>  ④頭像展示區(qū)</b></p><p><b>  ⑤登入退出按鈕</b>

45、;</p><p><b>  圖4.2 登陸界面</b></p><p><b>  用戶主界面</b></p><p>  用戶主界面是顯示所有在線用戶的界面,界面分為三塊:</p><p> ?、亠@示本客戶端的登入用戶的頭像和昵稱</p><p> ?、谧约褐谱鞯淖钚』?/p>

46、和關閉的圖標,為了符合程序風格,去掉了windows的原有框架,進行了適當?shù)拿阑?lt;/p><p> ?、蹖崟r顯示局域網(wǎng)聊天的在線用戶列表,每一項都會顯示一個在線用戶的頭像和昵稱</p><p> ?、軡L動顯示當前的在線用戶數(shù)目,當在線用戶較多時,可以讓用戶直觀地看到在線的人數(shù)</p><p>  圖4.3 用戶主界面</p><p><

47、b>  聊天界面</b></p><p>  聊天界面是用戶之間聊天使用的界面,界面共分為六部分:</p><p> ?、亠@示對象的頭像和昵稱</p><p><b> ?、陲@示聊天記錄</b></p><p> ?、哿奶燧o助功能欄,從左到右依次為:文字屬性、表情、窗口抖動、文件發(fā)送和聊天記錄管理<

48、;/p><p><b> ?、苡脩糨斎肓奶煨畔?lt;/b></p><p> ?、莅l(fā)送按鈕和清屏按鈕,清屏按鈕用于清除聊天界面的聊天信息</p><p> ?、揎@示對方的放大頭像和登陸信息</p><p><b>  圖4.4 聊天界面</b></p><p>  4.2 系統(tǒng)數(shù)據(jù)流

49、圖</p><p>  圖4.5 系統(tǒng)數(shù)據(jù)流圖</p><p>  第五章 系統(tǒng)詳細設計</p><p>  5.1 詳細設計概述</p><p>  軟件詳細設計的任務是,是為軟件結構圖中的每個模塊確定所采用的算法和塊內(nèi)數(shù)據(jù)結構,用某種選定的表達工具給出清晰的描述,表達工具可以自由選擇,但工具必須具有描述過程細節(jié)的能力,而且能夠有利于程序員

50、在編程時便于直接翻譯成程序設計語言的源程序。</p><p>  程序流程圖、UML圖等都是完成詳細設計的工具,選擇合適的工具并且正確地使用是十分重要的。</p><p>  在概要設計階段,已經(jīng)確定了軟件系統(tǒng)的總體結構,給出了軟件系統(tǒng)中各個組成模塊的功能和模塊間的接口。作為軟件設計的第二步,軟件詳細設計就是在軟件概要設計的基礎上,考慮如何實現(xiàn)定義的軟件系統(tǒng),直到對系統(tǒng)中的每個模塊給出了足

51、夠詳細的過程描述。在軟件詳細設計以后,程序員將仍舊根據(jù)詳細設計的過程編寫出實際的程序代碼。因此,軟件詳細設計的結果基本上決定了最終的程序代碼質(zhì)量。</p><p>  5.2 系統(tǒng)詳細設計</p><p><b>  5.2.1登陸界面</b></p><p>  登陸局域網(wǎng)聊天程序共涉及到三個類:LanTalk類、LoginFrame類、和C

52、omUtil類。</p><p>  LanTalk類是程序的主程序;</p><p>  LoginFrame類是程序的登陸界面程序;</p><p>  ComUtil類是程序的通信類,當用戶登陸后,ComUtil類會實例化一個MulticastSocket和一個DatagramSocket,前者用于向固定廣播地址發(fā)送自己的在線信息和實現(xiàn)在線用戶之間的群聊功能,

53、后者用于提供兩個用戶之間的私聊功能。</p><p>  登陸局域網(wǎng)聊天軟件時需要運行的是LanTalk類,LanTalk類會實例化LoginFrame類初始化登陸界面,而當?shù)顷懶畔⑻钔甏_定登陸后,LoginFrame又會初始化ComUtil類提供通信功能,三者的關系和UML圖如下所示:</p><p>  (注:由于受圖像大小限制,UML圖并沒有畫出監(jiān)聽器的類圖)</p>

54、<p>  圖5.1 登陸界面UML圖</p><p><b>  登陸界面核心代碼:</b></p><p>  ComUtil的廣播在線信息主代碼</p><p>  public void broadCast(String msg)</p><p><b>  {</b></p

55、><p><b>  try</b></p><p><b>  {</b></p><p>  //將msg字符串轉換字節(jié)數(shù)組</p><p>  byte[] buff = msg.getBytes();</p><p>  //設置發(fā)送用的DatagramPacket里的字

56、節(jié)數(shù)據(jù)</p><p>  outPacket.setData(buff);</p><p><b>  //發(fā)送數(shù)據(jù)報</b></p><p>  singleSocket.send(outPacket);</p><p><b>  }</b></p><p><b

57、>  //捕捉異常</b></p><p>  catch (IOException ex)</p><p><b>  {</b></p><p>  ex.printStackTrace();</p><p>  if (socket != null)</p><p><

58、;b>  {</b></p><p>  //關閉該Socket對象</p><p>  socket.close();</p><p><b>  }</b></p><p>  JOptionPane.showMessageDialog(null, </p><p>  &q

59、uot;發(fā)送信息異常,請確認30000端口空閑,且網(wǎng)絡連接正常!"</p><p>  , "網(wǎng)絡異常", JOptionPane.ERROR_MESSAGE);</p><p>  System.exit(1);</p><p><b>  }</b></p><p><b> 

60、 }</b></p><p>  //持續(xù)讀取MulticastSocket的線程</p><p>  class ReadBroad extends Thread</p><p><b>  {</b></p><p>  public void run()</p><p><

61、b>  {</b></p><p>  while (true)</p><p><b>  {</b></p><p><b>  try</b></p><p><b>  {</b></p><p>  //讀取Socket中的數(shù)

62、據(jù),讀到的數(shù)據(jù)放在inPacket所封裝的字節(jié)數(shù)組里。</p><p>  socket.receive(inPacket);</p><p>  //打印輸出從socket中讀取的內(nèi)容</p><p>  String msg = new String(inBuff , 0 , inPacket.getLength());</p><p>

63、  //讀到的內(nèi)容是在線信息</p><p>  if (msg.startsWith(MyProtocol.PRESENCE)</p><p>  && msg.endsWith(MyProtocol.PRESENCE))</p><p><b>  {</b></p><p>  String use

64、rMsg = msg.substring(2 , msg.length() - 2);</p><p>  String[] userInfo = userMsg.split(MyProtocol.SPLITTER);</p><p>  UserInfo user = new UserInfo(userInfo[1] , userInfo[0] , userInfo[2],</p&

65、gt;<p>  inPacket.getSocketAddress(), 0);</p><p>  //控制是否需要添加該用戶的旗標</p><p>  boolean addFlag = true;</p><p>  ArrayList<Integer> delList = new ArrayList<Integer>(

66、);</p><p>  //遍歷系統(tǒng)中已有的所有用戶,該循環(huán)必須循環(huán)完成</p><p>  for (int i = 1 ; i < lanTalk.getUserNum() ; i++ )</p><p><b>  {</b></p><p>  UserInfo current = lanTalk.get

67、User(i);</p><p>  //將所有用戶失去聯(lián)系的次數(shù)加1</p><p>  current.setLost(current.getLost() + 1);</p><p>  //如果該信息由指定用戶發(fā)送過來</p><p>  if(current.getAddress() == null </p><p

68、>  && current.getName().equals(user.getName())</p><p>  && current.getloginTime().equals(user.getloginTime()))</p><p><b>  {</b></p><p>  current.setA

69、ddress(user.getAddress());</p><p>  current.setLost(0);</p><p>  addFlag = false;</p><p><b>  }</b></p><p>  else if (current.equals(user))</p><p

70、><b>  {</b></p><p>  current.setLost(0);</p><p>  //設置該用戶無需添加</p><p>  addFlag = false;</p><p><b>  }</b></p><p>  if (current.g

71、etLost() > lanTalk.getUserNum() * 2)</p><p><b>  {</b></p><p>  delList.add(i);</p><p><b>  }</b></p><p><b>  }</b></p>&l

72、t;p>  //刪除delList中的所有索引對應的用戶</p><p>  for (int i = 0; i < delList.size() ; i++)</p><p><b>  {</b></p><p>  lanTalk.removeUser(delList.get(i));</p><p>

73、<b>  }</b></p><p>  if (addFlag)</p><p><b>  {</b></p><p><b>  //添加新用戶</b></p><p>  lanTalk.addUser(user);</p><p><b

74、>  }</b></p><p><b>  }</b></p><p>  //讀到的內(nèi)容是公聊信息</p><p><b>  else</b></p><p><b>  {</b></p><p><b>

75、  //處理讀到的信息</b></p><p><b>  try {</b></p><p>  lanTalk.processMsg(inPacket , false);</p><p>  } catch (Exception e) {</p><p>  // TODO Auto-generated

76、catch block</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //捕捉異

77、常</b></p><p>  catch (IOException ex)</p><p><b>  {</b></p><p>  ex.printStackTrace();</p><p>  if (socket != null)</p><p><b>  {&l

78、t;/b></p><p>  //關閉該Socket對象</p><p>  socket.close();</p><p><b>  }</b></p><p>  JOptionPane.showMessageDialog(null, </p><p>  "接收信息異常,

79、請確認30000端口空閑,且網(wǎng)絡連接正常!"</p><p>  , "網(wǎng)絡異常", JOptionPane.ERROR_MESSAGE);</p><p>  System.exit(1);</p><p><b>  }</b></p><p><b>  }</b>

80、;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  5.2.2用戶主界面</p><p>  用戶主界面包含三個類,LanTalk類用于顯示主界面在線用戶列表,U

81、serInfo類是封裝用戶信息的類,ShowOnline類是用于顯示在線用戶人數(shù)的類。</p><p>  三者的關系和UML圖如下:</p><p>  圖5.2 用戶主界面UML圖</p><p>  用戶主界面核心代碼:</p><p><b>  顯示在線人數(shù)</b></p><p>  

82、public ShowOnline(LanTalk lanTalk)</p><p><b>  {</b></p><p>  this.lanTalk = lanTalk;</p><p>  this.x = 0;</p><p>  this.changepx = 1;</p><p> 

83、 timer = new Timer(200, </p><p>  new ActionListener()</p><p><b>  {</b></p><p>  public void actionPerformed(ActionEvent e)</p><p><b>  {</b>&l

84、t;/p><p><b>  update();</b></p><p><b>  }</b></p><p><b>  });</b></p><p>  timer.start();</p><p><b>  }</b><

85、;/p><p>  public void update()</p><p><b>  {</b></p><p>  repaint();</p><p><b>  }</b></p><p>  public void paintComponent(Graphics g)

86、</p><p><b>  {</b></p><p>  super.paintComponent(g);</p><p>  g.setColor(color);</p><p>  g.setFont(new Font("華文新魏" , Font.BOLD , 15));</p>

87、<p>  msg = "當前有 " + (lanTalk.getUserNum() - 1) + " 人在線";</p><p>  FontMetrics fm = g.getFontMetrics();</p><p>  int stringwidth = fm.stringWidth(msg);</p><p

88、>  int stringascent = fm.getAscent();</p><p>  if(changepx == 1 && x + changepx + stringwidth > getWidth())</p><p><b>  {</b></p><p>  changepx = -1;</p

89、><p>  x += changepx;</p><p><b>  }</b></p><p><b>  else</b></p><p>  x += changepx;</p><p>  if(changepx == -1 && x + changep

90、x < 0)</p><p><b>  {</b></p><p>  changepx = 1;</p><p>  x += changepx;</p><p><b>  }</b></p><p><b>  else</b></p

91、><p>  x += changepx;</p><p>  g.drawString(msg, x, getHeight() - stringascent / 2);</p><p><b>  }</b></p><p><b>  5.2.3聊天界面</b></p><p&g

92、t;  聊天界面包含六個類:ChatFrame類、FontJWindow類、PicsJWindow類RecordJWindow類、FileReceiveJPanel類和FileSendJPanel類。</p><p>  ChatFrame類是構建聊天界面主框架的類,F(xiàn)ontJWindow類是用于設置字體格式的類,PicsJWindow類是用于顯示表情的類,RecordJWindow類是用于記錄用戶聊天信息的類,

93、FileReceiveJPanel類和FileSendJPanel類是用于文件發(fā)送和接收的類。</p><p>  (注:由于受圖像大小限制,UML圖并沒有畫出監(jiān)聽器的類圖)</p><p>  圖5.3 聊天界面UML圖1</p><p>  圖5.4 聊天界面UML圖2</p><p><b>  聊天界面核心代碼:</b

94、></p><p><b>  字體設置關鍵代碼</b></p><p>  class FontListener implements ActionListener</p><p><b>  {</b></p><p>  public void actionPerformed(Actio

95、nEvent e)</p><p><b>  {</b></p><p>  if(e.getSource() == jcbFontName)</p><p><b>  {</b></p><p>  String fontName = (String)jcbFontName.getSelect

96、edItem();</p><p>  String[] userFont = (owner.getSelf().getFont()).split(MyProtocol.FONT);</p><p>  Font newFont = new Font(fontName, Integer.parseInt(userFont[1]), Integer.parseInt(userFont[2])

97、);</p><p>  owner.getSelf().setFont(newFont);</p><p>  owner.getInputPane().setFont(newFont);</p><p><b>  }</b></p><p>  else if(e.getSource() == jcbFontSiz

98、e)</p><p><b>  {</b></p><p>  int fontSize = (Integer)jcbFontSize.getSelectedItem();</p><p>  String[] userFont = (owner.getSelf().getFont()).split(MyProtocol.FONT);<

99、/p><p>  Font newFont = new Font(userFont[0], Integer.parseInt(userFont[1]), fontSize);</p><p>  owner.getSelf().setFont(newFont);</p><p>  owner.getInputPane().setFont(newFont);</p

100、><p><b>  }</b></p><p>  else if(e.getSource() == jbBold)</p><p><b>  {</b></p><p>  String[] userFont = (owner.getSelf().getFont()).split(MyProtoc

101、ol.FONT);</p><p>  Font newFont = null;</p><p>  if(jbBold.getIcon().toString().equals("src/font_image/bold_normal.png"))</p><p><b>  {</b></p><p>

102、;  newFont = new Font(userFont[0], Font.BOLD, Integer.parseInt(userFont[2]));</p><p>  jbBold.setIcon(new ImageIcon("src/font_image/bold_down.png"));</p><p>  jbItalic.setIcon(new Imag

103、eIcon("src/font_image/italic_normal.png"));</p><p>  jbPlain.setIcon(new ImageIcon("src/font_image/plain_normal.png"));</p><p><b>  }</b></p><p><

104、b>  else</b></p><p><b>  {</b></p><p>  newFont = new Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p>  jbBold.setIcon(new ImageIcon("

105、src/font_image/bold_normal.png"));</p><p><b>  }</b></p><p>  owner.getSelf().setFont(newFont);</p><p>  owner.getInputPane().setFont(newFont);</p><p>

106、<b>  }</b></p><p>  else if(e.getSource() == jbItalic)</p><p><b>  {</b></p><p>  String[] userFont = (owner.getSelf().getFont()).split(MyProtocol.FONT);<

107、/p><p>  Font newFont = null;</p><p>  if(jbItalic.getIcon().toString().equals("src/font_image/italic_normal.png"))</p><p><b>  {</b></p><p>  newFon

108、t = new Font(userFont[0], Font.ITALIC, Integer.parseInt(userFont[2]));</p><p>  jbBold.setIcon(new ImageIcon("src/font_image/bold_normal.png"));</p><p>  jbItalic.setIcon(new ImageIcon

109、("src/font_image/italic_down.png"));</p><p>  jbPlain.setIcon(new ImageIcon("src/font_image/plain_normal.png"));</p><p><b>  }</b></p><p><b>  

110、else</b></p><p><b>  {</b></p><p>  newFont = new Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p>  jbItalic.setIcon(new ImageIcon("src/f

111、ont_image/italic_normal.png"));</p><p><b>  }</b></p><p>  owner.getSelf().setFont(newFont);</p><p>  owner.getInputPane().setFont(newFont);</p><p><

112、;b>  }</b></p><p>  else if(e.getSource() == jbPlain)</p><p><b>  {</b></p><p>  String[] userFont = (owner.getSelf().getFont()).split(MyProtocol.FONT);</p&g

113、t;<p>  Font newFont = null;</p><p>  if(jbPlain.getIcon().toString().equals("src/font_image/plain_normal.png"))</p><p><b>  {</b></p><p>  newFont = ne

114、w Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p>  jbBold.setIcon(new ImageIcon("src/font_image/bold_normal.png"));</p><p>  jbItalic.setIcon(new ImageIcon("

115、src/font_image/italic_normal.png"));</p><p>  jbPlain.setIcon(new ImageIcon("src/font_image/plain_down.png"));</p><p><b>  }</b></p><p><b>  else<

116、;/b></p><p><b>  {</b></p><p>  newFont = new Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p>  jbPlain.setIcon(new ImageIcon("src/font_imag

117、e/plain_normal.png"));</p><p><b>  }</b></p><p>  owner.getSelf().setFont(newFont);</p><p>  owner.getInputPane().setFont(newFont);</p><p><b>  }

118、</b></p><p>  else if(e.getSource() == jbColor)</p><p><b>  {</b></p><p>  Color color = JColorChooser.showDialog(getObj(), "請選擇一種顏色", owner.getSelf().ge

119、tColor());</p><p>  if(color != null)</p><p><b>  {</b></p><p>  owner.getSelf().setColor(color);</p><p>  owner.getInputPane().setForeground(color);</p&

120、gt;<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  5.2.4輔助工具類</p><p> 

121、 輔助類包括MyProtocol類和PicsIcon類,其中MyProtocol類用于提供程序需要的一些協(xié)議字段,而PicsIcon類則是擴展自ImageIcon類用于封裝表情,便于表情的提取。</p><p>  圖5.5 輔助類UML圖</p><p>  MyProtocol類核心代碼:</p><p>  public interface MyProtoco

122、l</p><p><b>  {</b></p><p>  String PRESENCE = "@@"; //在線信息廣播</p><p>  String SPLITTER = "&&"; //登陸信息分割</p><p>  String FONT

123、 = "~~"; //字體分割</p><p>  String SENDFONT = "$$"; //發(fā)送用戶的字體設置</p><p>  String EXP_SPLIT = "!!"; //表情分割</p><p>  String EXP_DETAIL = "%

124、%"; //表情定位分割</p><p>  String P_SPLIT = "##"; //發(fā)送區(qū)域分隔符</p><p>  String SHAKE = "@#"; //震動信息標志</p><p>  String FILE = "@&"; //文件標志<

125、;/p><p>  String FILE_REFUSE = "NOSEND"; //拒絕接收文件</p><p>  String FILE_END = "FILE_END"; //文件結束標志</p><p><b>  }</b></p><p><b>  第六章 系

126、統(tǒng)實現(xiàn)</b></p><p>  6.1 總體工程架構的實現(xiàn)</p><p>  圖6.1 工程架構圖</p><p>  6.2 具體功能實現(xiàn)</p><p><b>  用戶界面登陸如下:</b></p><p>  圖6.2 用戶登陸界面</p><p>

127、;<b>  用戶主界面如下:</b></p><p>  圖6.3 用戶主界面</p><p><b>  用戶主界面如下:</b></p><p>  圖6.4 用戶聊天界面</p><p>  消息記錄界面如下,消息記錄界面提供消息清除和消息導出功能:</p><p>

溫馨提示

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

評論

0/150

提交評論