版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> CURRICULUM DESIGN REPORT</p><p> ?。?014 —2015 年)</p><p> 題 目 基于JAVA的局域網(wǎng)聊天系統(tǒng)開發(fā)
2、 </p><p> 學(xué) 院: 信息工程學(xué)院 系 計算機(jī)科學(xué)與技術(shù)</p><p> 專業(yè)班級: 計算機(jī)科學(xué)與技術(shù)xxx班 </p><p> 學(xué)生姓名: 學(xué)號: </p><p> 指導(dǎo)教師: 職稱:
3、 </p><p> 起訖日期: </p><p> 基于JAVA的局域網(wǎng)聊天系統(tǒng)開發(fā)</p><p><b> 摘要</b></p><p> 隨著計算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展,各種各樣基于網(wǎng)絡(luò)的應(yīng)用也隨之誕生,比如基于互聯(lián)網(wǎng)的信息
4、發(fā)布,通信,數(shù)據(jù)共享等等。局域網(wǎng)的發(fā)展也同樣迅速。很多政府機(jī)構(gòu),企業(yè),學(xué)校,都是先以一個統(tǒng)一的局域網(wǎng)聯(lián)結(jié)在一起,再分別接入INTERNET.因此基于局域網(wǎng)的即時通信工具,就這樣應(yīng)運而生了。本文利用JAVA的UDP編程以及SWING圖形界面編程技術(shù),在WINDOWS平臺上實現(xiàn)了具有美觀圖形界面的局域網(wǎng)聊天軟件.</p><p> 在本實現(xiàn)內(nèi)將客戶端和服務(wù)端綜合在一個程序之內(nèi),用多線程實現(xiàn)不同的并行任務(wù)。并模仿國內(nèi)
5、的QQ進(jìn)行了人性化的界面設(shè)計,使用起來更加簡單方便,并且功能十分合理、實用。</p><p> 通過本局域網(wǎng)聊天軟件可以實現(xiàn)一對一、一對多的聊天,可以實現(xiàn)不同用戶不同的文字字體、風(fēng)格、大小、顏色的發(fā)送和顯示,提供發(fā)送表情、文件、好友間的抖動提示以及聊天記錄的管理等功能。</p><p> 關(guān)鍵詞:局域網(wǎng)聊天; JAVA網(wǎng)絡(luò)編程; UDP;多線程</p><p>
6、 LAN Chat System Development based on JAVA</p><p><b> Abstract</b></p><p> With the development of computer network technology, various kinds of applications based on ne
7、twork were born, such as the release 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
8、 a unified network linked together, 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 impl
9、ementation, the client and the server 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
10、very reasonable, practical.</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 exp
11、ression, file, the shake among friends and chat records management and other functions.</p><p> Keyword: LAN Chat;JAVA network programming;UDP; multi-thread</p><p><b> 目錄</b></p
12、><p><b> 摘要I</b></p><p> AbstractII</p><p><b> 第一章 前言1</b></p><p> 第二章 系統(tǒng)可行性分析2</p><p> 2.1 成本可行性分析2</p><p> 2
13、.2 技術(shù)可行性分析2</p><p> 第三章 需求分析3</p><p> 3.1 功能需求分析3</p><p> 3.2性能需求分析3</p><p> 3.3 系統(tǒng)主要技術(shù)分析3</p><p> 3.2.1 JAVA DatagramSocket3</p><p&g
14、t; 3.2.2 JAVA MulticastSocket4</p><p> 3.2.3 JAVA Swing5</p><p> 3.4 系統(tǒng)開發(fā)、運行環(huán)境分析5</p><p> 第四章 系統(tǒng)概要設(shè)計6</p><p> 4.1 系統(tǒng)功能模塊設(shè)計6</p><p> 4.2 系統(tǒng)數(shù)據(jù)流圖9
15、</p><p> 第五章 系統(tǒng)詳細(xì)設(shè)計10</p><p> 5.1 詳細(xì)設(shè)計概述10</p><p> 5.2 系統(tǒng)詳細(xì)設(shè)計10</p><p> 5.2.1登陸界面10</p><p> 5.2.2用戶主界面14</p><p> 5.2.3聊天界面16</p
16、><p> 5.2.4輔助工具類19</p><p> 第六章 系統(tǒng)實現(xiàn)21</p><p> 6.1 總體工程架構(gòu)的實現(xiàn)21</p><p> 6.2 具體功能實現(xiàn)21</p><p><b> 結(jié)論24</b></p><p><b> 參考
17、文獻(xiàn)25</b></p><p><b> 前言</b></p><p> 近年來,隨著全球信息化進(jìn)程的不斷發(fā)展,網(wǎng)絡(luò)也在飛速發(fā)展。出于高效、快速地處理各種事務(wù)的目的,越來越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來進(jìn)行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴(kuò)大,業(yè)務(wù)量的增加,在局域網(wǎng)上運行的應(yīng)
18、用越來越多,如知識庫、網(wǎng)絡(luò)會議、數(shù)據(jù)庫應(yīng)用和數(shù)據(jù)的同步與備份等,這些應(yīng)用對局域網(wǎng)的信息吞吐、處理能力的要求也越來越高。這些在企業(yè)內(nèi)部原有局域網(wǎng)設(shè)計之初未曾考慮到的新情況的出現(xiàn)使得局域網(wǎng)不堪重負(fù),容易發(fā)生信息阻塞,此時,局域網(wǎng)不但不能提高生產(chǎn)效率,反而成為企業(yè)發(fā)展的瓶頸。 </p><p> 為了解決上述矛盾,人們提出了許多方法。提升網(wǎng)絡(luò)帶寬及增加服務(wù)器的吞吐能力是解
19、決此矛盾的一種方法。然而,從企業(yè)運行的成本方面考慮,無論是單純地提升網(wǎng)絡(luò)帶寬或增加服務(wù)器的吞吐能力都不能從根本上解決局域網(wǎng)資源緊張的問題,對舊有局域網(wǎng)的大規(guī)模硬件改造反而會增加企業(yè)的負(fù)擔(dān)。</p><p> 我在本文中將討論一種基于DatagramSocket和MulticastSocket的局域網(wǎng)通信工具的設(shè)計與實現(xiàn)方法?;贒atagramSocket和MulticastSocket的局域網(wǎng)通信軟件可以為企
20、業(yè)原有的局域網(wǎng)提供一種良好,安全,快速的通信機(jī)制。它的實現(xiàn)無需對企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動,具有實現(xiàn)成本低廉的優(yōu)點,它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求。 </p><p> 基于DatagramSocket和MulticastSocket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實例之一,它很好地詮釋了Datagram
21、Socket和MulticastSocket通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實用價值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用服務(wù)器吞吐能力低,易于編程實現(xiàn)等優(yōu)點。 </p><p> 基于DatagramSocket和MulticastSocket的局域網(wǎng)通信軟件應(yīng)用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴(kuò)展以適應(yīng)新型的網(wǎng)絡(luò)應(yīng)用,如網(wǎng)絡(luò)教育,數(shù)據(jù)
22、影音傳輸?shù)龋瑩碛袕V泛的應(yīng)用前景。</p><p> 第二章 系統(tǒng)可行性分析</p><p> 可行性分析是基于客觀的、科學(xué)的,其在整個系統(tǒng)的設(shè)計與實現(xiàn)過程中有非常重要的意義,軟件可行性分析的目的是用合適的代價解決足夠的問題,其最終結(jié)果是對所設(shè)想的項目做出實施還是放棄。本局域網(wǎng)聊天系統(tǒng)將從成本和技術(shù)可行性進(jìn)行分析。</p><p> 2.1 成本可行性分析<
23、;/p><p> 因為本軟件只做開發(fā)學(xué)習(xí)使用,所以暫且不考慮經(jīng)濟(jì)成本及盈利問題。</p><p> 2.2 技術(shù)可行性分析</p><p> 首先我已經(jīng)搭建好開發(fā)所需要的軟硬件平臺,并進(jìn)行了合理而完善的需求分析,做好了充分的前期準(zhǔn)備工作,其次因為本程序的平臺將基于WINDOWS,將要使用網(wǎng)絡(luò)通信技術(shù),而WINDOWS有完善成熟的網(wǎng)絡(luò)通信接口,以及與VC開發(fā)環(huán)境的嚴(yán)
24、密契合能力,加之相類似的更大規(guī)模的INTERNET通信工具產(chǎn)品也已有例在先,所以這個程序的開發(fā)可行性在技術(shù)上是完全可行的。</p><p><b> 需求分析</b></p><p> 3.1 功能需求分析</p><p> 用戶端之間的信息發(fā)送,本程序需要實現(xiàn)的最基本的功能;</p><p> 當(dāng)有用戶下線后,
25、應(yīng)在所有在線的用戶的“在線用戶列表”中消掉下線人的信息記錄;</p><p> 在聊天是還應(yīng)提供一些使用的輔助功能,在本局域網(wǎng)的聊天軟件中,提供有字體設(shè)置、表情發(fā)送、文件發(fā)送、窗口抖動、消息記錄管理等常用功能,能夠滿足用戶的基本要求。</p><p><b> 3.2性能需求分析</b></p><p> 首先要求程序要完全可靠,可以應(yīng)付
26、種種由于系統(tǒng)問題產(chǎn)生的錯誤,比如初始網(wǎng)絡(luò)失敗,對方突然下線等。要求提前設(shè)想到類似的盡可能多的可能發(fā)生的事件,做出相應(yīng)的應(yīng)對措施,并向用戶提交簡單易懂清晰明白的提示信息。 </p><p> 程序要有良好的容錯性,當(dāng)用戶進(jìn)行非法操作時或者系統(tǒng)本身出現(xiàn)問題時要能以最好的方式退出程序,避免發(fā)生程序假死現(xiàn)象。 </p><p> 要求程序?qū)λ\行之系統(tǒng)的硬件條件要求盡可能低
27、,運行時內(nèi)存占用盡可能小,響應(yīng)速度要盡可能快。并且不發(fā)生內(nèi)存泄漏之類影響系統(tǒng)運行的錯誤事件。并且要求易于維護(hù)及擴(kuò)展。所以應(yīng)該采用模塊化開發(fā),各個模塊之間不要有太多的聯(lián)系,以免維護(hù)困難。</p><p> 3.3 系統(tǒng)主要技術(shù)分析</p><p> 3.2.1 JAVA DatagramSocket</p><p><b> 1.基本概念:</b
28、></p><p> a.DatagramPacket與DatagramSocket位于java.net包中</p><p> b.DatagramPacket表示存放數(shù)據(jù)的數(shù)據(jù)報,DatagramSocket表示接受或發(fā)送數(shù)據(jù)報的套接字</p><p> c.由這兩個類所有構(gòu)成的網(wǎng)絡(luò)鏈接是基于UDP協(xié)議,是一種不可靠的協(xié)議。</p>&l
29、t;p> 注:為了解決UDP協(xié)議的不可靠問題,在軟件的聊天的文件傳輸功能部分自定義了一套接收數(shù)據(jù)的規(guī)則,使得通過UDP協(xié)議傳輸文件不會出錯。</p><p><b> 2.使用方法:</b></p><p> DatagramSocket():創(chuàng)建實例。通常用于客戶端編程,它并沒有特定監(jiān)聽的端口,僅僅使用一個臨時的。 DatagramSocke
30、t(int port):創(chuàng)建實例,并固定監(jiān)聽Port端口的報文。 DatagramSocket(int port, InetAddress localAddr):這是個非常有用的構(gòu)建器,當(dāng)一臺機(jī)器擁有多于一個IP地址的時候,由它創(chuàng)建的實例僅僅接收來自LocalAddr的報文</p><p> receive(DatagramPacket d):接收數(shù)據(jù)報文到d中。receive方法產(chǎn)生一個“阻塞”。
31、 send(DatagramPacket d):發(fā)送報文d到目的地。 setSoTimeout(int timeout):設(shè)置超時時間,單位為毫秒。 close():關(guān)閉DatagramSocket。在應(yīng)用程序退出的時候,通常會主動釋放資源,關(guān)閉Socket,但是由于異常地退出可能造成資源無法回收。所以,應(yīng)該在程序完成時,主動使用此方法關(guān)閉Socket,或在捕獲到異常拋出后關(guān)閉Sock。</p&
32、gt;<p> 3.2.2 JAVA MulticastSocket</p><p> 多播數(shù)據(jù)報套接字類用于發(fā)送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機(jī)的“組”的附加功能。</p><p> 多播組通過 D 類 IP 地址和標(biāo)準(zhǔn) UDP 端口號指定。D 類 IP
33、 地址在 224.0.0.0 和 239.255.255.255 的范圍內(nèi)(包括兩者)。地址 224.0.0.0 被保留,不應(yīng)使用。</p><p> 可以通過首先使用所需端口創(chuàng)建 MulticastSocket,然后調(diào)用 joinGroup(InetAddress groupAddr) 方法來加入多播組。將消息發(fā)送到多播組時,該主機(jī)和端口的所有預(yù)定接
34、收者都將接收到消息(在數(shù)據(jù)包的生存時間范圍內(nèi),請參閱下文)。套接字不必成為多播組的成員即可向其發(fā)送消息。</p><p> 當(dāng)套接字預(yù)定多播組/端口時,它將接收由該組/端口的其他主機(jī)發(fā)送的數(shù)據(jù)報,像該組和端口的所有其他成員一樣。套接字通過 leaveGroup(InetAddress addr) 方法放棄組中的成員資格。多個 MulticastSocket 可以同時預(yù)定多播組和端口,并且都會接收到組數(shù)
35、據(jù)報。</p><p> 同時,不允許 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>
36、<p> 互聯(lián)網(wǎng)基礎(chǔ)類(IFC) 是網(wǎng)景公司最初為Java開發(fā)的圖形庫,第一次發(fā)布于1996年12月16日。</p><p> 在1997年4月2日,太陽微系統(tǒng)公司 和 網(wǎng)景公司宣稱他們要將IFC和其他技術(shù)合并形成 Java基礎(chǔ)類。作為IFC最初提供組件的附加品, Swing引進(jìn)了一個機(jī)理:在不改變大量的程序代碼前提下允許程序中每個組件觀感的變化。支持可更換觀感技術(shù)的引入允許Swing組件在模擬
37、原生組件外觀的同時又保持了平臺獨立的優(yōu)點。</p><p> Swing 是一個為Java設(shè)計的GUI工具包。 Swing 是 JAVA API 的一部分。 Swing 包括了圖形用戶界面 (GUI) 器件 如:文本框,按鈕,分隔窗格和表。</p><p> SWING 提供許多比AWT更好的屏幕顯示元素。它們用純Java寫成,所以同Java本身一樣可以跨平臺運行,
38、這一點不像AWT。 它們是JFC的一部分。 它們支持可更換的觀感和主題(各種操作系統(tǒng)默認(rèn)的特有主題),然而不是真的使用原生平臺提供的設(shè)備,而是僅僅在表面上模仿它們。這意味著你可以在任意平臺上使用JAVA支持的任意觀感。 輕量級元件的缺點則是執(zhí)行速度較慢,優(yōu)點就是可以在所有平臺上采用統(tǒng)一的行為。</p><p> 3.4 系統(tǒng)開發(fā)、運行環(huán)境分析</p><p> 操作系統(tǒng):Microso
39、ft Windows 7</p><p> 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基礎(chǔ)的類庫。</p&
40、gt;<p> 開發(fā)工具:Eclipse 4.4.0 或更高版本</p><p> Eclipse企業(yè)級工作平臺(Eclipse Java EE IDE for Web Developers,簡稱Eclipse),利用它我們可以在數(shù)據(jù)庫和JavaEE的開發(fā)、發(fā)布,以及應(yīng)用程序服務(wù)器的整合方面極大的提高工作效率。它是功能豐富的JavaEE集成開發(fā)環(huán)境,包括了完備的編碼、調(diào)試、測試和發(fā)布功能,完整支
41、持HTML、Struts、JSF、CSS、Javascript、SQL、Hibernate。</p><p> 第四章 系統(tǒng)概要設(shè)計</p><p> 4.1 系統(tǒng)功能模塊設(shè)計</p><p> 從模擬用戶的角度進(jìn)行分析,對于一個局域網(wǎng)聊天系統(tǒng),首先要確定其功能是什么,也就是用戶想要系統(tǒng)做什么工作。經(jīng)過對系統(tǒng)的可行性分析、需求分析、技術(shù)分析后,結(jié)合調(diào)研的情況及
42、用戶的使用需求,確定了本系統(tǒng)的功能模塊如下圖所示。</p><p> 圖4.1 系統(tǒng)功能模塊圖</p><p><b> 功能模塊介紹:</b></p><p><b> 用戶登陸</b></p><p> 用戶登陸時使用,提供昵稱的輸入和用戶頭像的選擇等功能。用戶登陸界面共分為五部分如下
43、圖所示:</p><p><b> ?、偬崾拘畔@示區(qū)域</b></p><p><b> ?、谳斎胗脩絷欠Q區(qū)域</b></p><p><b> ?、圻x擇頭像的列表</b></p><p><b> ?、茴^像展示區(qū)</b></p><
44、p><b> ?、莸侨胪顺霭粹o</b></p><p><b> 圖4.2 登陸界面</b></p><p><b> 用戶主界面</b></p><p> 用戶主界面是顯示所有在線用戶的界面,界面分為三塊:</p><p> ?、亠@示本客戶端的登入用戶的頭像和昵稱
45、</p><p> ②自己制作的最小化和關(guān)閉的圖標(biāo),為了符合程序風(fēng)格,去掉了windows的原有框架,進(jìn)行了適當(dāng)?shù)拿阑?lt;/p><p> ?、蹖崟r顯示局域網(wǎng)聊天的在線用戶列表,每一項都會顯示一個在線用戶的頭像和昵稱</p><p> ?、軡L動顯示當(dāng)前的在線用戶數(shù)目,當(dāng)在線用戶較多時,可以讓用戶直觀地看到在線的人數(shù)</p><p> 圖4.
46、3 用戶主界面</p><p><b> 聊天界面</b></p><p> 聊天界面是用戶之間聊天使用的界面,界面共分為六部分:</p><p> ?、亠@示對象的頭像和昵稱</p><p><b> ?、陲@示聊天記錄</b></p><p> ?、哿奶燧o助功能欄,從左到
47、右依次為:文字屬性、表情、窗口抖動、文件發(fā)送和聊天記錄管理</p><p><b> ④用戶輸入聊天信息</b></p><p> ?、莅l(fā)送按鈕和清屏按鈕,清屏按鈕用于清除聊天界面的聊天信息</p><p> ⑥顯示對方的放大頭像和登陸信息</p><p><b> 圖4.4 聊天界面</b>
48、</p><p> 4.2 系統(tǒng)數(shù)據(jù)流圖</p><p> 圖4.5 系統(tǒng)數(shù)據(jù)流圖</p><p> 第五章 系統(tǒng)詳細(xì)設(shè)計</p><p> 5.1 詳細(xì)設(shè)計概述</p><p> 軟件詳細(xì)設(shè)計的任務(wù)是,是為軟件結(jié)構(gòu)圖中的每個模塊確定所采用的算法和塊內(nèi)數(shù)據(jù)結(jié)構(gòu),用某種選定的表達(dá)工具給出清晰的描述,表達(dá)工具可以
49、自由選擇,但工具必須具有描述過程細(xì)節(jié)的能力,而且能夠有利于程序員在編程時便于直接翻譯成程序設(shè)計語言的源程序。</p><p> 程序流程圖、UML圖等都是完成詳細(xì)設(shè)計的工具,選擇合適的工具并且正確地使用是十分重要的。</p><p> 在概要設(shè)計階段,已經(jīng)確定了軟件系統(tǒng)的總體結(jié)構(gòu),給出了軟件系統(tǒng)中各個組成模塊的功能和模塊間的接口。作為軟件設(shè)計的第二步,軟件詳細(xì)設(shè)計就是在軟件概要設(shè)計的基
50、礎(chǔ)上,考慮如何實現(xiàn)定義的軟件系統(tǒng),直到對系統(tǒng)中的每個模塊給出了足夠詳細(xì)的過程描述。在軟件詳細(xì)設(shè)計以后,程序員將仍舊根據(jù)詳細(xì)設(shè)計的過程編寫出實際的程序代碼。因此,軟件詳細(xì)設(shè)計的結(jié)果基本上決定了最終的程序代碼質(zhì)量。</p><p> 5.2 系統(tǒng)詳細(xì)設(shè)計</p><p><b> 5.2.1登陸界面</b></p><p> 登陸局域網(wǎng)聊天程
51、序共涉及到三個類:LanTalk類、LoginFrame類、和ComUtil類。</p><p> LanTalk類是程序的主程序;</p><p> LoginFrame類是程序的登陸界面程序;</p><p> ComUtil類是程序的通信類,當(dāng)用戶登陸后,ComUtil類會實例化一個MulticastSocket和一個DatagramSocket,前者用
52、于向固定廣播地址發(fā)送自己的在線信息和實現(xiàn)在線用戶之間的群聊功能,后者用于提供兩個用戶之間的私聊功能。</p><p> 登陸局域網(wǎng)聊天軟件時需要運行的是LanTalk類,LanTalk類會實例化LoginFrame類初始化登陸界面,而當(dāng)?shù)顷懶畔⑻钔甏_定登陸后,LoginFrame又會初始化ComUtil類提供通信功能,三者的關(guān)系和UML圖如下所示:</p><p> (注:由于受圖像大
53、小限制,UML圖并沒有畫出監(jiān)聽器的類圖)</p><p> 圖5.1 登陸界面UML圖</p><p><b> 登陸界面核心代碼:</b></p><p> ComUtil的廣播在線信息主代碼</p><p> public void broadCast(String msg)</p><p
54、><b> {</b></p><p><b> try</b></p><p><b> {</b></p><p> //將msg字符串轉(zhuǎn)換字節(jié)數(shù)組</p><p> byte[] buff = msg.getBytes();</p><
55、p> //設(shè)置發(fā)送用的DatagramPacket里的字節(jié)數(shù)據(jù)</p><p> outPacket.setData(buff);</p><p><b> //發(fā)送數(shù)據(jù)報</b></p><p> singleSocket.send(outPacket);</p><p><b> }<
56、/b></p><p><b> //捕捉異常</b></p><p> catch (IOException ex)</p><p><b> {</b></p><p> ex.printStackTrace();</p><p> if (socket
57、!= null)</p><p><b> {</b></p><p> //關(guān)閉該Socket對象</p><p> socket.close();</p><p><b> }</b></p><p> JOptionPane.showMessageDialog
58、(null, </p><p> "發(fā)送信息異常,請確認(rèn)30000端口空閑,且網(wǎng)絡(luò)連接正常!"</p><p> , "網(wǎng)絡(luò)異常", JOptionPane.ERROR_MESSAGE);</p><p> System.exit(1);</p><p><b> }</b>
59、;</p><p><b> }</b></p><p> //持續(xù)讀取MulticastSocket的線程</p><p> class ReadBroad extends Thread</p><p><b> {</b></p><p> public voi
60、d run()</p><p><b> {</b></p><p> while (true)</p><p><b> {</b></p><p><b> try</b></p><p><b> {</b><
61、/p><p> //讀取Socket中的數(shù)據(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.ge
62、tLength());</p><p> //讀到的內(nèi)容是在線信息</p><p> if (msg.startsWith(MyProtocol.PRESENCE)</p><p> && msg.endsWith(MyProtocol.PRESENCE))</p><p><b> {</b>&
63、lt;/p><p> String userMsg = msg.substring(2 , msg.length() - 2);</p><p> String[] userInfo = userMsg.split(MyProtocol.SPLITTER);</p><p> UserInfo user = new UserInfo(userInfo[1] , u
64、serInfo[0] , userInfo[2],</p><p> inPacket.getSocketAddress(), 0);</p><p> //控制是否需要添加該用戶的旗標(biāo)</p><p> boolean addFlag = true;</p><p> ArrayList<Integer> delList
65、 = new ArrayList<Integer>();</p><p> //遍歷系統(tǒng)中已有的所有用戶,該循環(huán)必須循環(huán)完成</p><p> for (int i = 1 ; i < lanTalk.getUserNum() ; i++ )</p><p><b> {</b></p><p>
66、 UserInfo current = lanTalk.getUser(i);</p><p> //將所有用戶失去聯(lián)系的次數(shù)加1</p><p> current.setLost(current.getLost() + 1);</p><p> //如果該信息由指定用戶發(fā)送過來</p><p> if(current.getAdd
67、ress() == null </p><p> && current.getName().equals(user.getName())</p><p> && current.getloginTime().equals(user.getloginTime()))</p><p><b> {</b><
68、;/p><p> current.setAddress(user.getAddress());</p><p> current.setLost(0);</p><p> addFlag = false;</p><p><b> }</b></p><p> else if (curren
69、t.equals(user))</p><p><b> {</b></p><p> current.setLost(0);</p><p> //設(shè)置該用戶無需添加</p><p> addFlag = false;</p><p><b> }</b><
70、/p><p> if (current.getLost() > lanTalk.getUserNum() * 2)</p><p><b> {</b></p><p> delList.add(i);</p><p><b> }</b></p><p><
71、b> }</b></p><p> //刪除delList中的所有索引對應(yīng)的用戶</p><p> for (int i = 0; i < delList.size() ; i++)</p><p><b> {</b></p><p> lanTalk.removeUser(delLi
72、st.get(i));</p><p><b> }</b></p><p> if (addFlag)</p><p><b> {</b></p><p><b> //添加新用戶</b></p><p> lanTalk.addUser(
73、user);</p><p><b> }</b></p><p><b> }</b></p><p> //讀到的內(nèi)容是公聊信息</p><p><b> else</b></p><p><b> {</b&g
74、t;</p><p><b> //處理讀到的信息</b></p><p><b> try {</b></p><p> lanTalk.processMsg(inPacket , false);</p><p> } catch (Exception e) {</p>&l
75、t;p> // TODO Auto-generated catch block</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></
76、p><p><b> //捕捉異常</b></p><p> catch (IOException ex)</p><p><b> {</b></p><p> ex.printStackTrace();</p><p> if (socket != null)<
77、;/p><p><b> {</b></p><p> //關(guān)閉該Socket對象</p><p> socket.close();</p><p><b> }</b></p><p> JOptionPane.showMessageDialog(null, <
78、/p><p> "接收信息異常,請確認(rèn)30000端口空閑,且網(wǎng)絡(luò)連接正常!"</p><p> , "網(wǎng)絡(luò)異常", JOptionPane.ERROR_MESSAGE);</p><p> System.exit(1);</p><p><b> }</b></p>
79、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 5.2.2用戶主界面</p><p> 用戶
80、主界面包含三個類,LanTalk類用于顯示主界面在線用戶列表,UserInfo類是封裝用戶信息的類,ShowOnline類是用于顯示在線用戶人數(shù)的類。</p><p> 三者的關(guān)系和UML圖如下:</p><p> 圖5.2 用戶主界面UML圖</p><p> 用戶主界面核心代碼:</p><p><b> 顯示在線人數(shù)&
81、lt;/b></p><p> public ShowOnline(LanTalk lanTalk)</p><p><b> {</b></p><p> this.lanTalk = lanTalk;</p><p> this.x = 0;</p><p> this.cha
82、ngepx = 1;</p><p> timer = new Timer(200, </p><p> new ActionListener()</p><p><b> {</b></p><p> public void actionPerformed(ActionEvent e)</p>&
83、lt;p><b> {</b></p><p><b> update();</b></p><p><b> }</b></p><p><b> });</b></p><p> timer.start();</p>&l
84、t;p><b> }</b></p><p> public void update()</p><p><b> {</b></p><p> repaint();</p><p><b> }</b></p><p> public
85、 void paintComponent(Graphics g)</p><p><b> {</b></p><p> super.paintComponent(g);</p><p> g.setColor(color);</p><p> g.setFont(new Font("華文新魏"
86、; , Font.BOLD , 15));</p><p> msg = "當(dāng)前有 " + (lanTalk.getUserNum() - 1) + " 人在線";</p><p> FontMetrics fm = g.getFontMetrics();</p><p> int stringwidth = fm.st
87、ringWidth(msg);</p><p> int stringascent = fm.getAscent();</p><p> if(changepx == 1 && x + changepx + stringwidth > getWidth())</p><p><b> {</b></p>
88、<p> changepx = -1;</p><p> x += changepx;</p><p><b> }</b></p><p><b> else</b></p><p> x += changepx;</p><p> if(chang
89、epx == -1 && x + changepx < 0)</p><p><b> {</b></p><p> changepx = 1;</p><p> x += changepx;</p><p><b> }</b></p><p>
90、;<b> else</b></p><p> x += changepx;</p><p> g.drawString(msg, x, getHeight() - stringascent / 2);</p><p><b> }</b></p><p><b> 5.2.3聊
91、天界面</b></p><p> 聊天界面包含六個類:ChatFrame類、FontJWindow類、PicsJWindow類RecordJWindow類、FileReceiveJPanel類和FileSendJPanel類。</p><p> ChatFrame類是構(gòu)建聊天界面主框架的類,F(xiàn)ontJWindow類是用于設(shè)置字體格式的類,PicsJWindow類是用于顯示表
92、情的類,RecordJWindow類是用于記錄用戶聊天信息的類,F(xiàn)ileReceiveJPanel類和FileSendJPanel類是用于文件發(fā)送和接收的類。</p><p> (注:由于受圖像大小限制,UML圖并沒有畫出監(jiān)聽器的類圖)</p><p> 圖5.3 聊天界面UML圖1</p><p> 圖5.4 聊天界面UML圖2</p><
93、;p><b> 聊天界面核心代碼:</b></p><p><b> 字體設(shè)置關(guān)鍵代碼</b></p><p> class FontListener implements ActionListener</p><p><b> {</b></p><p> p
94、ublic void actionPerformed(ActionEvent e)</p><p><b> {</b></p><p> if(e.getSource() == jcbFontName)</p><p><b> {</b></p><p> String fontName
95、 = (String)jcbFontName.getSelectedItem();</p><p> String[] userFont = (owner.getSelf().getFont()).split(MyProtocol.FONT);</p><p> Font newFont = new Font(fontName, Integer.parseInt(userFont[1]
96、), Integer.parseInt(userFont[2]));</p><p> owner.getSelf().setFont(newFont);</p><p> owner.getInputPane().setFont(newFont);</p><p><b> }</b></p><p> els
97、e if(e.getSource() == jcbFontSize)</p><p><b> {</b></p><p> int fontSize = (Integer)jcbFontSize.getSelectedItem();</p><p> String[] userFont = (owner.getSelf().getFon
98、t()).split(MyProtocol.FONT);</p><p> Font newFont = new Font(userFont[0], Integer.parseInt(userFont[1]), fontSize);</p><p> owner.getSelf().setFont(newFont);</p><p> owner.getInp
99、utPane().setFont(newFont);</p><p><b> }</b></p><p> else if(e.getSource() == jbBold)</p><p><b> {</b></p><p> String[] userFont = (owner.get
100、Self().getFont()).split(MyProtocol.FONT);</p><p> Font newFont = null;</p><p> if(jbBold.getIcon().toString().equals("src/font_image/bold_normal.png"))</p><p><b>
101、 {</b></p><p> newFont = new Font(userFont[0], Font.BOLD, Integer.parseInt(userFont[2]));</p><p> jbBold.setIcon(new ImageIcon("src/font_image/bold_down.png"));</p><
102、p> jbItalic.setIcon(new ImageIcon("src/font_image/italic_normal.png"));</p><p> jbPlain.setIcon(new ImageIcon("src/font_image/plain_normal.png"));</p><p><b> }<
103、;/b></p><p><b> else</b></p><p><b> {</b></p><p> newFont = new Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p> jbB
104、old.setIcon(new ImageIcon("src/font_image/bold_normal.png"));</p><p><b> }</b></p><p> owner.getSelf().setFont(newFont);</p><p> owner.getInputPane().setFon
105、t(newFont);</p><p><b> }</b></p><p> else if(e.getSource() == jbItalic)</p><p><b> {</b></p><p> String[] userFont = (owner.getSelf().getFon
106、t()).split(MyProtocol.FONT);</p><p> Font newFont = null;</p><p> if(jbItalic.getIcon().toString().equals("src/font_image/italic_normal.png"))</p><p><b> {</b&
107、gt;</p><p> newFont = new Font(userFont[0], Font.ITALIC, Integer.parseInt(userFont[2]));</p><p> jbBold.setIcon(new ImageIcon("src/font_image/bold_normal.png"));</p><p>
108、 jbItalic.setIcon(new ImageIcon("src/font_image/italic_down.png"));</p><p> jbPlain.setIcon(new ImageIcon("src/font_image/plain_normal.png"));</p><p><b> }</b>
109、</p><p><b> else</b></p><p><b> {</b></p><p> newFont = new Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p> jbItalic.s
110、etIcon(new ImageIcon("src/font_image/italic_normal.png"));</p><p><b> }</b></p><p> owner.getSelf().setFont(newFont);</p><p> owner.getInputPane().setFont(n
111、ewFont);</p><p><b> }</b></p><p> else if(e.getSource() == jbPlain)</p><p><b> {</b></p><p> String[] userFont = (owner.getSelf().getFont())
112、.split(MyProtocol.FONT);</p><p> Font newFont = null;</p><p> if(jbPlain.getIcon().toString().equals("src/font_image/plain_normal.png"))</p><p><b> {</b><
113、;/p><p> newFont = new Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p> jbBold.setIcon(new ImageIcon("src/font_image/bold_normal.png"));</p><p> jbIta
114、lic.setIcon(new ImageIcon("src/font_image/italic_normal.png"));</p><p> jbPlain.setIcon(new ImageIcon("src/font_image/plain_down.png"));</p><p><b> }</b></p&
115、gt;<p><b> else</b></p><p><b> {</b></p><p> newFont = new Font(userFont[0], Font.PLAIN, Integer.parseInt(userFont[2]));</p><p> jbPlain.setIcon(n
116、ew ImageIcon("src/font_image/plain_normal.png"));</p><p><b> }</b></p><p> owner.getSelf().setFont(newFont);</p><p> owner.getInputPane().setFont(newFont);&
117、lt;/p><p><b> }</b></p><p> else if(e.getSource() == jbColor)</p><p><b> {</b></p><p> Color color = JColorChooser.showDialog(getObj(), "請
118、選擇一種顏色", owner.getSelf().getColor());</p><p> if(color != null)</p><p><b> {</b></p><p> owner.getSelf().setColor(color);</p><p> owner.getInputPan
119、e().setForeground(color);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
120、5.2.4輔助工具類</p><p> 輔助類包括MyProtocol類和PicsIcon類,其中MyProtocol類用于提供程序需要的一些協(xié)議字段,而PicsIcon類則是擴(kuò)展自ImageIcon類用于封裝表情,便于表情的提取。</p><p> 圖5.5 輔助類UML圖</p><p> MyProtocol類核心代碼:</p><p
121、> public interface MyProtocol</p><p><b> {</b></p><p> String PRESENCE = "@@"; //在線信息廣播</p><p> String SPLITTER = "&&"; //登陸信息分割&l
122、t;/p><p> String FONT = "~~"; //字體分割</p><p> String SENDFONT = "$$"; //發(fā)送用戶的字體設(shè)置</p><p> String EXP_SPLIT = "!!"; //表情分割</p><p&
123、gt; String EXP_DETAIL = "%%"; //表情定位分割</p><p> String P_SPLIT = "##"; //發(fā)送區(qū)域分隔符</p><p> String SHAKE = "@#"; //震動信息標(biāo)志</p><p> String FILE =
124、"@&"; //文件標(biāo)志</p><p> String FILE_REFUSE = "NOSEND"; //拒絕接收文件</p><p> String FILE_END = "FILE_END"; //文件結(jié)束標(biāo)志</p><p><b> }</b></
125、p><p><b> 第六章 系統(tǒng)實現(xiàn)</b></p><p> 6.1 總體工程架構(gòu)的實現(xiàn)</p><p> 圖6.1 工程架構(gòu)圖</p><p> 6.2 具體功能實現(xiàn)</p><p><b> 用戶界面登陸如下:</b></p><p>
126、 圖6.2 用戶登陸界面</p><p><b> 用戶主界面如下:</b></p><p> 圖6.3 用戶主界面</p><p><b> 用戶主界面如下:</b></p><p> 圖6.4 用戶聊天界面</p><p> 消息記錄界面如下,消息記錄界面提供消
127、息清除和消息導(dǎo)出功能:</p><p> 圖6.5 用戶聊天界面</p><p> 表情界面和字體設(shè)置界面如下:</p><p> 圖6.6 字體設(shè)置界面</p><p><b> 圖6.7 表情界面</b></p><p><b> 結(jié)論</b></p>
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于java的局域網(wǎng)聊天系統(tǒng)-課程設(shè)計報告
- 局域網(wǎng)聊天程序java課程設(shè)計
- 基于java的局域網(wǎng)聊天系統(tǒng)
- java課程設(shè)計--局域網(wǎng)聊天程序的設(shè)計與實現(xiàn)
- java課程設(shè)計---局域網(wǎng)聊天程序的設(shè)計與實現(xiàn)
- 軟件課程設(shè)計報告--局域網(wǎng)聊天程序
- 基于java局域網(wǎng)聊天軟件
- java課程設(shè)計---局域網(wǎng)聊天程序的設(shè)計與實現(xiàn)
- 軟件課程設(shè)計---局域網(wǎng)聊天程序
- 課程設(shè)計--基于qt的局域網(wǎng)聊天室
- 基于java局域網(wǎng)聊天軟件畢業(yè)論文
- vc++面向?qū)ο笳n程設(shè)計報告---局域網(wǎng)聊天程序
- 基于java局域網(wǎng)聊天程序設(shè)計與實現(xiàn)
- 基于java局域網(wǎng)聊天程序設(shè)計與實現(xiàn)
- java局域網(wǎng)聊天軟件大學(xué)設(shè)計好sqlserver
- 畢業(yè)設(shè)計--局域網(wǎng)聊天系統(tǒng)
- java畢業(yè)論文---局域網(wǎng)聊天軟件
- 局域網(wǎng)聊天系統(tǒng)畢業(yè)設(shè)計
- 基于c++的局域網(wǎng)聊天系統(tǒng)【開題報告】
- java局域網(wǎng)聊天室系統(tǒng)畢業(yè)論文
評論
0/150
提交評論