版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)信息工程學(xué)院本科畢業(yè) 本科畢業(yè)論文(設(shè)計(jì)) 企業(yè)內(nèi)部通信系統(tǒng)第一章概論31.1開(kāi)發(fā)背景31.2 課題現(xiàn)狀31.3 畢業(yè)設(shè)計(jì)及論文的主要工作3第二章系統(tǒng)分析42.1 需求分析42.2 可行性分析42.21可行性要求42.22 成本可行性分析42.23 技術(shù)可行性分析4第三章系統(tǒng)設(shè)計(jì)53.1 系統(tǒng)目標(biāo)53.2 系統(tǒng)功能53.3 數(shù)據(jù)庫(kù)設(shè)計(jì)63.31數(shù)據(jù)庫(kù)分析63.32企業(yè)內(nèi)部通信系統(tǒng)的e-r圖63.33數(shù)據(jù)庫(kù)的結(jié)構(gòu)設(shè)計(jì)73.4 主要模塊的設(shè)計(jì)83.41主窗體模塊設(shè)計(jì)83.42公共模塊設(shè)計(jì)83.43系統(tǒng)托盤(pán)模塊設(shè)計(jì)103.44系統(tǒng)工具模塊設(shè)計(jì)103.45用戶管理模塊設(shè)計(jì)113.46通信模塊設(shè)計(jì)
2、12第四章詳細(xì)設(shè)計(jì)和代碼實(shí)現(xiàn)154.1主要模塊的實(shí)現(xiàn)過(guò)程154.2通信模塊的實(shí)現(xiàn)過(guò)程20第五章總結(jié)22致謝23參考文獻(xiàn)23abstract23摘要: 本文設(shè)計(jì)一個(gè)類似飛鴿傳書(shū)的企業(yè)內(nèi)部通信系統(tǒng),系統(tǒng)基于udp/ip協(xié)議,使用 java swing、java socket和javadb數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā)。系統(tǒng)實(shí)現(xiàn)了信息通信、系統(tǒng)設(shè)置、文件傳輸、訪問(wèn)公共資源、互訪對(duì)方主機(jī)五大功能。本系統(tǒng)結(jié)構(gòu)清晰、界面友好、操作簡(jiǎn)單、通用性強(qiáng),可以大大提高了企業(yè)的工作效率。關(guān)鍵字:企業(yè)、信息通信、socket1概論1.1開(kāi)發(fā)背景近幾年,隨著網(wǎng)絡(luò)的迅速發(fā)展和全球信息化速度的加快,網(wǎng)絡(luò)通信已經(jīng)不算是新鮮事物了,但大多數(shù)網(wǎng)絡(luò)
3、通訊需要借助internet上的服務(wù)器,這就給那些具有大規(guī)模內(nèi)部網(wǎng)絡(luò)的用戶造成了許多問(wèn)題,如浪費(fèi)網(wǎng)絡(luò)資源、遭遇到網(wǎng)絡(luò)攻擊、病毒的入侵等等。為了保證企業(yè)內(nèi)部的通信安全,減少員工溝通和交流工作中遇見(jiàn)的種種問(wèn)題,由于互聯(lián)網(wǎng)上的網(wǎng)絡(luò)通信工具給企業(yè)內(nèi)部信息交流帶來(lái)的不便,所以為了方便企業(yè)內(nèi)部用戶之間的溝通、保證企業(yè)內(nèi)部局域網(wǎng)的安全,需要開(kāi)發(fā)一個(gè)基于局域網(wǎng)的信息收發(fā)系統(tǒng)的即時(shí)通訊工具。1.2 課題現(xiàn)狀企業(yè)內(nèi)部通信系統(tǒng)是基于局域網(wǎng)的即時(shí)通信工具,可以說(shuō)是一個(gè)internet通信工具的小規(guī)模版本,一般采用udp或者tcp協(xié)議體系等來(lái)實(shí)現(xiàn),開(kāi)發(fā)技術(shù)已經(jīng)比較成熟,國(guó)外的通信工具較有名的有icq、msn messe
4、nger、國(guó)產(chǎn)的qq、新浪uc都實(shí)現(xiàn)了廣域網(wǎng)的即時(shí)通信。在最近幾年,國(guó)內(nèi)的局域網(wǎng)通信工具較有代表性有飛鴿傳書(shū)、飛秋,這兩款軟件的快速、實(shí)效、迷你、簡(jiǎn)單的特點(diǎn)受到了廣大企業(yè)的好評(píng)。這些工具的實(shí)現(xiàn)方式具體細(xì)節(jié)不易得之,但它無(wú)非是利用各種平臺(tái)上的網(wǎng)絡(luò)通信接口,基于tcp/ip或者udp/ip協(xié)議架構(gòu)下的軟件產(chǎn)品。對(duì)于一個(gè)企業(yè)內(nèi)網(wǎng),這些功能的實(shí)現(xiàn)相比于廣域網(wǎng)更加簡(jiǎn)單。所以還是有很大研究?jī)r(jià)值的。2.系統(tǒng)分析2.1 需求功能分析本系統(tǒng)的設(shè)計(jì)目標(biāo)是實(shí)現(xiàn)一個(gè)企業(yè)內(nèi)部局域網(wǎng)通信系統(tǒng),企業(yè)內(nèi)部職工可以方便的進(jìn)行交流,可以大大的提高職工的工作效率。根據(jù)企業(yè)對(duì)局域網(wǎng)通信的需求,本系統(tǒng)主要包括信息通信、用戶搜索、訪問(wèn)公
5、共資源、訪問(wèn)對(duì)方主機(jī)、系統(tǒng)設(shè)置五大功能。各功能概述:信息通信:信息通信是企業(yè)內(nèi)部通信系統(tǒng)的核心功能,它用于不同職工之間的通信,這種通信方式能夠?qū)崿F(xiàn)多個(gè)職工之間的通信,而不存在類似電話的占線問(wèn)題,增加了任務(wù)分配的新方式,從而提高企業(yè)的工作效率。用戶搜索:用戶搜索用于搜索企業(yè)局域網(wǎng)內(nèi)的其他用戶,系統(tǒng)會(huì)根據(jù)用戶所設(shè)置的ip搜索范圍搜索所有計(jì)算機(jī)上的用戶。訪問(wèn)公共資源:訪問(wèn)公共資源用于實(shí)現(xiàn)企業(yè)內(nèi)部公共服務(wù)器上資源訪問(wèn)的功能。訪問(wèn)對(duì)方主機(jī):訪問(wèn)對(duì)方主機(jī)用于兩人聊天情況下對(duì)對(duì)方主機(jī)的訪問(wèn)和控制的功能。系統(tǒng)設(shè)置:系統(tǒng)設(shè)置用于設(shè)置用戶界面、公共路徑、公告欄等的功能。2.2數(shù)據(jù)庫(kù)分析該系統(tǒng)是一個(gè)桌面應(yīng)用程序,它
6、不像web應(yīng)用那樣需要配置到指定的服務(wù)器上,所以數(shù)據(jù)庫(kù)和該系統(tǒng)應(yīng)存在于同一計(jì)算機(jī)中,這樣,不僅節(jié)省了開(kāi)銷,而且還提高了系統(tǒng)的安全性。該系統(tǒng)所用數(shù)據(jù)庫(kù)為javadb數(shù)據(jù)庫(kù)。由于該數(shù)據(jù)庫(kù)的運(yùn)行環(huán)境平臺(tái)要求較低,一般的電腦都可以滿足它的硬件條件。企業(yè)內(nèi)部通信系統(tǒng)的e-r圖該系統(tǒng)的實(shí)體包括用戶和窗口位置兩個(gè)實(shí)體,分別記錄著通信窗口的絕對(duì)位置和用戶的信息。 用戶實(shí)體用戶實(shí)體主要包括ip信息、pc名稱、用戶信息、系統(tǒng)信息等,它記錄了搜索到的用戶和所有的用戶信息。用戶實(shí)體的e-r圖如下。 用戶實(shí)體頭 像提示文本用戶信息ip地 址主機(jī)名稱 圖1用戶實(shí)體e-r圖窗體位置實(shí)體窗體位置實(shí)體記錄著窗體最后的移動(dòng)位置和
7、窗體大小等信息,主要包括窗體位置的橫坐標(biāo)和豎坐標(biāo)(下圖用x、y軸坐標(biāo)表示)、窗體的高度和寬度。它的e-r圖如下所示:x坐標(biāo)窗口實(shí)體y坐標(biāo)窗體高度窗體寬度圖2窗體位置e-r圖2.3 可行性分析2.3.1 技術(shù)可行性分析局域網(wǎng)通信系統(tǒng)的技術(shù)已經(jīng)非常成熟,首先,從硬件上講,計(jì)算機(jī)硬件速度現(xiàn)在已經(jīng)不是問(wèn)題,高速便捷的網(wǎng)絡(luò)已經(jīng)十分普遍,這些為本系統(tǒng)的運(yùn)行打下堅(jiān)實(shí)的基礎(chǔ)。從軟件的角度上講,數(shù)據(jù)庫(kù)技術(shù)已經(jīng)相當(dāng)成熟(目前用得比較多的有sql server, javadb等),并且處理能力也非常強(qiáng),這為海量數(shù)據(jù)的存儲(chǔ)和處理打下了堅(jiān)實(shí)的基礎(chǔ),同時(shí),使用java開(kāi)發(fā)圖形界面程序也相當(dāng)普遍。有了這些技術(shù)的支持,我們成
8、功開(kāi)發(fā)一個(gè)局域網(wǎng)通信系統(tǒng)沒(méi)有任何技術(shù)風(fēng)險(xiǎn)。2.3.2 經(jīng)濟(jì)可行性分析經(jīng)濟(jì)可行性主要是對(duì)項(xiàng)目的經(jīng)濟(jì)效益進(jìn)行評(píng)價(jià)。本系統(tǒng)開(kāi)發(fā)完成后可縮減工作時(shí)間,提高工作效率,而且簡(jiǎn)單易操作,不需對(duì)使用人員進(jìn)行培訓(xùn),不管是在資金上還是效率上都能達(dá)到預(yù)期的效果。本系統(tǒng)開(kāi)發(fā)經(jīng)費(fèi)對(duì)于企業(yè)在經(jīng)濟(jì)上是可以接受的,并且本系統(tǒng)實(shí)施后可以顯著提高工作效率,有助于企業(yè)的信息化管理,所以為該企業(yè)內(nèi)部通信系統(tǒng)在經(jīng)濟(jì)上是可行的。3.系統(tǒng)設(shè)計(jì)3.1 系統(tǒng)目標(biāo)系統(tǒng)根據(jù)企業(yè)對(duì)內(nèi)部通信系統(tǒng)的要求,本系統(tǒng)可以實(shí)現(xiàn)以下目標(biāo)。ü 操作簡(jiǎn)單、界面簡(jiǎn)潔美觀。ü 更方便訪問(wèn)企業(yè)公共資源。ü 及時(shí)顯示企業(yè)公共信息。ü
9、在通信窗口顯示對(duì)方ip信息。ü 局域網(wǎng)內(nèi)網(wǎng)用戶自動(dòng)搜索。ü 系統(tǒng)運(yùn)行穩(wěn)定、安全可靠。 3.2 系統(tǒng)功能系統(tǒng)功能結(jié)構(gòu)圖如下:企業(yè)信息通信系統(tǒng)信息通信系統(tǒng)設(shè)置用戶搜索訪問(wèn)公共資源訪問(wèn)對(duì)方主機(jī)圖 3系統(tǒng)功能結(jié)構(gòu)圖3.3 數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)在該系統(tǒng)中的數(shù)據(jù)庫(kù)db_eq包含兩個(gè)數(shù)據(jù)表,分別為用戶信息表tb_users和窗體位置信息表tb_location。ü 用戶信息表用戶信息表用來(lái)保存企業(yè)內(nèi)的通信用戶,表tb_users如下所示:1.用戶信息表tb_users字段名數(shù)據(jù)類型是否為空是否主鍵默認(rèn)值描 述i pvarchar(16)noyes用戶iphostvarchar(30)
10、yesnonull主機(jī)名稱namevarchar(20)yesnonull姓 名tooltipvarchar(50)yesnonull提示文本iconvarchar(50)yesnonull頭像圖標(biāo)ü 窗體位置信息表窗體位置表用來(lái)保存窗體的位置和大小,表tb_location如下所示:2.窗體位置信息表tb_location字段名數(shù)據(jù)類型是否為空是否主鍵默認(rèn)值描 述xlocationintyesnonullx軸坐標(biāo)ylocationintyesnonully軸坐標(biāo)heightintyesnonull窗體高度widthintyesnonull窗體寬度3.4 主要模塊的設(shè)計(jì)本系統(tǒng)分六個(gè)模
11、塊:主窗體模塊、公共模塊、系統(tǒng)托盤(pán)模塊、系統(tǒng)工具模塊、用戶管理模塊和通信模塊,其中通信模塊是本系統(tǒng)的核心模塊。3.4.1主窗體模塊設(shè)計(jì)主窗體界面是本系統(tǒng)的用戶列表,它由用戶列表、系統(tǒng)選項(xiàng)卡、公告提示等組成。其中系統(tǒng)選項(xiàng)卡用于切換不同的管理界面,包括系統(tǒng)設(shè)計(jì)和系統(tǒng)工具界面。主窗體的設(shè)計(jì)效果圖如下所示:圖4 主窗體界面示意圖3.4.2公共模塊設(shè)計(jì)在本系統(tǒng)的項(xiàng)目空間中,有部分模塊是公用的,或者多個(gè)模塊甚至整個(gè)系統(tǒng)的配置信息是被多個(gè)模塊重復(fù)調(diào)用完成業(yè)務(wù)的邏輯。其中有關(guān)數(shù)據(jù)庫(kù)的操作、連接數(shù)據(jù)庫(kù)、創(chuàng)建本機(jī)ip的默認(rèn)用戶(并添加到數(shù)據(jù)庫(kù)中)、從數(shù)據(jù)庫(kù)中獲取窗體位置和大小、添加或刪除指定用戶、更新用戶信息等。
12、3.4.3系統(tǒng)托盤(pán)模塊設(shè)計(jì)系統(tǒng)托盤(pán)模塊用于定義系統(tǒng)欄圖標(biāo)。本系統(tǒng)的主窗體是繼承對(duì)話框窗體編寫(xiě)的,該窗體在系統(tǒng)任務(wù)欄不會(huì)顯示任務(wù)標(biāo)題,如果主窗體最小化之后將會(huì)隱藏,這時(shí)必須使用快捷鍵或者系統(tǒng)托盤(pán)中的圖標(biāo)執(zhí)行顯示窗體的命令。系統(tǒng)托盤(pán)包含相應(yīng)的菜單,右鍵點(diǎn)擊會(huì)彈出選擇菜單,菜單包括三個(gè)選項(xiàng),分別是:“訪問(wèn)服務(wù)器”、“打開(kāi)”、“退出”。圖示如下: 圖5系統(tǒng)托盤(pán)示意圖3.4.4系統(tǒng)工具模塊設(shè)計(jì)本系統(tǒng)的工具模塊起到維護(hù)系統(tǒng)的作用,包括更換程序外觀、。設(shè)置ip范圍、用戶搜索和系統(tǒng)更新、設(shè)置系統(tǒng)公告路徑、設(shè)置公共程序路徑、系統(tǒng)登錄等功能。在該系統(tǒng)第一次運(yùn)行的時(shí),用戶搜索功能可以搜索內(nèi)部網(wǎng)絡(luò)中所有正在運(yùn)行的計(jì)算
13、機(jī)。本系統(tǒng)工具模塊中使用了java的lookandfeel外觀技術(shù),不同的外觀中控件的外觀也會(huì)不同,就比如我們常用的電腦中,windows經(jīng)典樣式和windowsxp樣式外觀的按鈕、列表、菜單、工具欄甚至窗體的外觀都不相同。在本系統(tǒng)中提供了“當(dāng)前系統(tǒng)”和“java默認(rèn)值”兩個(gè)外觀選項(xiàng),其中“java默認(rèn)值”是swing默認(rèn)的外觀,不需要特別設(shè)置,而“當(dāng)前系統(tǒng)”外觀需要使用相應(yīng)的方法獲取當(dāng)前系統(tǒng)的外觀名稱,然后將該外觀應(yīng)用于默認(rèn)的外觀。效果圖如下所示:圖6系統(tǒng)工具界面示意圖3.4.5用戶管理模塊設(shè)計(jì)用戶管理模塊類似于聊天軟件的好友列表,其中包含所有用戶信息,另外在用戶名稱上單擊鼠標(biāo)右鍵,會(huì)彈出相
14、應(yīng)的管理菜單,在該菜單中包含“添加用戶”、“更名”、“刪除用戶”、“信使群發(fā)(在沒(méi)有多選用戶的情況下無(wú)法進(jìn)行信使群發(fā))”、“訪問(wèn)主機(jī)資源”和“訪問(wèn)公共程序”,其中“訪問(wèn)主機(jī)資源”是訪問(wèn)該用戶的共享文件夾。相應(yīng)的運(yùn)行效果如下:圖7用戶管理界面示意圖3.4.6通信模塊設(shè)計(jì)通信模塊是本系統(tǒng)中的核心模塊,它用于局域網(wǎng)內(nèi)的用戶之間的通信,而卻這種通信方式能夠?qū)崿F(xiàn)多個(gè)用戶之間的通信,不會(huì)存在像我們打電話一樣時(shí)的占線問(wèn)題,增加了任務(wù)分配的方式。本模塊可以使用udp協(xié)議和信史兩種方式發(fā)送信息。我們通常所說(shuō)的通信工具,都是采用的客戶機(jī)/服務(wù)器(c/s)架構(gòu)的,c/s結(jié)構(gòu)是這樣的一種結(jié)構(gòu):它包括一個(gè)客戶機(jī)(或前端
15、),一個(gè)服務(wù)器(或稱后端),客戶機(jī)的作用是訪問(wèn)和處理遠(yuǎn)程服務(wù)器上的數(shù)據(jù),服務(wù)器的作用是接收和處理客戶機(jī)的數(shù)據(jù)請(qǐng)求。有時(shí),可能有多個(gè)客戶向同一個(gè)服務(wù)器同時(shí)請(qǐng)求服務(wù),這就需要服務(wù)器決定怎樣處理這些請(qǐng)求。client/server結(jié)構(gòu)是當(dāng)前數(shù)據(jù)庫(kù)應(yīng)用程序中極為流行的一種方式。尤其是網(wǎng)絡(luò)技術(shù)的發(fā)展,使得當(dāng)前很多系統(tǒng)都采用這種方式進(jìn)行構(gòu)造,其最大的優(yōu)點(diǎn)是將計(jì)算機(jī)工作任務(wù)分別由客戶端和服務(wù)器端來(lái)共同完成,這樣有利于充分合理的利用系統(tǒng)資源。另外它的服務(wù)器端還可以將信息集中起來(lái),任何客戶機(jī)都可以通過(guò)訪問(wèn)服務(wù)器而獲得所需的信息。client/server模型最終可歸結(jié)為一種“請(qǐng)求/應(yīng)答”關(guān)系。一個(gè)請(qǐng)求總是首先被
16、客戶發(fā)出,然后服務(wù)器總是被動(dòng)地接收請(qǐng)求,返回客戶需要的結(jié)果。在客戶發(fā)出一個(gè)請(qǐng)求之前,服務(wù)進(jìn)程一直處于休眠狀態(tài)。一個(gè)客戶提出請(qǐng)求后,服務(wù)進(jìn)程被“喚醒”并且為客戶提供服務(wù),對(duì)客戶的請(qǐng)求做出所需要的應(yīng)答。其工作示意圖如下:圖8 c/s模式下的網(wǎng)絡(luò)拓?fù)鋱D但是本系統(tǒng)如果要做成c/s架構(gòu)的話,需要在局域網(wǎng)內(nèi)設(shè)置一個(gè)服務(wù)器,而在企業(yè)局域網(wǎng)內(nèi),網(wǎng)絡(luò)結(jié)構(gòu)不是集中式的而是分布式的,可能沒(méi)有一臺(tái)機(jī)器來(lái)充當(dāng)服務(wù)器這個(gè)角色,同樣用服務(wù)器會(huì)增加本系統(tǒng)的設(shè)置難度,不符合本系統(tǒng)方便、快捷的特色,同時(shí)增加服務(wù)器后,所有數(shù)據(jù)都會(huì)經(jīng)過(guò)服務(wù)器保存處理,需要有專人看管維護(hù)服務(wù)器,顯得更麻煩。所以本系統(tǒng)采用每個(gè)程序自己既充當(dāng)客戶機(jī),又充
17、當(dāng)服務(wù)器,自己來(lái)維護(hù)網(wǎng)絡(luò)上的用戶列表,每?jī)蓚€(gè)客戶端進(jìn)行連接的時(shí)候都直接連通而不用增設(shè)服務(wù)器中轉(zhuǎn)。示意圖如下:圖9 無(wú)公共服務(wù)器模式下的網(wǎng)絡(luò)拓?fù)鋱D當(dāng)然,上述圖示只是通信數(shù)據(jù)的一個(gè)流向示意圖,不是真正的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),也就是說(shuō)其中的服務(wù)器可能只是裝了服務(wù)器軟件的一臺(tái)普通工作站。在底層的數(shù)據(jù)流向中,也就是網(wǎng)絡(luò)的物理連結(jié),并非我們這個(gè)軟件所能決定的,我們的所做都是在一個(gè)透明的數(shù)據(jù)通信層之上的。在該模塊中,使用基于udp協(xié)議的數(shù)據(jù)報(bào)和套接字實(shí)現(xiàn)計(jì)算機(jī)之間的信息通信。udp(user datagram protocol)協(xié)議就是“用戶數(shù)據(jù)報(bào)協(xié)議”,它是一種無(wú)連接的協(xié)議,在該協(xié)議進(jìn)行數(shù)據(jù)傳輸時(shí),發(fā)送方只需要知
18、道對(duì)方的ip地址和端口號(hào)就可以發(fā)送數(shù)據(jù)了,并不需要進(jìn)行連接,當(dāng)遠(yuǎn)程主機(jī)端口號(hào)出于監(jiān)聽(tīng)狀態(tài)時(shí),則udp必須出于連接狀態(tài)。通信的聊天界面運(yùn)行效果如下所示:圖10 聊天界面示意圖4.詳細(xì)設(shè)計(jì)和代碼實(shí)現(xiàn)4.1主窗體模塊的實(shí)現(xiàn)過(guò)程主窗體實(shí)現(xiàn)部分包括創(chuàng)建主窗體和記錄窗體位置。其中創(chuàng)建主窗體的步驟如下:(1)創(chuàng)建jxcframe類,在類中創(chuàng)建窗體的對(duì)象,為窗體添加選項(xiàng)卡面板,并添加用戶列表、系統(tǒng)工具、系統(tǒng)設(shè)置3個(gè)選項(xiàng)卡和狀態(tài)欄標(biāo)簽、公告按鈕等屬性。在構(gòu)造方法中初始化窗體上的控件。數(shù)據(jù)庫(kù)操作類、首選項(xiàng)對(duì)象等屬性,為窗體添加時(shí)間監(jiān)聽(tīng)器、為公告信息按鈕添加監(jiān)聽(tīng)器等。(2)初始化socket服務(wù)器,指定端口為111
19、1,如初始化失敗,則提示服務(wù)器端口被占用或本軟件已運(yùn)行,并退出本系統(tǒng)。用于接收其他用戶發(fā)送的通信信息。關(guān)鍵代碼如下:try / 啟動(dòng)通訊服務(wù)端口ss = new datagramsocket(1111); catch (socketexception e2) if (e2.getmessage().startswith("address already in use")showmessagedialog("服務(wù)端口被占用,或者本軟件已經(jīng)運(yùn)行。");system.exit(0);(3) checkplacard方法,用于檢測(cè)系統(tǒng)公告,當(dāng)公告路徑中存在系統(tǒng)公
20、告是,將從文件中獲取完整信息,調(diào)用pushmessage()方法將信息壓入公告信息棧中。關(guān)鍵代碼如下:private void checkpacard() / 檢測(cè)公告信息方法string placarddir = preferences.get("placardpath", null);if (placarddir = null) pushmessage("未設(shè)置公告路徑");return;file placard = new file(placarddir);try if (placard.exists() && placard.is
21、file() 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("公告路徑錯(cuò)誤,或公告文件不存在");(4)inituserinfobutton()方法用于初
22、始化本地用戶信息,并在主窗體左上角顯示本地用戶的頭像和名稱,會(huì)在用戶更改本地用戶名稱時(shí)同步更新。(5) main()方法,本方法首先獲取用戶設(shè)置的界面外觀,然后調(diào)用uimanager類設(shè)置指定的外觀,生成主窗體對(duì)象。最后初始化服務(wù)器端口和系統(tǒng)欄圖標(biāo)。以下為關(guān)鍵代碼:public static void main(string args) try string laf = preferences.get("lookandfeel", "java默認(rèn)");/獲取用戶選擇的外觀if (laf.indexof("當(dāng)前系統(tǒng)")>-1)ui
23、manager.setlookandfeel(uimanager.getsystemlookandfeelclassname();/設(shè)置外觀eq frame = new eq();frame.setvisible(true);/顯示窗體frame.systemtrayinitial();/ 初始化系統(tǒng)欄frame.server();/啟動(dòng)服務(wù)端口frame.checkplacard();/檢測(cè)系統(tǒng)公告 catch (exception e) e.printstacktrace(); 記錄窗體的位置步驟如下:為窗體添加監(jiān)聽(tīng)器,當(dāng)改變窗體的位置和大小時(shí),將調(diào)用savelocation()方法將窗體
24、和位置大小保存到數(shù)據(jù)庫(kù)中。savelocation(),該方法中調(diào)用了dao類中的updatelocation將窗體的位置和大小保存到數(shù)據(jù)庫(kù)中。4.2公共模塊的實(shí)現(xiàn)過(guò)程公共模塊包括數(shù)據(jù)庫(kù)操作類和系統(tǒng)工具類。其中dao類主要負(fù)責(zé)有關(guān)數(shù)據(jù)庫(kù)的操作,該類在構(gòu)造方法中驅(qū)動(dòng)并連接數(shù)據(jù)庫(kù),然后將構(gòu)造方法設(shè)置為private私有屬性,通過(guò)靜態(tài)的getdao()獲取dao類的實(shí)例對(duì)象,這是簡(jiǎn)單的單例模式。在連接數(shù)據(jù)庫(kù)時(shí),可以指定create參數(shù)為true直接創(chuàng)建數(shù)據(jù)庫(kù),但在此之前需要調(diào)用dbexist()方法判斷數(shù)據(jù)庫(kù)是否存在。resource類是企業(yè)內(nèi)部通信系統(tǒng)中的工具類,該類中的方法都是靜態(tài)的,可以直接調(diào)
25、用,而不用創(chuàng)建resource類的實(shí)例對(duì)象。這些工具方法包括搜索用戶的方法、登錄公共資源的方法、信使群發(fā)的方法和單條信息發(fā)送的方法。4.3系統(tǒng)工具模塊的實(shí)現(xiàn)過(guò)程(1)createsystoolpanel()方法,用于創(chuàng)建系統(tǒng)工具選項(xiàng)卡,在該選項(xiàng)卡中包括界面選擇、用戶搜索和系統(tǒng)操作3部分,其中系統(tǒng)操作用于程序更新,它們都被添加到系統(tǒng)工具面板中,createsystoolpanel()方法必須設(shè)置好面板的布局和初始化工作。(2)在createsystoolpanel()方法中創(chuàng)建界面選擇部分,該部分以列表控件顯示了兩種外觀選擇,當(dāng)用戶選擇其中以種外觀并單擊“確定”按鈕之后,選擇外觀會(huì)保存到首選項(xiàng)中
26、,然后提示重新運(yùn)行本軟件。(3)在createsystoolpanel()方法中創(chuàng)建用戶搜索部分,包括搜索列表、搜索進(jìn)度條和“搜索新用戶”3個(gè)控件,當(dāng)單擊“搜索新用戶”按鈕時(shí),系統(tǒng)會(huì)根據(jù)用戶在系統(tǒng)設(shè)置界面所設(shè)置的ip搜索范圍搜索所有計(jì)算機(jī)信息,并創(chuàng)建相應(yīng)的用戶對(duì)象,然后保存到數(shù)據(jù)庫(kù)中。(4)創(chuàng)建“搜索新用戶”按鈕的事件監(jiān)聽(tīng)器searchuseractionlistener類,調(diào)用resource工具類的searchusers()方法搜索指定ip范圍內(nèi)的所有用戶。系統(tǒng)工具類中的searchusers()方法,該方法用于搜索局域網(wǎng)內(nèi)的通信用戶,也就是搜索企業(yè)內(nèi)的所有職工。本方法將獲取用戶指定的ip
27、范圍,并在該范圍內(nèi)搜索所有可以訪問(wèn)的計(jì)算機(jī),如果用戶沒(méi)有指定ip范圍,系統(tǒng)默認(rèn)的是-55。該方法的關(guān)鍵代碼如下: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; / 記錄
28、第二層循環(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);retur
29、n;thread.sleep(100);/線程休息100毫秒string ip = l + "." + k + "." + j + "." + i;progressbar.setstring("正在搜索:" + ip);/取消進(jìn)度條的滾動(dòng)if (tree.adduser(ip, "search")/添加新用戶model.addelement("<html><b><font color=green>添加"+ ip + "</f
30、ont></b></html>");catch(exception e) e.printstacktrace();4.4系統(tǒng)托盤(pán)模塊的實(shí)現(xiàn)過(guò)程在jdk6.0中,awt新增加了systemtray類和trayicon類,它們可以在系統(tǒng)托盤(pán)區(qū)創(chuàng)建一個(gè)托盤(pán)程序。systemtray類表示桌面右下角的系統(tǒng)托盤(pán),系統(tǒng)托盤(pán)由運(yùn)行在桌面上的所有應(yīng)用程序共享,可以使用getsystemtray()方法獲取系統(tǒng)托盤(pán)對(duì)象,該方法總是對(duì)每個(gè)應(yīng)用程序返回相同的實(shí)例。并不是所有的操作系統(tǒng)都支持系統(tǒng)托盤(pán),如果當(dāng)前系統(tǒng)不支持托盤(pán)的話,該方法將自動(dòng)拋出異常。為避免程序出現(xiàn)錯(cuò)誤,在獲取系
31、統(tǒng)托盤(pán)實(shí)例之前,需要檢查系統(tǒng)托盤(pán)是否支持??梢哉{(diào)用issupport()來(lái)實(shí)現(xiàn)。systemtray類可以包含一個(gè)或多個(gè)trayicon類的實(shí)例,即系統(tǒng)欄圖標(biāo),可以使用add()將它們添加到托盤(pán),trayicon對(duì)象由圖像、彈出菜單和一組相關(guān)監(jiān)聽(tīng)器組成。創(chuàng)建系統(tǒng)托盤(pán)的關(guān)鍵代碼如下:try string title = "eq通訊軟件"/系統(tǒng)欄提示文本的標(biāo)題string company = "吉林省xxx科技有限公司"/系統(tǒng)欄提示文本systemtray systray = systemtray.getsystemtray();/獲取系統(tǒng)托盤(pán)對(duì)象image
32、 image = toolkit.getdefaulttoolkit().getimage(eq.class.getresource("/icons/systray.png");/ 系統(tǒng)欄圖標(biāo)trayicon = new trayicon(image, title + "n" + company, createmenu(); /創(chuàng)建系統(tǒng)欄圖標(biāo)對(duì)象trayicon.setimageautosize(true);/設(shè)置自動(dòng)大小trayicon.addactionlistener(new systrayactionlistener();/添加監(jiān)聽(tīng)器systra
33、y.add(trayicon);/添加系統(tǒng)欄圖標(biāo)到系統(tǒng)托盤(pán)trayicon.displaymessage(title, company, messagetype.info); catch (exception e) e.printstacktrace();4.5用戶管理模塊的實(shí)現(xiàn)過(guò)程管理模塊實(shí)現(xiàn)步驟如下:(1)創(chuàng)建usertreeranderer類,該類繼承jpanel類成為一個(gè)面板控件,同時(shí)該類也實(shí)現(xiàn)了treecellrenderer接口成為樹(shù)節(jié)點(diǎn)的渲染器。該類的構(gòu)造方法接受3個(gè)圖標(biāo)參數(shù),分別用于樹(shù)節(jié)點(diǎn)的打開(kāi)、關(guān)閉和葉節(jié)點(diǎn)的圖標(biāo)。(2)在usertreeranderer類中的gettreec
34、ellrenderercomponent()方法,渲染樹(shù)節(jié)點(diǎn)的界面樣式。本方法獲取主窗體的寬度,并使用該寬度設(shè)置節(jié)點(diǎn)的寬度,是節(jié)點(diǎn)與窗體同寬度,當(dāng)選擇某個(gè)節(jié)點(diǎn)時(shí),該方法將使用指定顏色繪制節(jié)點(diǎn)的邊框,以突出該節(jié)點(diǎn)被選擇的效果。(3)創(chuàng)建chattree類,該類繼承jtree自定義的樹(shù)控件,并且使用了之前定義的usertreeranderer樹(shù)節(jié)點(diǎn)渲染器, sortusers()方法,此方法是一個(gè)內(nèi)部線程,該線程獲取本地的ip地址,使用該地址從數(shù)據(jù)庫(kù)中獲取本地用戶對(duì)象,并將本地用戶設(shè)置在用戶列表首位。然后從數(shù)據(jù)庫(kù)中獲取其它用戶對(duì)象。使第一個(gè)用戶處于被選擇狀態(tài),并更新?tīng)顟B(tài)欄的用戶人數(shù)。關(guān)鍵代碼如下:
35、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ù)庫(kù)中獲取自己的信息if (localuser != null) / 把自己顯示在首位defaultmutabletreenod
36、e node = new defaultmutabletreenode(localuser);root.add(node);usermap = dao.getusers();iterator<user> iterator = usermap.iterator();while (iterator.hasnext() / 遍歷用戶集合user user = iterator.next();if(user.getip().equals(localuser.getip()continue;root.add(new defaultmutabletreenode(user);/添加用戶到根節(jié)點(diǎn)
37、treemodel.reload();chattree.this.setselectionrow(0);/使第一個(gè)節(jié)點(diǎn)被選擇if (eq != null)eq.setstatic("總?cè)藬?shù):" + getrowcount();/更新?tīng)顟B(tài)欄標(biāo)簽 catch (exception e) e.printstacktrace();).start();(4)在chattree中的deluser()方法,用于刪除當(dāng)前用戶列表中選擇的用戶對(duì)象。該方法首先獲取選擇的樹(shù)節(jié)點(diǎn),從該節(jié)點(diǎn)中獲取綁定的用戶對(duì)象,經(jīng)用戶確認(rèn)后刪除用戶信息,最后調(diào)用根節(jié)點(diǎn)的remove()方法刪除該用戶節(jié)點(diǎn)。另外是ad
38、duser()方法,用于在用戶列表中添加新用戶。本方法首先使用傳遞的ip參數(shù)到數(shù)據(jù)庫(kù)中獲取對(duì)應(yīng)的用戶對(duì)象,如成功獲取,說(shuō)明數(shù)據(jù)庫(kù)已存在該用戶,系統(tǒng)會(huì)提示“已存在”,當(dāng)確定該ip可以訪問(wèn)后,為該ip地址創(chuàng)建一個(gè)新的用戶并添加到數(shù)據(jù)庫(kù)中。關(guān)鍵代碼如下:public boolean adduser(string ip, string opration) / 添加用戶try if (ip = null)return false;user olduser = dao.getuser(ip);/從數(shù)據(jù)庫(kù)中獲取ip相同用戶if (olduser = null) / 如果數(shù)據(jù)庫(kù)中不存在該用戶inetaddre
39、ss addr = inetaddress.getbyname(ip);/該用戶可以訪問(wèn)if (addr.isreachable(1500) string host = addr.gethostname();/獲取它的主機(jī)名稱root.add(new defaultmutabletreenode(new user(host, ip);user newuser = new user();/創(chuàng)建新用戶對(duì)象newuser.setip(ip); /設(shè)置ipnewuser.sethost(host);/設(shè)置主機(jī)名稱newuser.setname(host);/設(shè)置用戶姓名newuser.seticon(
40、"1.gif");/設(shè)置頭像dao.adduser(newuser);/添加該用戶到數(shù)據(jù)庫(kù)中sortusers();/用于重新加載用戶列表if (!opration.equals("search")joptionpane.showmessagedialog(eq.frame, "用戶" + host+ "添加成功", "添加用戶",joptionpane.information_message);return true; else /如果該用戶ip不可訪問(wèn)if (!opration.equals
41、("search")joptionpane.showmessagedialog(eq.frame, "檢測(cè)不到用戶ip:"+ ip, "錯(cuò)誤添加用戶", joptionpane.error_message);/對(duì)話框提示錯(cuò)誤return false; else /如果數(shù)據(jù)庫(kù)中存在該ip用戶if (!opration.equals("search") /并且不是系統(tǒng)自動(dòng)搜索joptionpane.showmessagedialog(eq.frame, "已經(jīng)存在用戶ip" + ip,"不
42、能添加用戶", joptionpane.warning_message);/提示已存在!return false; catch (exception e) e.printstacktrace();return false;4.6通信模塊的實(shí)現(xiàn)過(guò)程(1) 創(chuàng)建telframe類,在該類中集成jframe類實(shí)現(xiàn)swing的窗體,定義窗體需要的所有控件,列入發(fā)送按鈕、接受信息的文本框、輸入發(fā)送信息的文本框、信使按鈕以及各種滾動(dòng)面板等,定義訪問(wèn)數(shù)據(jù)庫(kù)的dao實(shí)例,在通信窗口右側(cè)顯示的用戶列表使用dao實(shí)例從數(shù)據(jù)庫(kù)中獲取。(2)getinstance()方法,用于獲取唯一的窗體實(shí)例。該方法創(chuàng)建
43、的所有窗體實(shí)例都會(huì)保存到map集合類的實(shí)例中,窗體的實(shí)例對(duì)象會(huì)一直保存在這個(gè)集合類中,并且用戶再次打開(kāi)已存在的窗體時(shí),將直接從集合類中獲取,不再創(chuàng)建新的窗體實(shí)例。關(guān)鍵代碼如下:public static synchronized telframe getinstance(datagramsocket ssarg,datagrampacket dp, chattree treearg) string tmpip = dp.getaddress().gethostaddress();/獲取數(shù)據(jù)報(bào)的ip地址if (!instance.containskey(tmpip) /如果集合中不存在該用戶窗體
44、telframe frame = new telframe(ssarg, dp, treearg);/創(chuàng)建窗體實(shí)例instance.put(tmpip, frame);/將窗體實(shí)例保存到集合中frame.receiveinfo(treearg);/接受信息if (!frame.isvisible() /如果窗體處于隱藏狀態(tài)frame.setvisible(true);/顯示窗體frame.setstate(jframe.normal);frame.tofront();/將窗體放置在最前端return frame; else /如果集合中包含該用戶窗體telframe frame = insta
45、nce.get(tmpip);/從集合中獲取該窗體實(shí)例frame.setbufs(dp.getdata();frame.receiveinfo(treearg);/接受信息if (!frame.isvisible() frame.setvisible(true);/顯示窗體frame.setstate(jframe.normal);frame.tofront();return frame;(3)在構(gòu)造方法中初始化telframe類的所有控件屬性,該構(gòu)造方法接收datagramsocket、datagrampacket和chattree類的三個(gè)參數(shù),他們分別是數(shù)據(jù)socket服務(wù)、數(shù)據(jù)報(bào)和用戶列
46、表的實(shí)例對(duì)象。(4)receiveinfo()方法,用于接收其它用戶發(fā)送的通信信息。該方法中首先從數(shù)據(jù)報(bào)中獲取發(fā)送信息的用戶ip地址,然后從數(shù)據(jù)庫(kù)中獲取該ip用戶的姓名,同時(shí)將這些用戶ip、用戶姓名和發(fā)送時(shí)間以藍(lán)色字體顯示到信息文本框中,最后將數(shù)據(jù)報(bào)中的通信信息文本追加到信息文本框中。代碼如下:private void receiveinfo(final chattree tree) / 接收信息if (buf.length > 0) string rtext = new string(buf).replace("" + (char) 0, "")
47、;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)聽(tīng)器sendactionlistener類,它實(shí)現(xiàn)了actionlist
48、ener接口,擁有處理按鈕事件的能力,它在actionperformed()方法中獲取數(shù)據(jù)報(bào)中的通信信息。創(chuàng)建messagebuttonaction內(nèi)部類,該類是“信使”按鈕的事件監(jiān)聽(tīng)器。當(dāng)用戶輸入通信信息并單擊“信使”按鈕時(shí),監(jiān)聽(tīng)器則調(diào)用sendmessage()方法將通信信息以系統(tǒng)信使方式發(fā)送到對(duì)方的計(jì)算機(jī)。關(guān)鍵代碼如下:class sendactionlistener implements actionlistener public void actionperformed(final actionevent e) string sendinfo = getsendinfo();/獲取發(fā)
49、送信息if (sendinfo = null)return;insertuserinfotoreceivetext(tree);appendreceivetext(sendinfo + "n", null);/添加到信息文本框byte tmpbuf = sendinfo.getbytes();datagrampacket tdp = null; /創(chuàng)建數(shù)據(jù)報(bào)try tdp = new datagrampacket(tmpbuf, tmpbuf.length,new inetsocketaddress(ip, 1111);/初始化數(shù)據(jù)報(bào)ss.send(tdp); /發(fā)送數(shù)據(jù)報(bào) catch (socketexception e2) e2.printstacktrace(); catch (ioexception e1) e1.printstacktrace();joptionpane.showmessagedialog(telframe.this, e1.getmessage();sendtext.settext(null);/清空發(fā)送文本框sendtext.requestfo
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024家裝裝修合同模板
- 誠(chéng)信苗木購(gòu)銷協(xié)議
- 浙江省七年級(jí)上學(xué)期語(yǔ)文期中測(cè)試仿真模擬試卷5套【附答案】
- 2024工廠承包合同協(xié)議書(shū)
- 簡(jiǎn)易買賣合同模板2024年
- 廣東省房產(chǎn)交易合同中介版
- 600字標(biāo)準(zhǔn)委托加工協(xié)議書(shū)
- 雙邊工程合作合同范本
- 建筑工程拆除協(xié)議
- 跨國(guó)合資銷售代理協(xié)議
- 小學(xué)英語(yǔ)就業(yè)能力展示
- 心肌病和心肌炎課件
- 《艾滋病毒》課件
- 平陽(yáng)港區(qū)西灣作業(yè)區(qū)防浪導(dǎo)流堤工程海域使用論證報(bào)告書(shū)
- 管道保溫計(jì)算公式
- 錄音行業(yè)的就業(yè)生涯發(fā)展報(bào)告
- 報(bào)廢汽車拆解工藝流程
- 生化報(bào)告解讀
- 胃癌科普講座課件
- 熔煉車間工安全培訓(xùn)
- 《多彩的職業(yè)》參考課件
評(píng)論
0/150
提交評(píng)論