(精品)企業(yè)內(nèi)部通信系統(tǒng)(2013年優(yōu)秀畢業(yè)設計)_第1頁
(精品)企業(yè)內(nèi)部通信系統(tǒng)(2013年優(yōu)秀畢業(yè)設計)_第2頁
(精品)企業(yè)內(nèi)部通信系統(tǒng)(2013年優(yōu)秀畢業(yè)設計)_第3頁
(精品)企業(yè)內(nèi)部通信系統(tǒng)(2013年優(yōu)秀畢業(yè)設計)_第4頁
(精品)企業(yè)內(nèi)部通信系統(tǒng)(2013年優(yōu)秀畢業(yè)設計)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本科畢業(yè)論文(設計) 企業(yè)內(nèi)部通信系統(tǒng)第一章概論31.1開發(fā)背景31.2 課題現(xiàn)狀31.3 畢業(yè)設計及論文的主要工作3第二章系統(tǒng)分析42.1 需求分析42.2 可行性分析42.21可行性要求42.22 成本可行性分析42.23 技術可行性分析4第三章系統(tǒng)設計53.1 系統(tǒng)目標53.2 系統(tǒng)功能53.3 數(shù)據(jù)庫設計63.31數(shù)據(jù)庫分析63.32企業(yè)內(nèi)部通信系統(tǒng)的E-R圖63.33數(shù)據(jù)庫的結構設計73.4 主要模塊的設計83.41主窗體模塊設計83.42公共模塊設計83.43系統(tǒng)托盤模塊設計103.44系統(tǒng)工具模塊設計103.45用戶管理模塊設計113.46通信模塊設計12第四章詳細設計和代碼實現(xiàn)154.1主要模塊的實現(xiàn)過程154.2通信模塊的實現(xiàn)過程20第五章總結22致謝23參考文獻23Abstract23摘要: 本文設計一個類似飛鴿傳書的企業(yè)內(nèi)部通信系統(tǒng),系統(tǒng)基于UDP/IP協(xié)議,使用 Java Swing、Java Socket和JavaDB數(shù)據(jù)庫進行開發(fā)。系統(tǒng)實現(xiàn)了信息通信、系統(tǒng)設置、文件傳輸、訪問公共資源、互訪對方主機五大功能。本系統(tǒng)結構清晰、界面友好、操作簡單、通用性強,可以大大提高了企業(yè)的工作效率。關鍵字:企業(yè)、信息通信、socket1概論1.1開發(fā)背景近幾年,隨著網(wǎng)絡的迅速發(fā)展和全球信息化速度的加快,網(wǎng)絡通信已經(jīng)不算是新鮮事物了,但大多數(shù)網(wǎng)絡通訊需要借助Internet上的服務器,這就給那些具有大規(guī)模內(nèi)部網(wǎng)絡的用戶造成了許多問題,如浪費網(wǎng)絡資源、遭遇到網(wǎng)絡攻擊、病毒的入侵等等。為了保證企業(yè)內(nèi)部的通信安全,減少員工溝通和交流工作中遇見的種種問題,由于互聯(lián)網(wǎng)上的網(wǎng)絡通信工具給企業(yè)內(nèi)部信息交流帶來的不便,所以為了方便企業(yè)內(nèi)部用戶之間的溝通、保證企業(yè)內(nèi)部局域網(wǎng)的安全,需要開發(fā)一個基于局域網(wǎng)的信息收發(fā)系統(tǒng)的即時通訊工具。1.2 課題現(xiàn)狀企業(yè)內(nèi)部通信系統(tǒng)是基于局域網(wǎng)的即時通信工具,可以說是一個internet通信工具的小規(guī)模版本,一般采用UDP或者TCP協(xié)議體系等來實現(xiàn),開發(fā)技術已經(jīng)比較成熟,國外的通信工具較有名的有ICQ、MSN Messenger、國產(chǎn)的QQ、新浪UC都實現(xiàn)了廣域網(wǎng)的即時通信。在最近幾年,國內(nèi)的局域網(wǎng)通信工具較有代表性有飛鴿傳書、飛秋,這兩款軟件的快速、實效、迷你、簡單的特點受到了廣大企業(yè)的好評。這些工具的實現(xiàn)方式具體細節(jié)不易得之,但它無非是利用各種平臺上的網(wǎng)絡通信接口,基于TCP/IP或者UDP/IP協(xié)議架構下的軟件產(chǎn)品。對于一個企業(yè)內(nèi)網(wǎng),這些功能的實現(xiàn)相比于廣域網(wǎng)更加簡單。所以還是有很大研究價值的。2.系統(tǒng)分析2.1 需求功能分析本系統(tǒng)的設計目標是實現(xiàn)一個企業(yè)內(nèi)部局域網(wǎng)通信系統(tǒng),企業(yè)內(nèi)部職工可以方便的進行交流,可以大大的提高職工的工作效率。根據(jù)企業(yè)對局域網(wǎng)通信的需求,本系統(tǒng)主要包括信息通信、用戶搜索、訪問公共資源、訪問對方主機、系統(tǒng)設置五大功能。各功能概述:信息通信:信息通信是企業(yè)內(nèi)部通信系統(tǒng)的核心功能,它用于不同職工之間的通信,這種通信方式能夠?qū)崿F(xiàn)多個職工之間的通信,而不存在類似電話的占線問題,增加了任務分配的新方式,從而提高企業(yè)的工作效率。用戶搜索:用戶搜索用于搜索企業(yè)局域網(wǎng)內(nèi)的其他用戶,系統(tǒng)會根據(jù)用戶所設置的IP搜索范圍搜索所有計算機上的用戶。訪問公共資源:訪問公共資源用于實現(xiàn)企業(yè)內(nèi)部公共服務器上資源訪問的功能。訪問對方主機:訪問對方主機用于兩人聊天情況下對對方主機的訪問和控制的功能。系統(tǒng)設置:系統(tǒng)設置用于設置用戶界面、公共路徑、公告欄等的功能。2.2數(shù)據(jù)庫分析該系統(tǒng)是一個桌面應用程序,它不像web應用那樣需要配置到指定的服務器上,所以數(shù)據(jù)庫和該系統(tǒng)應存在于同一計算機中,這樣,不僅節(jié)省了開銷,而且還提高了系統(tǒng)的安全性。該系統(tǒng)所用數(shù)據(jù)庫為JAVADB數(shù)據(jù)庫。由于該數(shù)據(jù)庫的運行環(huán)境平臺要求較低,一般的電腦都可以滿足它的硬件條件。企業(yè)內(nèi)部通信系統(tǒng)的E-R圖該系統(tǒng)的實體包括用戶和窗口位置兩個實體,分別記錄著通信窗口的絕對位置和用戶的信息。 用戶實體用戶實體主要包括IP信息、PC名稱、用戶信息、系統(tǒng)信息等,它記錄了搜索到的用戶和所有的用戶信息。用戶實體的E-R圖如下。 用戶實體頭 像提示文本用戶信息IP地 址主機名稱 圖1用戶實體E-R圖窗體位置實體窗體位置實體記錄著窗體最后的移動位置和窗體大小等信息,主要包括窗體位置的橫坐標和豎坐標(下圖用X、Y軸坐標表示)、窗體的高度和寬度。它的E-R圖如下所示:X坐標窗口實體Y坐標窗體高度窗體寬度圖2窗體位置E-R圖2.3 可行性分析2.3.1 技術可行性分析局域網(wǎng)通信系統(tǒng)的技術已經(jīng)非常成熟,首先,從硬件上講,計算機硬件速度現(xiàn)在已經(jīng)不是問題,高速便捷的網(wǎng)絡已經(jīng)十分普遍,這些為本系統(tǒng)的運行打下堅實的基礎。從軟件的角度上講,數(shù)據(jù)庫技術已經(jīng)相當成熟(目前用得比較多的有SQL Server, JavaDB等),并且處理能力也非常強,這為海量數(shù)據(jù)的存儲和處理打下了堅實的基礎,同時,使用java開發(fā)圖形界面程序也相當普遍。有了這些技術的支持,我們成功開發(fā)一個局域網(wǎng)通信系統(tǒng)沒有任何技術風險。2.3.2 經(jīng)濟可行性分析經(jīng)濟可行性主要是對項目的經(jīng)濟效益進行評價。本系統(tǒng)開發(fā)完成后可縮減工作時間,提高工作效率,而且簡單易操作,不需對使用人員進行培訓,不管是在資金上還是效率上都能達到預期的效果。本系統(tǒng)開發(fā)經(jīng)費對于企業(yè)在經(jīng)濟上是可以接受的,并且本系統(tǒng)實施后可以顯著提高工作效率,有助于企業(yè)的信息化管理,所以為該企業(yè)內(nèi)部通信系統(tǒng)在經(jīng)濟上是可行的。3.系統(tǒng)設計3.1 系統(tǒng)目標系統(tǒng)根據(jù)企業(yè)對內(nèi)部通信系統(tǒng)的要求,本系統(tǒng)可以實現(xiàn)以下目標。 操作簡單、界面簡潔美觀。 更方便訪問企業(yè)公共資源。 及時顯示企業(yè)公共信息。 在通信窗口顯示對方IP信息。 局域網(wǎng)內(nèi)網(wǎng)用戶自動搜索。 系統(tǒng)運行穩(wěn)定、安全可靠。 3.2 系統(tǒng)功能系統(tǒng)功能結構圖如下:企業(yè)信息通信系統(tǒng)信息通信系統(tǒng)設置用戶搜索訪問公共資源訪問對方主機圖 3系統(tǒng)功能結構圖3.3 數(shù)據(jù)庫結構設計在該系統(tǒng)中的數(shù)據(jù)庫db_EQ包含兩個數(shù)據(jù)表,分別為用戶信息表tb_users和窗體位置信息表tb_location。 用戶信息表用戶信息表用來保存企業(yè)內(nèi)的通信用戶,表tb_users如下所示:1.用戶信息表tb_users字段名數(shù)據(jù)類型是否為空是否主鍵默認值描 述I PVarchar(16)NOYES用戶IPHostVarchar(30)YESNONULL主機名稱NameVarchar(20)YESNONULL姓 名TooltipVarchar(50)YESNONULL提示文本IconVarchar(50)YESNONULL頭像圖標 窗體位置信息表窗體位置表用來保存窗體的位置和大小,表tb_location如下所示:2.窗體位置信息表tb_location字段名數(shù)據(jù)類型是否為空是否主鍵默認值描 述xLocationIntYESNONULLX軸坐標yLocationIntYESNONULLY軸坐標heightIntYESNONULL窗體高度widthIntYESNONULL窗體寬度3.4 主要模塊的設計本系統(tǒng)分六個模塊:主窗體模塊、公共模塊、系統(tǒng)托盤模塊、系統(tǒng)工具模塊、用戶管理模塊和通信模塊,其中通信模塊是本系統(tǒng)的核心模塊。3.4.1主窗體模塊設計主窗體界面是本系統(tǒng)的用戶列表,它由用戶列表、系統(tǒng)選項卡、公告提示等組成。其中系統(tǒng)選項卡用于切換不同的管理界面,包括系統(tǒng)設計和系統(tǒng)工具界面。主窗體的設計效果圖如下所示:圖4 主窗體界面示意圖3.4.2公共模塊設計在本系統(tǒng)的項目空間中,有部分模塊是公用的,或者多個模塊甚至整個系統(tǒng)的配置信息是被多個模塊重復調(diào)用完成業(yè)務的邏輯。其中有關數(shù)據(jù)庫的操作、連接數(shù)據(jù)庫、創(chuàng)建本機IP的默認用戶(并添加到數(shù)據(jù)庫中)、從數(shù)據(jù)庫中獲取窗體位置和大小、添加或刪除指定用戶、更新用戶信息等。3.4.3系統(tǒng)托盤模塊設計系統(tǒng)托盤模塊用于定義系統(tǒng)欄圖標。本系統(tǒng)的主窗體是繼承對話框窗體編寫的,該窗體在系統(tǒng)任務欄不會顯示任務標題,如果主窗體最小化之后將會隱藏,這時必須使用快捷鍵或者系統(tǒng)托盤中的圖標執(zhí)行顯示窗體的命令。系統(tǒng)托盤包含相應的菜單,右鍵點擊會彈出選擇菜單,菜單包括三個選項,分別是:“訪問服務器”、“打開”、“退出”。圖示如下: 圖5系統(tǒng)托盤示意圖3.4.4系統(tǒng)工具模塊設計本系統(tǒng)的工具模塊起到維護系統(tǒng)的作用,包括更換程序外觀、。設置IP范圍、用戶搜索和系統(tǒng)更新、設置系統(tǒng)公告路徑、設置公共程序路徑、系統(tǒng)登錄等功能。在該系統(tǒng)第一次運行的時,用戶搜索功能可以搜索內(nèi)部網(wǎng)絡中所有正在運行的計算機。本系統(tǒng)工具模塊中使用了Java的LookAndFeel外觀技術,不同的外觀中控件的外觀也會不同,就比如我們常用的電腦中,windows經(jīng)典樣式和windowsXP樣式外觀的按鈕、列表、菜單、工具欄甚至窗體的外觀都不相同。在本系統(tǒng)中提供了“當前系統(tǒng)”和“JAVA默認值”兩個外觀選項,其中“JAVA默認值”是Swing默認的外觀,不需要特別設置,而“當前系統(tǒng)”外觀需要使用相應的方法獲取當前系統(tǒng)的外觀名稱,然后將該外觀應用于默認的外觀。效果圖如下所示:圖6系統(tǒng)工具界面示意圖3.4.5用戶管理模塊設計用戶管理模塊類似于聊天軟件的好友列表,其中包含所有用戶信息,另外在用戶名稱上單擊鼠標右鍵,會彈出相應的管理菜單,在該菜單中包含“添加用戶”、“更名”、“刪除用戶”、“信使群發(fā)(在沒有多選用戶的情況下無法進行信使群發(fā))”、“訪問主機資源”和“訪問公共程序”,其中“訪問主機資源”是訪問該用戶的共享文件夾。相應的運行效果如下:圖7用戶管理界面示意圖3.4.6通信模塊設計通信模塊是本系統(tǒng)中的核心模塊,它用于局域網(wǎng)內(nèi)的用戶之間的通信,而卻這種通信方式能夠?qū)崿F(xiàn)多個用戶之間的通信,不會存在像我們打電話一樣時的占線問題,增加了任務分配的方式。本模塊可以使用UDP協(xié)議和信史兩種方式發(fā)送信息。我們通常所說的通信工具,都是采用的客戶機/服務器(C/S)架構的,C/S結構是這樣的一種結構:它包括一個客戶機(或前端),一個服務器(或稱后端),客戶機的作用是訪問和處理遠程服務器上的數(shù)據(jù),服務器的作用是接收和處理客戶機的數(shù)據(jù)請求。有時,可能有多個客戶向同一個服務器同時請求服務,這就需要服務器決定怎樣處理這些請求。Client/Server結構是當前數(shù)據(jù)庫應用程序中極為流行的一種方式。尤其是網(wǎng)絡技術的發(fā)展,使得當前很多系統(tǒng)都采用這種方式進行構造,其最大的優(yōu)點是將計算機工作任務分別由客戶端和服務器端來共同完成,這樣有利于充分合理的利用系統(tǒng)資源。另外它的服務器端還可以將信息集中起來,任何客戶機都可以通過訪問服務器而獲得所需的信息。Client/Server模型最終可歸結為一種“請求/應答”關系。一個請求總是首先被客戶發(fā)出,然后服務器總是被動地接收請求,返回客戶需要的結果。在客戶發(fā)出一個請求之前,服務進程一直處于休眠狀態(tài)。一個客戶提出請求后,服務進程被“喚醒”并且為客戶提供服務,對客戶的請求做出所需要的應答。其工作示意圖如下:圖8 C/S模式下的網(wǎng)絡拓撲圖但是本系統(tǒng)如果要做成C/S架構的話,需要在局域網(wǎng)內(nèi)設置一個服務器,而在企業(yè)局域網(wǎng)內(nèi),網(wǎng)絡結構不是集中式的而是分布式的,可能沒有一臺機器來充當服務器這個角色,同樣用服務器會增加本系統(tǒng)的設置難度,不符合本系統(tǒng)方便、快捷的特色,同時增加服務器后,所有數(shù)據(jù)都會經(jīng)過服務器保存處理,需要有專人看管維護服務器,顯得更麻煩。所以本系統(tǒng)采用每個程序自己既充當客戶機,又充當服務器,自己來維護網(wǎng)絡上的用戶列表,每兩個客戶端進行連接的時候都直接連通而不用增設服務器中轉(zhuǎn)。示意圖如下:圖9 無公共服務器模式下的網(wǎng)絡拓撲圖當然,上述圖示只是通信數(shù)據(jù)的一個流向示意圖,不是真正的網(wǎng)絡拓撲結構,也就是說其中的服務器可能只是裝了服務器軟件的一臺普通工作站。在底層的數(shù)據(jù)流向中,也就是網(wǎng)絡的物理連結,并非我們這個軟件所能決定的,我們的所做都是在一個透明的數(shù)據(jù)通信層之上的。在該模塊中,使用基于UDP協(xié)議的數(shù)據(jù)報和套接字實現(xiàn)計算機之間的信息通信。UDP(User Datagram Protocol)協(xié)議就是“用戶數(shù)據(jù)報協(xié)議”,它是一種無連接的協(xié)議,在該協(xié)議進行數(shù)據(jù)傳輸時,發(fā)送方只需要知道對方的IP地址和端口號就可以發(fā)送數(shù)據(jù)了,并不需要進行連接,當遠程主機端口號出于監(jiān)聽狀態(tài)時,則UDP必須出于連接狀態(tài)。通信的聊天界面運行效果如下所示:圖10 聊天界面示意圖4.詳細設計和代碼實現(xiàn)4.1主窗體模塊的實現(xiàn)過程主窗體實現(xiàn)部分包括創(chuàng)建主窗體和記錄窗體位置。其中創(chuàng)建主窗體的步驟如下:(1)創(chuàng)建JXCFrame類,在類中創(chuàng)建窗體的對象,為窗體添加選項卡面板,并添加用戶列表、系統(tǒng)工具、系統(tǒng)設置3個選項卡和狀態(tài)欄標簽、公告按鈕等屬性。在構造方法中初始化窗體上的控件。數(shù)據(jù)庫操作類、首選項對象等屬性,為窗體添加時間監(jiān)聽器、為公告信息按鈕添加監(jiān)聽器等。(2)初始化Socket服務器,指定端口為1111,如初始化失敗,則提示服務器端口被占用或本軟件已運行,并退出本系統(tǒng)。用于接收其他用戶發(fā)送的通信信息。關鍵代碼如下:try / 啟動通訊服務端口ss = new DatagramSocket(1111); catch (SocketException e2) if (e2.getMessage().startsWith(Address already in use)showMessageDialog(服務端口被占用,或者本軟件已經(jīng)運行。);System.exit(0);(3) checkPlacard方法,用于檢測系統(tǒng)公告,當公告路徑中存在系統(tǒng)公告是,將從文件中獲取完整信息,調(diào)用pushMessage()方法將信息壓入公告信息棧中。關鍵代碼如下:private void checkpacard() / 檢測公告信息方法String placardDir = preferences.get(placardPath, null);if (placardDir = null) pushMessage(未設置公告路徑);return;File placard = new File(placardDir);try if (placard.exists() & placard.isFile() StringBuilder placardStr = new StringBuilder();Scanner sc = new Scanner(new FileInputStream(placard);while (sc.hasNextLine() placardStr.append(sc.nextLine();pushMessage(placardStr.toString(); catch (FileNotFoundException e) pushMessage(公告路徑錯誤,或公告文件不存在);(4)initUserInfoButton()方法用于初始化本地用戶信息,并在主窗體左上角顯示本地用戶的頭像和名稱,會在用戶更改本地用戶名稱時同步更新。(5) main()方法,本方法首先獲取用戶設置的界面外觀,然后調(diào)用UIManager類設置指定的外觀,生成主窗體對象。最后初始化服務器端口和系統(tǒng)欄圖標。以下為關鍵代碼:public static void main(String args) try String laf = preferences.get(lookAndFeel, java默認);/獲取用戶選擇的外觀if (laf.indexOf(當前系統(tǒng))-1)UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName();/設置外觀EQ frame = new EQ();frame.setVisible(true);/顯示窗體frame.SystemTrayInitial();/ 初始化系統(tǒng)欄frame.server();/啟動服務端口frame.checkPlacard();/檢測系統(tǒng)公告 catch (Exception e) e.printStackTrace(); 記錄窗體的位置步驟如下:為窗體添加監(jiān)聽器,當改變窗體的位置和大小時,將調(diào)用saveLocation()方法將窗體和位置大小保存到數(shù)據(jù)庫中。saveLocation(),該方法中調(diào)用了DAO類中的updateLocation將窗體的位置和大小保存到數(shù)據(jù)庫中。4.2公共模塊的實現(xiàn)過程公共模塊包括數(shù)據(jù)庫操作類和系統(tǒng)工具類。其中DAO類主要負責有關數(shù)據(jù)庫的操作,該類在構造方法中驅(qū)動并連接數(shù)據(jù)庫,然后將構造方法設置為private私有屬性,通過靜態(tài)的getdao()獲取DAO類的實例對象,這是簡單的單例模式。在連接數(shù)據(jù)庫時,可以指定create參數(shù)為true直接創(chuàng)建數(shù)據(jù)庫,但在此之前需要調(diào)用dbExist()方法判斷數(shù)據(jù)庫是否存在。Resource類是企業(yè)內(nèi)部通信系統(tǒng)中的工具類,該類中的方法都是靜態(tài)的,可以直接調(diào)用,而不用創(chuàng)建Resource類的實例對象。這些工具方法包括搜索用戶的方法、登錄公共資源的方法、信使群發(fā)的方法和單條信息發(fā)送的方法。4.3系統(tǒng)工具模塊的實現(xiàn)過程(1)createSysToolPanel()方法,用于創(chuàng)建系統(tǒng)工具選項卡,在該選項卡中包括界面選擇、用戶搜索和系統(tǒng)操作3部分,其中系統(tǒng)操作用于程序更新,它們都被添加到系統(tǒng)工具面板中,createSysToolPanel()方法必須設置好面板的布局和初始化工作。(2)在createSysToolPanel()方法中創(chuàng)建界面選擇部分,該部分以列表控件顯示了兩種外觀選擇,當用戶選擇其中以種外觀并單擊“確定”按鈕之后,選擇外觀會保存到首選項中,然后提示重新運行本軟件。(3)在createSysToolPanel()方法中創(chuàng)建用戶搜索部分,包括搜索列表、搜索進度條和“搜索新用戶”3個控件,當單擊“搜索新用戶”按鈕時,系統(tǒng)會根據(jù)用戶在系統(tǒng)設置界面所設置的IP搜索范圍搜索所有計算機信息,并創(chuàng)建相應的用戶對象,然后保存到數(shù)據(jù)庫中。(4)創(chuàng)建“搜索新用戶”按鈕的事件監(jiān)聽器SearchUserActionListener類,調(diào)用Resource工具類的searchUsers()方法搜索指定IP范圍內(nèi)的所有用戶。系統(tǒng)工具類中的searchUsers()方法,該方法用于搜索局域網(wǎng)內(nèi)的通信用戶,也就是搜索企業(yè)內(nèi)的所有職工。本方法將獲取用戶指定的IP范圍,并在該范圍內(nèi)搜索所有可以訪問的計算機,如果用戶沒有指定IP范圍,系統(tǒng)默認的是-55。該方法的關鍵代碼如下:try for (int l = ipsInt0; l = ipeInt0; l+) boolean b0 = l ipeInt0; / 記錄第一層循環(huán)的條件int k = l != ipsInt0 ? 0 : ipsInt1; / 從第二次循環(huán)以后k賦值0for (; b0 ? k 256 : k = ipeInt1; k+) boolean b1 = b0 | k ipeInt1; / 記錄第二層循環(huán)的條件int j = k != ipsInt1 ? 0 : ipsInt2; / 從第二次循環(huán)以后j賦值0for (; b1 ? j 256 : j = ipeInt2; j+) boolean b2 = b1 | b1 ? j 256 : j ipeInt2;int i = j != ipsInt2 ? 0 : ipsInt3;for (; b2 ? i 256 : i = ipeInt3; i+) if(!button.isSelected()progressBar.setIndeterminate(false);return;Thread.sleep(100);/線程休息100毫秒String ip = l + . + k + . + j + . + i;progressBar.setString(正在搜索: + ip);/取消進度條的滾動if (tree.addUser(ip, search)/添加新用戶model.addElement(添加+ ip + );catch(Exception e) e.printStackTrace();4.4系統(tǒng)托盤模塊的實現(xiàn)過程在JDK6.0中,AWT新增加了SystemTray類和TrayIcon類,它們可以在系統(tǒng)托盤區(qū)創(chuàng)建一個托盤程序。SystemTray類表示桌面右下角的系統(tǒng)托盤,系統(tǒng)托盤由運行在桌面上的所有應用程序共享,可以使用getSystemTray()方法獲取系統(tǒng)托盤對象,該方法總是對每個應用程序返回相同的實例。并不是所有的操作系統(tǒng)都支持系統(tǒng)托盤,如果當前系統(tǒng)不支持托盤的話,該方法將自動拋出異常。為避免程序出現(xiàn)錯誤,在獲取系統(tǒng)托盤實例之前,需要檢查系統(tǒng)托盤是否支持??梢哉{(diào)用isSupport()來實現(xiàn)。Systemtray類可以包含一個或多個TrayIcon類的實例,即系統(tǒng)欄圖標,可以使用add()將它們添加到托盤,TrayIcon對象由圖像、彈出菜單和一組相關監(jiān)聽器組成。創(chuàng)建系統(tǒng)托盤的關鍵代碼如下:try String title = EQ通訊軟件;/系統(tǒng)欄提示文本的標題String company = 吉林省XXX科技有限公司;/系統(tǒng)欄提示文本SystemTray sysTray = SystemTray.getSystemTray();/獲取系統(tǒng)托盤對象Image image = Toolkit.getDefaultToolkit().getImage(EQ.class.getResource(/icons/sysTray.png);/ 系統(tǒng)欄圖標trayicon = new TrayIcon(image, title + n + company, createMenu(); /創(chuàng)建系統(tǒng)欄圖標對象trayicon.setImageAutoSize(true);/設置自動大小trayicon.addActionListener(new SysTrayActionListener();/添加監(jiān)聽器sysTray.add(trayicon);/添加系統(tǒng)欄圖標到系統(tǒng)托盤trayicon.displayMessage(title, company, MessageType.INFO); catch (Exception e) e.printStackTrace();4.5用戶管理模塊的實現(xiàn)過程管理模塊實現(xiàn)步驟如下:(1)創(chuàng)建UserTreeRanderer類,該類繼承Jpanel類成為一個面板控件,同時該類也實現(xiàn)了TreeCellRenderer接口成為樹節(jié)點的渲染器。該類的構造方法接受3個圖標參數(shù),分別用于樹節(jié)點的打開、關閉和葉節(jié)點的圖標。(2)在UserTreeRanderer類中的getTreeCellRendererComponent()方法,渲染樹節(jié)點的界面樣式。本方法獲取主窗體的寬度,并使用該寬度設置節(jié)點的寬度,是節(jié)點與窗體同寬度,當選擇某個節(jié)點時,該方法將使用指定顏色繪制節(jié)點的邊框,以突出該節(jié)點被選擇的效果。(3)創(chuàng)建ChatTree類,該類繼承Jtree自定義的樹控件,并且使用了之前定義的UserTreeRanderer樹節(jié)點渲染器, sortUsers()方法,此方法是一個內(nèi)部線程,該線程獲取本地的IP地址,使用該地址從數(shù)據(jù)庫中獲取本地用戶對象,并將本地用戶設置在用戶列表首位。然后從數(shù)據(jù)庫中獲取其它用戶對象。使第一個用戶處于被選擇狀態(tài),并更新狀態(tài)欄的用戶人數(shù)。關鍵代碼如下:private synchronized void sortUsers() /排序用戶列表new Thread(new Runnable() public void run() try Thread.sleep(100);root.removeAllChildren();String ip = InetAddress.getLocalHost().getHostAddress(); /獲取本地IPUser localUser = dao.getUser(ip);/從數(shù)據(jù)庫中獲取自己的信息if (localUser != null) / 把自己顯示在首位DefaultMutableTreeNode node = new DefaultMutableTreeNode(localUser);root.add(node);userMap = dao.getUsers();Iterator iterator = userMap.iterator();while (iterator.hasNext() / 遍歷用戶集合User user = iterator.next();if(user.getIp().equals(localUser.getIp()continue;root.add(new DefaultMutableTreeNode(user);/添加用戶到根節(jié)點treeModel.reload();ChatTree.this.setSelectionRow(0);/使第一個節(jié)點被選擇if (eq != null)eq.setStatic(總?cè)藬?shù): + getRowCount();/更新狀態(tài)欄標簽 catch (Exception e) e.printStackTrace();).start();(4)在ChatTree中的delUser()方法,用于刪除當前用戶列表中選擇的用戶對象。該方法首先獲取選擇的樹節(jié)點,從該節(jié)點中獲取綁定的用戶對象,經(jīng)用戶確認后刪除用戶信息,最后調(diào)用根節(jié)點的remove()方法刪除該用戶節(jié)點。另外是addUser()方法,用于在用戶列表中添加新用戶。本方法首先使用傳遞的IP參數(shù)到數(shù)據(jù)庫中獲取對應的用戶對象,如成功獲取,說明數(shù)據(jù)庫已存在該用戶,系統(tǒng)會提示“已存在”,當確定該IP可以訪問后,為該IP地址創(chuàng)建一個新的用戶并添加到數(shù)據(jù)庫中。關鍵代碼如下:public boolean addUser(String ip, String opration) / 添加用戶try if (ip = null)return false;User oldUser = dao.getUser(ip);/從數(shù)據(jù)庫中獲取IP相同用戶if (oldUser = null) / 如果數(shù)據(jù)庫中不存在該用戶InetAddress addr = InetAddress.getByName(ip);/該用戶可以訪問if (addr.isReachable(1500) String host = addr.getHostName();/獲取它的主機名稱root.add(new DefaultMutableTreeNode(new User(host, ip);User newUser = new User();/創(chuàng)建新用戶對象newUser.setIp(ip); /設置IPnewUser.setHost(host);/設置主機名稱newUser.setName(host);/設置用戶姓名newUser.setIcon(1.gif);/設置頭像dao.addUser(newUser);/添加該用戶到數(shù)據(jù)庫中sortUsers();/用于重新加載用戶列表if (!opration.equals(search)JOptionPane.showMessageDialog(EQ.frame, 用戶 + host+ 添加成功, 添加用戶,JOptionPane.INFORMATION_MESSAGE);return true; else /如果該用戶IP不可訪問if (!opration.equals(search)JOptionPane.showMessageDialog(EQ.frame, 檢測不到用戶IP:+ ip, 錯誤添加用戶, JOptionPane.ERROR_MESSAGE);/對話框提示錯誤return false; else /如果數(shù)據(jù)庫中存在該IP用戶if (!opration.equals(search) /并且不是系統(tǒng)自動搜索JOptionPane.showMessageDialog(EQ.frame, 已經(jīng)存在用戶IP + ip,不能添加用戶, JOptionPane.WARNING_MESSAGE);/提示已存在!return false; catch (Exception e) e.printStackTrace();return false;4.6通信模塊的實現(xiàn)過程(1) 創(chuàng)建TelFrame類,在該類中集成Jframe類實現(xiàn)Swing的窗體,定義窗體需要的所有控件,列入發(fā)送按鈕、接受信息的文本框、輸入發(fā)送信息的文本框、信使按鈕以及各種滾動面板等,定義訪問數(shù)據(jù)庫的DAO實例,在通信窗口右側(cè)顯示的用戶列表使用Dao實例從數(shù)據(jù)庫中獲取。(2)getInstance()方法,用于獲取唯一的窗體實例。該方法創(chuàng)建的所有窗體實例都會保存到Map集合類的實例中,窗體的實例對象會一直保存在這個集合類中,并且用戶再次打開已存在的窗體時,將直接從集合類中獲取,不再創(chuàng)建新的窗體實例。關鍵代碼如下:public static synchronized TelFrame getInstance(DatagramSocket ssArg,DatagramPacket dp, ChatTree treeArg) String tmpIp = dp.getAddress().getHostAddress();/獲取數(shù)據(jù)報的IP地址if (!instance.containsKey(tmpIp) /如果集合中不存在該用戶窗體TelFrame frame = new TelFrame(ssArg, dp, treeArg);/創(chuàng)建窗體實例instance.put(tmpIp, frame);/將窗體實例保存到集合中frame.receiveInfo(treeArg);/接受信息if (!frame.isVisible() /如果窗體處于隱藏狀態(tài)frame.setVisible(true);/顯示窗體frame.setState(JFrame.NORMAL);frame.toFront();/將窗體放置在最前端return frame; else /如果集合中包含該用戶窗體TelFrame frame = instance.get(tmpIp);/從集合中獲取該窗體實例frame.setBufs(dp.getData();frame.receiveInfo(treeArg);/接受信息if (!frame.isVisible() frame.setVisible(true);/顯示窗體frame.setState(JFrame.NORMAL);frame.toFront();return frame;(3)在構造方法中初始化TelFrame類的所有控件屬性,該構造方法接收DatagramSocket、DatagramPacket和chatTree類的三個參數(shù),他們分別是數(shù)據(jù)socket服務、數(shù)據(jù)報和用戶列表的實例對象。(4)receiveInfo()方法,用于接收其它用戶發(fā)送的通信信息。該方法中首先從數(shù)據(jù)報中獲取發(fā)送信息的用戶IP地址,然后從數(shù)據(jù)庫中獲取該IP用戶的姓名,同時將這些用戶IP、用戶姓名和發(fā)送時間以藍色字體顯示到信息文本框中,最后將數(shù)據(jù)報中的通信信息文本追加到信息文本框中。代碼如下:private void receiveInfo(final ChatTree tree) / 接收信息if (buf.length 0) String rText = new String(buf).replace( + (char) 0, );String hostAddress = dp.getAddress().getHostAddress();String info = dao.getUser(hostAddress).getName();info = info + ( + new Date().tolocaleString()+”)”appendReceiveText(info, Color.BLUE);appendReceiveText(rText + n, null);(5)創(chuàng)建“發(fā)送”按鈕的事件監(jiān)聽器sendActionListener類,它實現(xiàn)了ActionListener接口,擁有處理按鈕事件的能力,它在actionPerformed()方法中獲取數(shù)據(jù)報中的通信信息。創(chuàng)建MessageButtonAction內(nèi)部類,該類是“信使”按鈕的事件監(jiān)聽器。當用戶輸入通信信息并單擊“信使”按鈕時,監(jiān)聽器則調(diào)用sendMessage()方法將通信信息以系統(tǒng)信使方式發(fā)送到對方的計算機。關鍵代碼如下:class sendActionListener implements ActionListener public void actionPerformed(final ActionEvent e) String sendInfo = getSendInfo();/獲取發(fā)送信息if (sendInfo = null)return;insertUserInfoToReceiveText(tree);appendReceiveText(sendInfo + n, null);/添加到信息文本框byte tmpBuf = sendInfo.getBytes();DatagramPacket tdp = null; /創(chuàng)建數(shù)據(jù)報try tdp = new DatagramPacket(tmpBuf, tmpBuf.length,new InetSocketAddress(ip, 1111);/初始化數(shù)據(jù)報ss.send(tdp); /發(fā)送數(shù)據(jù)報 catch (SocketException e2) e2.printStackTrace(); catch (IOException e1) e1.printStackTrace();JOptionPane.showMessageDialog(TelFrame.this, e1.getMessage();sendText.setText(null);/清空發(fā)送文本框sendText.requestFocus(); /使發(fā)送文本框獲得焦點if (messageMode.isSelected()/如果選擇了

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論