版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> CURRICULUM DESIGN REPORT</p><p> ?。?014 —2015 年)</p><p> 題 目 基于JAVA的局域網(wǎng)聊天系統(tǒng)開發(fā)
2、 </p><p> 學(xué) 院: 信息工程學(xué)院 系 計(jì)算機(jī)科學(xué)與技術(shù)</p><p> 專業(yè)班級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)xxx班 </p><p> 學(xué)生姓名: 學(xué)號(hào): </p><p> 指導(dǎo)教師: 職稱:
3、 </p><p> 起訖日期: </p><p> 基于JAVA的局域網(wǎng)聊天系統(tǒng)開發(fā)</p><p><b> 摘要</b></p><p> 隨著計(jì)算機(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é)校,都是先以一個(gè)統(tǒng)一的局域網(wǎng)聯(lián)結(jié)在一起,再分別接入INTERNET.因此基于局域網(wǎng)的即時(shí)通信工具,就這樣應(yīng)運(yùn)而生了。本文利用JAVA的UDP編程以及SWING圖形界面編程技術(shù),在WINDOWS平臺(tái)上實(shí)現(xiàn)了具有美觀圖形界面的局域網(wǎng)聊天軟件.</p><p> 在本實(shí)現(xiàn)內(nèi)將客戶端和服務(wù)端綜合在一個(gè)程序之內(nèi),用多線程實(shí)現(xiàn)不同的并行任務(wù)。并模仿國(guó)內(nèi)
5、的QQ進(jìn)行了人性化的界面設(shè)計(jì),使用起來更加簡(jiǎn)單方便,并且功能十分合理、實(shí)用。</p><p> 通過本局域網(wǎng)聊天軟件可以實(shí)現(xiàn)一對(duì)一、一對(duì)多的聊天,可以實(shí)現(xiàn)不同用戶不同的文字字體、風(fēng)格、大小、顏色的發(fā)送和顯示,提供發(fā)送表情、文件、好友間的抖動(dòng)提示以及聊天記錄的管理等功能。</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ā)、運(yùn)行環(huán)境分析5</p><p> 第四章 系統(tǒng)概要設(shè)計(jì)6</p><p> 4.1 系統(tǒng)功能模塊設(shè)計(jì)6</p><p> 4.2 系統(tǒng)數(shù)據(jù)流圖9
15、</p><p> 第五章 系統(tǒng)詳細(xì)設(shè)計(jì)10</p><p> 5.1 詳細(xì)設(shè)計(jì)概述10</p><p> 5.2 系統(tǒng)詳細(xì)設(shè)計(jì)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)實(shí)現(xiàn)21</p><p> 6.1 總體工程架構(gòu)的實(shí)現(xiàn)21</p><p> 6.2 具體功能實(shí)現(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è)得以簡(jiǎn)化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴(kuò)大,業(yè)務(wù)量的增加,在局域網(wǎng)上運(yùn)行的應(yīng)
18、用越來越多,如知識(shí)庫、網(wǎng)絡(luò)會(huì)議、數(shù)據(jù)庫應(yīng)用和數(shù)據(jù)的同步與備份等,這些應(yīng)用對(duì)局域網(wǎng)的信息吞吐、處理能力的要求也越來越高。這些在企業(yè)內(nèi)部原有局域網(wǎng)設(shè)計(jì)之初未曾考慮到的新情況的出現(xiàn)使得局域網(wǎng)不堪重負(fù),容易發(fā)生信息阻塞,此時(shí),局域網(wǎng)不但不能提高生產(chǎn)效率,反而成為企業(yè)發(fā)展的瓶頸。 </p><p> 為了解決上述矛盾,人們提出了許多方法。提升網(wǎng)絡(luò)帶寬及增加服務(wù)器的吞吐能力是解
19、決此矛盾的一種方法。然而,從企業(yè)運(yùn)行的成本方面考慮,無論是單純地提升網(wǎng)絡(luò)帶寬或增加服務(wù)器的吞吐能力都不能從根本上解決局域網(wǎng)資源緊張的問題,對(duì)舊有局域網(wǎng)的大規(guī)模硬件改造反而會(huì)增加企業(yè)的負(fù)擔(dān)。</p><p> 我在本文中將討論一種基于DatagramSocket和MulticastSocket的局域網(wǎng)通信工具的設(shè)計(jì)與實(shí)現(xiàn)方法?;贒atagramSocket和MulticastSocket的局域網(wǎng)通信軟件可以為企
20、業(yè)原有的局域網(wǎng)提供一種良好,安全,快速的通信機(jī)制。它的實(shí)現(xiàn)無需對(duì)企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動(dòng),具有實(shí)現(xiàn)成本低廉的優(yōu)點(diǎn),它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求。 </p><p> 基于DatagramSocket和MulticastSocket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實(shí)例之一,它很好地詮釋了Datagram
21、Socket和MulticastSocket通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實(shí)用價(jià)值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用服務(wù)器吞吐能力低,易于編程實(shí)現(xiàn)等優(yōu)點(diǎn)。 </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ù)?,擁有廣泛的應(yīng)用前景。</p><p> 第二章 系統(tǒng)可行性分析</p><p> 可行性分析是基于客觀的、科學(xué)的,其在整個(gè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)過程中有非常重要的意義,軟件可行性分析的目的是用合適的代價(jià)解決足夠的問題,其最終結(jié)果是對(duì)所設(shè)想的項(xiàng)目做出實(shí)施還是放棄。本局域網(wǎng)聊天系統(tǒng)將從成本和技術(shù)可行性進(jìn)行分析。</p><p> 2.1 成本可行性分析<
23、;/p><p> 因?yàn)楸拒浖蛔鲩_發(fā)學(xué)習(xí)使用,所以暫且不考慮經(jīng)濟(jì)成本及盈利問題。</p><p> 2.2 技術(shù)可行性分析</p><p> 首先我已經(jīng)搭建好開發(fā)所需要的軟硬件平臺(tái),并進(jìn)行了合理而完善的需求分析,做好了充分的前期準(zhǔn)備工作,其次因?yàn)楸境绦虻钠脚_(tái)將基于WINDOWS,將要使用網(wǎng)絡(luò)通信技術(shù),而WINDOWS有完善成熟的網(wǎng)絡(luò)通信接口,以及與VC開發(fā)環(huán)境的嚴(yán)
24、密契合能力,加之相類似的更大規(guī)模的INTERNET通信工具產(chǎn)品也已有例在先,所以這個(gè)程序的開發(fā)可行性在技術(shù)上是完全可行的。</p><p><b> 需求分析</b></p><p> 3.1 功能需求分析</p><p> 用戶端之間的信息發(fā)送,本程序需要實(shí)現(xiàn)的最基本的功能;</p><p> 當(dāng)有用戶下線后,
25、應(yīng)在所有在線的用戶的“在線用戶列表”中消掉下線人的信息記錄;</p><p> 在聊天是還應(yīng)提供一些使用的輔助功能,在本局域網(wǎng)的聊天軟件中,提供有字體設(shè)置、表情發(fā)送、文件發(fā)送、窗口抖動(dòng)、消息記錄管理等常用功能,能夠滿足用戶的基本要求。</p><p><b> 3.2性能需求分析</b></p><p> 首先要求程序要完全可靠,可以應(yīng)付
26、種種由于系統(tǒng)問題產(chǎn)生的錯(cuò)誤,比如初始網(wǎng)絡(luò)失敗,對(duì)方突然下線等。要求提前設(shè)想到類似的盡可能多的可能發(fā)生的事件,做出相應(yīng)的應(yīng)對(duì)措施,并向用戶提交簡(jiǎn)單易懂清晰明白的提示信息。 </p><p> 程序要有良好的容錯(cuò)性,當(dāng)用戶進(jìn)行非法操作時(shí)或者系統(tǒng)本身出現(xiàn)問題時(shí)要能以最好的方式退出程序,避免發(fā)生程序假死現(xiàn)象。 </p><p> 要求程序?qū)λ\(yùn)行之系統(tǒng)的硬件條件要求盡可能低
27、,運(yùn)行時(shí)內(nèi)存占用盡可能小,響應(yīng)速度要盡可能快。并且不發(fā)生內(nèi)存泄漏之類影響系統(tǒng)運(yùn)行的錯(cuò)誤事件。并且要求易于維護(hù)及擴(kuò)展。所以應(yīng)該采用模塊化開發(fā),各個(gè)模塊之間不要有太多的聯(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ù)報(bào),DatagramSocket表示接受或發(fā)送數(shù)據(jù)報(bào)的套接字</p><p> c.由這兩個(gè)類所有構(gòu)成的網(wǎng)絡(luò)鏈接是基于UDP協(xié)議,是一種不可靠的協(xié)議。</p>&l
29、t;p> 注:為了解決UDP協(xié)議的不可靠問題,在軟件的聊天的文件傳輸功能部分自定義了一套接收數(shù)據(jù)的規(guī)則,使得通過UDP協(xié)議傳輸文件不會(huì)出錯(cuò)。</p><p><b> 2.使用方法:</b></p><p> DatagramSocket():創(chuàng)建實(shí)例。通常用于客戶端編程,它并沒有特定監(jiān)聽的端口,僅僅使用一個(gè)臨時(shí)的。 DatagramSocke
30、t(int port):創(chuàng)建實(shí)例,并固定監(jiān)聽Port端口的報(bào)文。 DatagramSocket(int port, InetAddress localAddr):這是個(gè)非常有用的構(gòu)建器,當(dāng)一臺(tái)機(jī)器擁有多于一個(gè)IP地址的時(shí)候,由它創(chuàng)建的實(shí)例僅僅接收來自LocalAddr的報(bào)文</p><p> receive(DatagramPacket d):接收數(shù)據(jù)報(bào)文到d中。receive方法產(chǎn)生一個(gè)“阻塞”。
31、 send(DatagramPacket d):發(fā)送報(bào)文d到目的地。 setSoTimeout(int timeout):設(shè)置超時(shí)時(shí)間,單位為毫秒。 close():關(guān)閉DatagramSocket。在應(yīng)用程序退出的時(shí)候,通常會(huì)主動(dòng)釋放資源,關(guān)閉Socket,但是由于異常地退出可能造成資源無法回收。所以,應(yīng)該在程序完成時(shí),主動(dòng)使用此方法關(guān)閉Socket,或在捕獲到異常拋出后關(guān)閉Sock。</p&
32、gt;<p> 3.2.2 JAVA MulticastSocket</p><p> 多播數(shù)據(jù)報(bào)套接字類用于發(fā)送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機(jī)的“組”的附加功能。</p><p> 多播組通過 D 類 IP 地址和標(biāo)準(zhǔn) UDP 端口號(hào)指定。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ā)送到多播組時(shí),該主機(jī)和端口的所有預(yù)定接
34、收者都將接收到消息(在數(shù)據(jù)包的生存時(shí)間范圍內(nèi),請(qǐng)參閱下文)。套接字不必成為多播組的成員即可向其發(fā)送消息。</p><p> 當(dāng)套接字預(yù)定多播組/端口時(shí),它將接收由該組/端口的其他主機(jī)發(fā)送的數(shù)據(jù)報(bào),像該組和端口的所有其他成員一樣。套接字通過 leaveGroup(InetAddress addr) 方法放棄組中的成員資格。多個(gè) MulticastSocket 可以同時(shí)預(yù)定多播組和端口,并且都會(huì)接收到組數(shù)
35、據(jù)報(bào)。</p><p> 同時(shí),不允許 applet 使用多播套接字。</p><p> 3.2.3 JAVA Swing</p><p> Swing是一組Java程序元件,它能夠創(chuàng)建圖象用戶接口(GUI)元件,如按鈕和滾動(dòng)條,它們獨(dú)立于特定操作系統(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)了一個(gè)機(jī)理:在不改變大量的程序代碼前提下允許程序中每個(gè)組件觀感的變化。支持可更換觀感技術(shù)的引入允許Swing組件在模擬
37、原生組件外觀的同時(shí)又保持了平臺(tái)獨(dú)立的優(yōu)點(diǎn)。</p><p> Swing 是一個(gè)為Java設(shè)計(jì)的GUI工具包。 Swing 是 JAVA API 的一部分。 Swing 包括了圖形用戶界面 (GUI) 器件 如:文本框,按鈕,分隔窗格和表。</p><p> SWING 提供許多比AWT更好的屏幕顯示元素。它們用純Java寫成,所以同Java本身一樣可以跨平臺(tái)運(yùn)行,
38、這一點(diǎn)不像AWT。 它們是JFC的一部分。 它們支持可更換的觀感和主題(各種操作系統(tǒng)默認(rèn)的特有主題),然而不是真的使用原生平臺(tái)提供的設(shè)備,而是僅僅在表面上模仿它們。這意味著你可以在任意平臺(tái)上使用JAVA支持的任意觀感。 輕量級(jí)元件的缺點(diǎn)則是執(zhí)行速度較慢,優(yōu)點(diǎn)就是可以在所有平臺(tái)上采用統(tǒng)一的行為。</p><p> 3.4 系統(tǒng)開發(fā)、運(yùn)行環(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針對(duì)Java開發(fā)員的產(chǎn)品。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的Java SDK。JDK 是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境,Java工具和Java基礎(chǔ)的類庫。</p&
40、gt;<p> 開發(fā)工具:Eclipse 4.4.0 或更高版本</p><p> Eclipse企業(yè)級(jí)工作平臺(tái)(Eclipse Java EE IDE for Web Developers,簡(jiǎn)稱Eclipse),利用它我們可以在數(shù)據(jù)庫和JavaEE的開發(fā)、發(fā)布,以及應(yīng)用程序服務(wù)器的整合方面極大的提高工作效率。它是功能豐富的JavaEE集成開發(fā)環(huán)境,包括了完備的編碼、調(diào)試、測(cè)試和發(fā)布功能,完整支
41、持HTML、Struts、JSF、CSS、Javascript、SQL、Hibernate。</p><p> 第四章 系統(tǒng)概要設(shè)計(jì)</p><p> 4.1 系統(tǒng)功能模塊設(shè)計(jì)</p><p> 從模擬用戶的角度進(jìn)行分析,對(duì)于一個(gè)局域網(wǎng)聊天系統(tǒng),首先要確定其功能是什么,也就是用戶想要系統(tǒng)做什么工作。經(jīng)過對(duì)系統(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> 用戶登陸時(shí)使用,提供昵稱的輸入和用戶頭像的選擇等功能。用戶登陸界面共分為五部分如下
43、圖所示:</p><p><b> ?、偬崾拘畔@示區(qū)域</b></p><p><b> ②輸入用戶昵稱區(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> ?、蹖?shí)時(shí)顯示局域網(wǎng)聊天的在線用戶列表,每一項(xiàng)都會(huì)顯示一個(gè)在線用戶的頭像和昵稱</p><p> ?、軡L動(dòng)顯示當(dāng)前的在線用戶數(shù)目,當(dāng)在線用戶較多時(shí),可以讓用戶直觀地看到在線的人數(shù)</p><p> 圖4.
46、3 用戶主界面</p><p><b> 聊天界面</b></p><p> 聊天界面是用戶之間聊天使用的界面,界面共分為六部分:</p><p> ①顯示對(duì)象的頭像和昵稱</p><p><b> ?、陲@示聊天記錄</b></p><p> ?、哿奶燧o助功能欄,從左到
47、右依次為:文字屬性、表情、窗口抖動(dòng)、文件發(fā)送和聊天記錄管理</p><p><b> ④用戶輸入聊天信息</b></p><p> ?、莅l(fā)送按鈕和清屏按鈕,清屏按鈕用于清除聊天界面的聊天信息</p><p> ⑥顯示對(duì)方的放大頭像和登陸信息</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è)計(jì)</p><p> 5.1 詳細(xì)設(shè)計(jì)概述</p><p> 軟件詳細(xì)設(shè)計(jì)的任務(wù)是,是為軟件結(jié)構(gòu)圖中的每個(gè)模塊確定所采用的算法和塊內(nèi)數(shù)據(jù)結(jié)構(gòu),用某種選定的表達(dá)工具給出清晰的描述,表達(dá)工具可以
49、自由選擇,但工具必須具有描述過程細(xì)節(jié)的能力,而且能夠有利于程序員在編程時(shí)便于直接翻譯成程序設(shè)計(jì)語言的源程序。</p><p> 程序流程圖、UML圖等都是完成詳細(xì)設(shè)計(jì)的工具,選擇合適的工具并且正確地使用是十分重要的。</p><p> 在概要設(shè)計(jì)階段,已經(jīng)確定了軟件系統(tǒng)的總體結(jié)構(gòu),給出了軟件系統(tǒng)中各個(gè)組成模塊的功能和模塊間的接口。作為軟件設(shè)計(jì)的第二步,軟件詳細(xì)設(shè)計(jì)就是在軟件概要設(shè)計(jì)的基
50、礎(chǔ)上,考慮如何實(shí)現(xiàn)定義的軟件系統(tǒng),直到對(duì)系統(tǒng)中的每個(gè)模塊給出了足夠詳細(xì)的過程描述。在軟件詳細(xì)設(shè)計(jì)以后,程序員將仍舊根據(jù)詳細(xì)設(shè)計(jì)的過程編寫出實(shí)際的程序代碼。因此,軟件詳細(xì)設(shè)計(jì)的結(jié)果基本上決定了最終的程序代碼質(zhì)量。</p><p> 5.2 系統(tǒng)詳細(xì)設(shè)計(jì)</p><p><b> 5.2.1登陸界面</b></p><p> 登陸局域網(wǎng)聊天程
51、序共涉及到三個(gè)類:LanTalk類、LoginFrame類、和ComUtil類。</p><p> LanTalk類是程序的主程序;</p><p> LoginFrame類是程序的登陸界面程序;</p><p> ComUtil類是程序的通信類,當(dāng)用戶登陸后,ComUtil類會(huì)實(shí)例化一個(gè)MulticastSocket和一個(gè)DatagramSocket,前者用
52、于向固定廣播地址發(fā)送自己的在線信息和實(shí)現(xiàn)在線用戶之間的群聊功能,后者用于提供兩個(gè)用戶之間的私聊功能。</p><p> 登陸局域網(wǎng)聊天軟件時(shí)需要運(yùn)行的是LanTalk類,LanTalk類會(huì)實(shí)例化LoginFrame類初始化登陸界面,而當(dāng)?shù)顷懶畔⑻钔甏_定登陸后,LoginFrame又會(huì)初始化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ào)</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對(duì)象</p><p> socket.close();</p><p><b> }</b></p><p> JOptionPane.showMessageDialog
58、(null, </p><p> "發(fā)送信息異常,請(qǐng)確認(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中的所有索引對(duì)應(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對(duì)象</p><p> socket.close();</p><p><b> }</b></p><p> JOptionPane.showMessageDialog(null, <
78、/p><p> "接收信息異常,請(qǐng)確認(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、主界面包含三個(gè)類,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> 聊天界面包含六個(gè)類: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(), "請(qǐng)
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 = "@#"; //震動(dòng)信息標(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)實(shí)現(xiàn)</b></p><p> 6.1 總體工程架構(gòu)的實(shí)現(xiàn)</p><p> 圖6.1 工程架構(gòu)圖</p><p> 6.2 具體功能實(shí)現(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等.壓縮文件請(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)聊天系統(tǒng)-課程設(shè)計(jì)報(bào)告
- 局域網(wǎng)聊天程序java課程設(shè)計(jì)
- 基于java的局域網(wǎng)聊天系統(tǒng)
- java課程設(shè)計(jì)--局域網(wǎng)聊天程序的設(shè)計(jì)與實(shí)現(xiàn)
- java課程設(shè)計(jì)---局域網(wǎng)聊天程序的設(shè)計(jì)與實(shí)現(xiàn)
- 軟件課程設(shè)計(jì)報(bào)告--局域網(wǎng)聊天程序
- 基于java局域網(wǎng)聊天軟件
- java課程設(shè)計(jì)---局域網(wǎng)聊天程序的設(shè)計(jì)與實(shí)現(xiàn)
- 軟件課程設(shè)計(jì)---局域網(wǎng)聊天程序
- 課程設(shè)計(jì)--基于qt的局域網(wǎng)聊天室
- 基于java局域網(wǎng)聊天軟件畢業(yè)論文
- vc++面向?qū)ο笳n程設(shè)計(jì)報(bào)告---局域網(wǎng)聊天程序
- 基于java局域網(wǎng)聊天程序設(shè)計(jì)與實(shí)現(xiàn)
- 基于java局域網(wǎng)聊天程序設(shè)計(jì)與實(shí)現(xiàn)
- java局域網(wǎng)聊天軟件大學(xué)設(shè)計(jì)好sqlserver
- 畢業(yè)設(shè)計(jì)--局域網(wǎng)聊天系統(tǒng)
- java畢業(yè)論文---局域網(wǎng)聊天軟件
- 局域網(wǎng)聊天系統(tǒng)畢業(yè)設(shè)計(jì)
- 基于c++的局域網(wǎng)聊天系統(tǒng)【開題報(bào)告】
- java局域網(wǎng)聊天室系統(tǒng)畢業(yè)論文
評(píng)論
0/150
提交評(píng)論