版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 畢業(yè)論文(設(shè)計)</b></p><p> GRADUATION THESIS (DESIGN)</p><p> 論文(設(shè)計)題目Title Of Thesis(Design)數(shù)據(jù)采集系統(tǒng)</p><p> 分院(系別)Department計算機科學(xué)與技術(shù)學(xué)院 </p><
2、;p> 專 業(yè)Speciality計算機科學(xué)與技術(shù) 班級Class</p><p> 論文(設(shè)計)作者Author of Thesis(Design)論文完成日期Date2011年05月</p><p> 論文(設(shè)計)指導(dǎo)教師Advisor指導(dǎo)教師職稱The Title of Advisor講師 </p><p><b> 數(shù)據(jù)采集系統(tǒng)<
3、;/b></p><p><b> [摘要]</b></p><p> 數(shù)據(jù)采集系統(tǒng)由以下幾個功能模塊組成:數(shù)據(jù)讀取模塊,數(shù)據(jù)匹配模塊,數(shù)據(jù)發(fā)送模塊,數(shù)據(jù)接收模塊,數(shù)據(jù)保存模塊和數(shù)據(jù)整合模塊,每個模塊的核心功能如下:數(shù)據(jù)讀取模塊:負(fù)責(zé)從用戶登錄記錄文件和未匹配登錄記錄文件中讀取用戶的登錄記錄數(shù)據(jù),將其轉(zhuǎn)化為LogRec 對象,然后傳遞給數(shù)據(jù)匹配模塊匹配;數(shù)據(jù)
4、匹配模塊:負(fù)責(zé)將用戶登錄記錄數(shù)據(jù),按照登入/登出的關(guān)系匹配起來,形成匹配的用戶登錄記錄數(shù)據(jù)(MatchedLogRec 對象),并計算出每次登錄的時間長度;數(shù)據(jù)發(fā)送模塊:將匹配好的用戶登錄記錄通過網(wǎng)絡(luò)發(fā)送到采集系統(tǒng)服務(wù)器;數(shù)據(jù)接收模塊:服務(wù)器端接收匹配好的用戶登錄記錄數(shù)據(jù);數(shù)據(jù)保存模塊:將接受到的用戶登錄記錄數(shù)據(jù)保存到數(shù)據(jù)庫的用戶登錄記錄明細(xì)表中;數(shù)據(jù)整合模塊:將用戶登錄記錄明細(xì)表中的數(shù)據(jù)整合成日報表,月報表和年報表。</p>
5、;<p> 關(guān)鍵字:數(shù)據(jù)采集系統(tǒng) 數(shù)據(jù)讀取 數(shù)據(jù)匹配 數(shù)據(jù)發(fā)送 數(shù)據(jù)接收 數(shù)據(jù)保存 數(shù)據(jù)整合</p><p> Data Collection System</p><p> [Abstract] </p><p> Data collection system consists of the following function
6、modules: data read module, data matching module, data sending module, data receiving module, data storage module and data integration modules, each module core functions as follows: Data read module: be responsible for f
7、rom user login record files and not matching login record files read user login record data, convert it to LogRec object, then transfer to data matching module matching; Data matching module: be responsible for user logi
8、n </p><p> Keywords: Data collection system Data read Data matching Data sending Data receiving Data storage Data integration</p><p><b> 目 錄</b></p><p><b>
9、; 第一章緒 論1</b></p><p><b> 1.項目背景1</b></p><p><b> 2.項目原理1</b></p><p> 第二章 需求分析2</p><p><b> 1. 數(shù)據(jù)格式2</b></p>&
10、lt;p><b> 2. 功能概述3</b></p><p> 2.1. 數(shù)據(jù)讀取4</p><p> 2.2. 數(shù)據(jù)匹配4</p><p> 2.3. 數(shù)據(jù)發(fā)送4</p><p> 2.4. 數(shù)據(jù)接收4</p><p> 2.5. 數(shù)據(jù)保存4</p>
11、<p><b> 3. 系統(tǒng)用例4</b></p><p> 3.1. 用例圖4</p><p> 3.2. 用例描述5</p><p> 3.2.1. 數(shù)據(jù)采集5</p><p> 3.2.2. 數(shù)據(jù)讀取5</p><p> 3.2.3. 讀取上次未匹配的登入記錄
12、5</p><p> 3.2.4. 讀取用戶登錄數(shù)據(jù)文件6</p><p> 3.2.5. 數(shù)據(jù)匹配6</p><p> 3.2.6. 匹配登錄記錄7</p><p> 3.2.7. 保存未匹配的登入記錄7</p><p> 3.2.8. 數(shù)據(jù)發(fā)送7</p><p> 3
13、.2.9. 數(shù)據(jù)接收8</p><p> 3.2.10. 數(shù)據(jù)保存8</p><p> 第三章 概要設(shè)計9</p><p><b> 1. 總體設(shè)計9</b></p><p> 1.1. 業(yè)務(wù)流程9</p><p> 1.2. 系統(tǒng)模塊10</p><p
14、> 2. 接口設(shè)計11</p><p> 2.1. 用戶接口11</p><p> 2.2. 外部接口11</p><p> 2.3. 內(nèi)部接口11</p><p> 3. 數(shù)據(jù)結(jié)構(gòu)設(shè)計12</p><p> 3.1. 登入/登出記錄數(shù)據(jù)類12</p><p>
15、3.1.1. LogRec 類圖:12</p><p> 3.1.2. LogRec 類成員變量說明:12</p><p> 3.2. 匹配的用戶登錄記錄類12</p><p> 3.2.1. MatchedLogRec 類圖:13</p><p> 3.2.2. MatchedLogRec 類成員變量說明:13</p
16、><p> 第四章 詳細(xì)設(shè)計14</p><p> 1. 系統(tǒng)架構(gòu)綜述14</p><p> 2. 靜態(tài)結(jié)構(gòu)設(shè)計14</p><p> 2.1. 數(shù)據(jù)實體類14</p><p> 2.1.1. 登入/登出記錄數(shù)據(jù)類14</p><p> 2.2. 數(shù)據(jù)庫表設(shè)計15</
17、p><p> 2.3. 總體類圖16</p><p> 2.4. DataGather 類17</p><p> 2.4.1. DataGather 類定義17</p><p> 2.4.2. DataGather 類方法說明18</p><p> 2.5. DataReader 類18</p&g
18、t;<p> 2.5.1. DataReader 類定義18</p><p> 2.5.2. DataReader 成員變量說明19</p><p> 2.5.3. DataReader 類方法說明19</p><p> 2.6. DataMatcher 類22</p><p> 2.6.2. DataMatc
19、her 類成員變量說明22</p><p> 2.6.3. DataMatcher 類方法說明22</p><p> 2.7. DataSender 類25</p><p> 2.7.1. DataSender 類定義25</p><p> 2.7.2. DataSender 類成員變量說明25</p><
20、;p> 2.7.3. DataSender 類方法說明25</p><p> 2.8. DMSServer 類27</p><p> 2.8.1. DMSServer 類定義27</p><p> 2.8.2. DMSServer 類成員變量說明27</p><p> 2.8.3. DMSServer 類方法說明27
21、</p><p> 2.9. DMSServerThread 類29</p><p> 2.9.1. DMSServerThread 類定義29</p><p> 2.10.LogWriter 接口及DBLogWriter 類31</p><p> 2.10.1. LogWriter 接口方法說明31</p>&
22、lt;p> 2.11.DataCombinator 類32</p><p> 2.11.1. DataCombinator 類定義32</p><p> 2.11.2. DataCombinator 類成員變量說明32</p><p> 2.11.3. DataCombinator 類方法說明32</p><p> 第
23、五章 系統(tǒng)實現(xiàn)34</p><p> 1. 登錄界面34</p><p> 2. 系統(tǒng)操作主頁面34</p><p> 2.1服務(wù)端實現(xiàn)35</p><p> 2.1.1 DMSServer 類35</p><p> 2.1.2 DMSServerThread類36</p><
24、p> 2.1.3 DBLogWriter類37</p><p> 2.1.4 FileLogWriter類37</p><p> 2.2 客戶端實現(xiàn)38</p><p> 2.2.1 數(shù)據(jù)讀取38</p><p> 2.2.2 數(shù)據(jù)發(fā)送40</p><p> 2.2.3數(shù)據(jù)匹配42<
25、/p><p> 2.3 數(shù)據(jù)整合實現(xiàn)44</p><p> 2.3.1 整合成日報表44</p><p> 2.3.2 整合成月報表45</p><p> 2.3.3 整合成年報表46</p><p><b> 結(jié) 論46</b></p><p> 致
26、 謝 語48</p><p><b> 參考文獻(xiàn)49</b></p><p><b> 緒 論</b></p><p><b> 1.項目背景</b></p><p> 在電信的業(yè)務(wù)中,有一種Unix 實驗室出租業(yè)務(wù)。只要用戶向電信運營商申請一個Unix帳號,就可
27、以遠(yuǎn)程登錄Unix 實驗室,并使用Unix 系統(tǒng)。用戶使用電信運營商提供的Unix 實驗室的服務(wù)需要繳納一定的費用,電信運營商需要一套數(shù)據(jù)采集系統(tǒng),把用戶登錄實驗室的時間長度數(shù)據(jù)采集起來,便于在指定的時間范圍內(nèi)作為對用戶的收費依據(jù)。</p><p> 要求數(shù)據(jù)采集系統(tǒng)必須采集如下信息:登錄用戶名,登錄的時間,登出的時間,登錄總的在線時間,登錄的實驗室IP,用戶的終端IP 等信息。</p><
28、p> DMS項目需要開發(fā)這樣一個通用的數(shù)據(jù)采集系統(tǒng)程序,來采集Unix 機器記錄的用戶</p><p> 登入和登出的原始記錄,并將這些記錄解析匹配成用戶的登錄記錄,并將其以可閱讀的文本形式保存在文件中。</p><p> 任何用戶登錄Unix 系統(tǒng),Unix 系統(tǒng)都會記錄用戶的登錄信息,所有用戶登入/登出的信息都保存在Unix 的系統(tǒng)日志文件中。數(shù)據(jù)采集系統(tǒng)就是通過讀取Uni
29、x 系統(tǒng)日志文件中用戶登入/登出信息,并找出成對的登入/登出記錄,得到用戶登錄實驗室的登入時刻、登出時刻、登錄時間長度等電信用戶收費需要使用的數(shù)據(jù),最后把匹配處理好的數(shù)據(jù)保存成電信工作人員可以閱讀的文本文件,做為電信收費依據(jù)。</p><p><b> 2.項目原理</b></p><p> 數(shù)據(jù)采集系統(tǒng)項目需要開發(fā)這樣一個通用的數(shù)據(jù)采集系統(tǒng)程序,來采集Unix
30、機器記錄的用戶登入和登出的原始記錄,并將這些記錄解析匹配成用戶的登錄記錄,并將其以可閱讀的文本形式保存在文件中。</p><p> 任何用戶登錄Unix 系統(tǒng),Unix 系統(tǒng)都會記錄用戶的登錄信息,所有用戶登入/登出的信息都保存在Unix 的系統(tǒng)日志文件中。數(shù)據(jù)采集系統(tǒng)就是通過讀取Unix 系統(tǒng)日志文件中用戶登入/登出信息,并找出成對的登入/登出記錄,得到用戶登錄實驗室的登入時刻、登出時刻、登錄時間長度等電信用
31、戶收費需要使用的數(shù)據(jù),最后把匹配處理好的數(shù)據(jù)保存成電信工作人員可以閱讀的文本文件,做為電信收費依據(jù)。</p><p><b> 第二章 需求分析</b></p><p><b> 1. 數(shù)據(jù)格式</b></p><p> 用戶登錄 Unix 系統(tǒng)的日志記錄文件在Unix 的/var/adm 目錄下,文件名是wtmp
32、x,日志記錄文件是一個二進(jìn)制文件,在Unix 中可以使用last 指令查看,last 命令格式為:last [-a] [-n number | -number] [-f filename] [name | tty]</p><p> wtmpx 文件中一條登錄記錄包含372 字節(jié),每條記錄包含的數(shù)據(jù)項格式說明如下表2-1所示: (其中黃色背景標(biāo)識的數(shù)據(jù)項就是要采集的數(shù)據(jù)項)</p><p&g
33、t; 【表2-1:用戶登錄記錄數(shù)據(jù)項格式】</p><p> 登錄記錄總數(shù)計算公式為:登錄記錄總數(shù)=日志文件大小/372。</p><p> 表 2‐2:要讀取的原始記錄數(shù)據(jù)</p><p> 表 2-3:匹配登錄記錄數(shù)據(jù)</p><p> 用戶的登錄記錄數(shù)據(jù)匹配好后需要按照一定的格式保存在本地文件中,這些文件都是可閱讀的文本文件,
34、其文件格式為:一行代表一條登錄記錄,每條登錄記錄使用如下字段:UID,登錄時間,登出時間,登錄時長,終端IP。字段間使用制表符(’\t’)分隔,如下圖所示:</p><p><b> 2. 功能概述</b></p><p> 數(shù)據(jù)采集系統(tǒng)主要實現(xiàn)以下核心功能:數(shù)據(jù)讀取,數(shù)據(jù)匹配,數(shù)據(jù)發(fā)送,數(shù)據(jù)接收,數(shù)</p><p><b>
35、據(jù)保存。</b></p><p> 數(shù)據(jù)采集客戶端 數(shù)據(jù)采集服務(wù)器</p><p><b> 圖2-1:系統(tǒng)功能</b></p><p><b> 2.1. 數(shù)據(jù)讀取</b></p><p>
36、 該功能模塊的主要任務(wù)是讀取 Unix 機器的用戶登錄記錄文件,將文件的信息解析為程序?qū)ο?,以方便匹配模塊的匹配。</p><p><b> 2.2. 數(shù)據(jù)匹配</b></p><p> 該模塊的主要任務(wù)是將數(shù)據(jù)讀取模塊讀取到的數(shù)據(jù)按照登入/登出的關(guān)系匹配成一條完整的登錄記錄。</p><p><b> 2.3. 數(shù)據(jù)發(fā)送<
37、;/b></p><p> 該模塊的主要任務(wù)是建立客戶端網(wǎng)絡(luò)連接,將匹配好的用戶登錄記錄以字符串的形式發(fā)送到服務(wù)器。</p><p><b> 2.4. 數(shù)據(jù)接收</b></p><p> 該模塊的主要任務(wù)是建立服務(wù)器端網(wǎng)絡(luò)連接,從客戶端讀取匹配好的用戶登錄記錄字符串。</p><p><b>
38、2.5. 數(shù)據(jù)保存</b></p><p> 該模塊的主要任務(wù)是將數(shù)據(jù)接收模塊接收到的數(shù)據(jù)保存到指定的文件中。</p><p><b> 3. 系統(tǒng)用例</b></p><p><b> 3.1. 用例圖</b></p><p> 圖2-2:系統(tǒng)用例圖</p>&l
39、t;p><b> 3.2. 用例描述</b></p><p> 3.2.1. 數(shù)據(jù)采集</p><p> 3.2.2. 數(shù)據(jù)讀取</p><p> 3.2.3. 讀取上次未匹配的登入記錄</p><p> 3.2.4. 讀取用戶登錄數(shù)據(jù)文件</p><p> 3.2.5. 數(shù)據(jù)匹
40、配</p><p> 3.2.6. 匹配登錄記錄</p><p> 3.2.7. 保存未匹配的登入記錄</p><p> 3.2.8. 數(shù)據(jù)發(fā)送</p><p> 3.2.9. 數(shù)據(jù)接收</p><p> 3.2.10. 數(shù)據(jù)保存</p><p><b> 第三章 概要設(shè)
41、計</b></p><p><b> 1. 總體設(shè)計</b></p><p><b> 1.1. 業(yè)務(wù)流程</b></p><p><b> 圖3-1:業(yè)務(wù)流程</b></p><p><b> 說明:</b></p>&
42、lt;p> 1,業(yè)務(wù)流程中幾個存儲文件的命名規(guī)則:</p><p> 1.1 系統(tǒng)日志文件由外部傳遞給程序,程序需要判定是否存在然后才能采集。</p><p> 1.2 未匹配登入數(shù)據(jù)項集合的存儲路徑由外部傳遞給程序,文件名采用logins.dat。</p><p> 1.3 采集結(jié)果在服務(wù)器端也保存為文件,路徑由外部指定,文件名為dms_log.dm
43、t,該文</p><p> 件的格式是可閱讀的文本,所有實驗室采集到的用戶登錄數(shù)據(jù)都保存在該文件中,</p><p> 多次采集過程中的記錄采用追加的模式添加在文件末尾。</p><p> 2, 業(yè)務(wù)規(guī)則說明:</p><p> 2.1 日志登入/登出數(shù)據(jù)項讀取規(guī)則</p><p> 系統(tǒng)日志文件中的數(shù)據(jù)項有
44、很多,但并不是所有數(shù)據(jù)項都需要采集的,只有滿足如下條</p><p> 件的數(shù)據(jù)項才是需要采集的:</p><p> a) 登錄名不能以點號(.)開頭,以點號開頭的一般是登錄程序本身的日志數(shù)據(jù)項,</p><p><b> 不需要采集。</b></p><p> b) 登錄類型必須是 7(登入)或8(登出),登錄
45、類型具體說明見下面列表:</p><p> 表3-1:登錄類型定義</p><p><b> 1.2. 系統(tǒng)模塊</b></p><p> 數(shù)據(jù)采客戶端 數(shù)據(jù)采集服務(wù)器</p><p><b> 圖3-2:系
46、統(tǒng)流程</b></p><p> 物理上系統(tǒng)分為采集客戶端(被采集機器)和采集服務(wù)器兩部分,在采集客戶端包含數(shù)據(jù)采集模塊,數(shù)據(jù)匹配分析模塊和數(shù)據(jù)發(fā)送模塊;在采集服務(wù)器端包含數(shù)據(jù)接收模塊,數(shù)據(jù)存儲模塊和數(shù)據(jù)顯示模塊,各模塊的主要功能和職責(zé)如下:</p><p> 1, 數(shù)據(jù)采集模塊:該模塊的主要功能職責(zé)是讀取 Unix 機器上的用戶登錄日志文件的內(nèi)容,將其轉(zhuǎn)化為登錄記錄對象,
47、將這些對象存儲在Java 集合中并傳給數(shù)據(jù)匹配合分析模塊來分析。該模塊的輸入數(shù)據(jù)是Unix 機器的日志文件/var/adm/wtmpx,輸出數(shù)據(jù)是若干個登錄記錄對象(保存在集合中)。</p><p> 2, 數(shù)據(jù)匹配和分析模塊:該模塊的主要功能職責(zé)是將數(shù)據(jù)采集模塊采集到的用戶登錄記錄數(shù)據(jù)按照登錄/登出的關(guān)系匹配成一個完整的登錄/登出記錄,并計算出該用戶本次登錄的時長,然后將這些完整的登錄/登出記錄傳送給數(shù)據(jù)發(fā)送
48、模塊。該模塊的輸入數(shù)據(jù)是原始的登錄記錄對象,輸出數(shù)據(jù)是匹配好的登錄/登出記錄對象。</p><p> 3, 數(shù)據(jù)發(fā)送模塊:該模塊的主要功能職責(zé)是將匹配好的登錄/登出記錄用網(wǎng)絡(luò)傳送的發(fā)式發(fā)送到采集系統(tǒng)服務(wù)器。</p><p> 4, 數(shù)據(jù)接收模塊:該模塊的主要功能職責(zé)是從網(wǎng)絡(luò)中讀取采集客戶端發(fā)送來的登錄/登出數(shù)據(jù)。</p><p> 5, 數(shù)據(jù)存儲模塊:該模塊的
49、主要功能職責(zé)是將數(shù)據(jù)接收模塊接收到的數(shù)據(jù)按照指定的格式寫入指定的文件中。</p><p><b> 2. 接口設(shè)計</b></p><p><b> 2.1. 用戶接口</b></p><p> 用戶:執(zhí)行命令,啟動 DMS 服務(wù)端程序。</p><p> 系統(tǒng):服務(wù)端系統(tǒng)運行,等待接收數(shù)據(jù)
50、。</p><p> 用戶:執(zhí)行命令,啟動 DMS客戶端程序。</p><p> 系統(tǒng):客戶端系統(tǒng)運行,采集并發(fā)送數(shù)據(jù)。</p><p> 用戶:修改配置文件參數(shù)</p><p> 系統(tǒng):下次運行時根據(jù)新的配置參數(shù)來處理數(shù)據(jù)。</p><p><b> 2.2. 外部接口</b><
51、/p><p> 系統(tǒng)讀取用戶登錄記錄文件,獲得用戶登錄信息。</p><p> 系統(tǒng)讀取上次未匹配的登入記錄文件,獲取未匹配的登入記錄數(shù)據(jù)。</p><p> 系統(tǒng)將匹配好的數(shù)據(jù)寫入指定文件。</p><p><b> 2.3. 內(nèi)部接口</b></p><p> 數(shù)據(jù)讀取模塊與數(shù)據(jù)匹配模塊
52、間的接口:</p><p> 輸入:解析好的用戶登入/登出記錄列表。</p><p><b> 輸出:無</b></p><p> 數(shù)據(jù)匹配模塊與數(shù)據(jù)發(fā)送模塊間的接口:</p><p> 輸入:匹配好的用戶登錄記錄列表。</p><p><b> 輸出:無</b>&
53、lt;/p><p> 數(shù)據(jù)發(fā)送模塊與數(shù)據(jù)接收模塊間的接口:</p><p> 輸入:匹配好的用戶登錄記錄數(shù)據(jù)項</p><p> 輸出:接收成功與否的消息</p><p> 數(shù)據(jù)接收模塊與數(shù)據(jù)保存模塊間的接口:</p><p> 輸入:匹配好的用戶登錄記錄列表</p><p><b&
54、gt; 輸出:無</b></p><p><b> 3. 數(shù)據(jù)結(jié)構(gòu)設(shè)計</b></p><p> 根據(jù)系統(tǒng)需求,設(shè)計出如下數(shù)據(jù)實體:</p><p> 1, LogRec:登入/登出記錄類,用來表示一條原始的用戶登入/登出記錄。</p><p> 2, MatchedLogRec:匹配的登錄記錄類,
55、用來表示一條匹配的用戶登錄記錄。</p><p> 以下分別對這兩個實體類的設(shè)計作出說明:</p><p> 3.1. 登入/登出記錄數(shù)據(jù)類</p><p> 3.1.1. LogRec 類圖:</p><p><b> 圖</b></p><p> 3.1.2. LogRec 類成員變
56、量說明:</p><p> 3.2. 匹配的用戶登錄記錄類</p><p> 3.2.1. MatchedLogRec 類圖:</p><p> 3.2.2. MatchedLogRec 類成員變量說明:</p><p><b> 第四章 詳細(xì)設(shè)計</b></p><p><b&g
57、t; 1. 系統(tǒng)架構(gòu)綜述</b></p><p> 數(shù)據(jù)采集系統(tǒng)由以下幾個功能模塊組成:數(shù)據(jù)讀取模塊,數(shù)據(jù)匹配模塊,數(shù)據(jù)發(fā)送模塊,數(shù)據(jù)接收模塊,數(shù)據(jù)保存模塊和數(shù)據(jù)整合模塊,每個模塊的核心功能如下:</p><p> 數(shù)據(jù)讀取模塊:負(fù)責(zé)從用戶登錄記錄文件和未匹配登錄記錄文件中讀取用戶的登錄記錄數(shù)據(jù),將其轉(zhuǎn)化為LogRec 對象,然后傳遞給數(shù)據(jù)匹配模塊匹配。</p>
58、;<p> 數(shù)據(jù)匹配模塊:負(fù)責(zé)將用戶登錄記錄數(shù)據(jù),按照登入/登出的關(guān)系匹配起來,形成匹配的用戶登錄記錄數(shù)據(jù)(MatchedLogRec 對象),并計算出每次登錄的時間長度。</p><p> 數(shù)據(jù)發(fā)送模塊:將匹配好的用戶登錄記錄通過網(wǎng)絡(luò)發(fā)送到采集系統(tǒng)服務(wù)器。</p><p> 數(shù)據(jù)接收模塊:服務(wù)器端接收匹配好的用戶登錄記錄數(shù)據(jù)。</p><p>
59、 數(shù)據(jù)保存模塊:將接受到的用戶登錄記錄數(shù)據(jù)保存到數(shù)據(jù)庫的用戶登錄記錄明細(xì)表中。</p><p> 數(shù)據(jù)整合模塊:將用戶登錄記錄明細(xì)表中的數(shù)據(jù)整合成日報表,月報表和年報表。</p><p><b> 2. 靜態(tài)結(jié)構(gòu)設(shè)計</b></p><p> 2.1. 數(shù)據(jù)實體類</p><p> 根據(jù)需求分析,我們設(shè)計出以下
60、數(shù)據(jù)實體類:</p><p> 1, LogRec:登入/登出記錄類,用來表示一條原始的用戶登入/登出記錄。</p><p> 2, MatchedLogRec:匹配的登錄記錄類,用來表示一條匹配的用戶登錄記錄。</p><p> 以下分別對這兩個實體類的設(shè)計作出說明:</p><p> 2.1.1. 登入/登出記錄數(shù)據(jù)類</p
61、><p> 1,登入/登出記錄類(LogRec)類圖:</p><p> 2,登入/登出記錄類(LogRec)成員變量說明:</p><p> 2.2. 數(shù)據(jù)庫表設(shè)計</p><p><b> 表結(jié)構(gòu):</b></p><p> 用戶登錄記錄明細(xì)表(records):</p>
62、<p> 用戶表(user):</p><p> 用戶登錄記錄日報表(day_records):</p><p> 用戶登錄記錄月報表(month_records):</p><p> 用戶登錄記錄年報表(year_records):</p><p><b> 2.3. 總體類圖</b></p&
63、gt;<p><b> 【客戶端類圖】</b></p><p> 圖4-1:客戶端類圖</p><p><b> 【服務(wù)端類圖】</b></p><p> 圖4-2:服務(wù)端類圖</p><p><b> 【數(shù)據(jù)整合類圖】</b></p>&
64、lt;p> 圖4-3:數(shù)據(jù)整合類圖</p><p> 2.4. DataGather 類</p><p> DataGather 類封裝數(shù)據(jù)采集系統(tǒng)的所有功能。</p><p> 2.4.1. DataGather 類定義</p><p> 圖4-4:DataGather類圖</p><p> 2.4
65、.2. DataGather 類方法說明</p><p> 1)gather 方法定義:</p><p> 2)gather 方法活動圖:</p><p> 2.5. DataReader 類</p><p> 2.5.1. DataReader 類定義</p><p> 2.5.2. DataReader
66、成員變量說明</p><p> 2.5.3. DataReader 類方法說明</p><p> 1) readLogs 方法:</p><p> readLogs 方法活動圖:</p><p> type==7或者type==8</p><p><b> 否</b></p>
67、<p><b> 是</b></p><p><b> 是</b></p><p><b> 是</b></p><p><b> 否</b></p><p> 2)readLogins 方法:</p><p&g
68、t; readLogins 方法活動圖:</p><p><b> 開始 </b></p><p><b> 結(jié)束</b></p><p> 3)getAllLogs()方法:</p><p> getAllLogs 方法活動圖: </p><p>&
69、lt;b> 開始</b></p><p><b> 結(jié)束</b></p><p> 2.6. DataMatcher 類</p><p> 2.6.1. DataMatcher 類定義</p><p> 2.6.2. DataMatcher 類成員變量說明</p><p&g
70、t; 2.6.3. DataMatcher 類方法說明</p><p> matchLogs 方法:</p><p> matchLogs 方法活動圖:開始</p><p><b> 判定登入與登出</b></p><p><b> 是否同一次登錄</b></p>&
71、lt;p><b> 登入記錄列表</b></p><p><b> 遍歷結(jié)束</b></p><p> 登出記錄列表遍歷結(jié)束</p><p> 2.7. DataSender 類</p><p> 2.7.1. DataSender 類定義</p><p>
72、 2.7.2. DataSender 類成員變量說明</p><p> 2.7.3. DataSender 類方法說明</p><p> 1)initSocket 方法:</p><p> 2)closeSocket 方法:</p><p> 3)send 方法:</p><p> send 方法活動圖:&l
73、t;/p><p><b> 否 </b></p><p> 是 超過指定時間</p><p><b> 沒有應(yīng)答</b></p><p><b> 否</b></p><p><b> 列表中的數(shù)據(jù)
74、</b></p><p><b> 已經(jīng)寫完</b></p><p><b> 是</b></p><p> 2.8. DMSServer 類</p><p> DMSServer 類完成采集系統(tǒng)服務(wù)器端的服務(wù)功能,該類的主要功能為開啟服務(wù),獲得客戶連接請求,并啟動線程為每一個客
75、戶服務(wù)。</p><p> 2.8.1. DMSServer 類定義</p><p> 2.8.2. DMSServer 類成員變量說明</p><p> 2.8.3. DMSServer 類方法說明</p><p> 1) initSocket 方法</p><p> 2) startService 方法&
76、lt;/p><p> 3) shutDown()方法</p><p> startService 方法活動圖:</p><p><b> 開始</b></p><p><b> 否</b></p><p><b> 服務(wù)終止</b></p&
77、gt;<p><b> 是</b></p><p><b> 結(jié)束</b></p><p> 2.9. DMSServerThread 類</p><p> DMSServerThread 類封裝服務(wù)器端線程業(yè)務(wù)邏輯,該類繼承自java.lang.Thread 類,當(dāng)有客戶連接請求時,由DMSServ
78、er 類負(fù)責(zé)啟動新的線程為客戶服務(wù)。</p><p> 2.9.1. DMSServerThread 類定義</p><p> 2.9.2. DMSServerThread 類成員變量說明</p><p> 2.9.3. DMSServerThread 類方法說明</p><p><b> 1)run 方法:</b&g
79、t;</p><p> run 方法活動圖:</p><p><b> 開始</b></p><p> 2) readLog 方法:</p><p> readLog 方法活動圖:</p><p><b> 開始</b></p><p>&l
80、t;b> 否</b></p><p><b> 是</b></p><p><b> 結(jié)束</b></p><p> 2.10.LogWriter 接口及DBLogWriter 類</p><p> LogWriter 接口的功能是將用戶登錄記錄數(shù)據(jù)寫到存儲介質(zhì)中保存下來
81、,該接口封裝唯一方法writeLog()。該接口有兩個實現(xiàn)類:FileLogWriter 和DBLogWriter,F(xiàn)ileLogWriter 實現(xiàn)將登錄記錄寫到文本文件中的業(yè)務(wù)邏輯,而DBLogWriter 實現(xiàn)將登錄記錄寫到數(shù)據(jù)庫中的業(yè)務(wù)邏輯。</p><p> 2.10.1. LogWriter 接口方法說明</p><p> writeLog 方法:</p>&l
82、t;p> readLog 方法活動圖:</p><p> 2.11.DataCombinator 類</p><p> DataCombinator 類封裝數(shù)據(jù)整合的業(yè)務(wù)邏輯。</p><p> 2.11.1. DataCombinator 類定義</p><p> 2.11.2. DataCombinator 類成員變量說明
83、</p><p> 2.11.3. DataCombinator 類方法說明</p><p> 1)combineDayData 方法:</p><p> 2) combineMonthData 方法:</p><p> 3) combineYearData 方法:</p><p><b> 第五章
84、 系統(tǒng)實現(xiàn)</b></p><p><b> 1. 登錄界面</b></p><p> UserDAO userDAO=new UserDAOImpl();</p><p> User user=null;</p><p> user=userDAO.queryByNameAndPwd(text.ge
85、tText(),pass.getText());//根據(jù)用//戶輸入的用戶名密碼到user表中查找</p><p> if(user!=null&&user.getType()==1){</p><p> new AdminManager().showMe();</p><p><b> }else{</b></p&
86、gt;<p> JOptionPane.showMessageDialog(null,"對不起,用戶名或密碼不正確");</p><p> } </p><p><b> 圖5-1:登陸界面</b></p><p> 2. 系統(tǒng)操作主頁面</p><p><
87、b> 圖5-2:主界面</b></p><p> 該界面演示整個采集系統(tǒng)的功能。</p><p><b> 2.1服務(wù)端實現(xiàn)</b></p><p> 2.1.1 DMSServer 類</p><p> 該類完成采集系統(tǒng)服務(wù)器端的服務(wù)功能,該類的主要功能為開啟服務(wù),獲得客戶連接請求,并啟動線
88、程為每一個客戶服務(wù)。</p><p> public void initSocket(){</p><p><b> try {</b></p><p> ss=new ServerSocket(port);</p><p> } catch (IOException e) {</p><p&
89、gt; e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p> public void startService(){</p><p> Socket s=null;</p><p>
90、 while(flag){</p><p><b> try {</b></p><p> s=ss.accept();</p><p> DMSServerThread thread=new DMSServerThread(s);</p><p> thread.start();</p><
91、p> } catch (IOException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><
92、p> public void shutDown(){</p><p> flag=false;</p><p><b> }</b></p><p> 2.1.2 DMSServerThread類</p><p><b> 線程類</b></p><p>
93、為每一個客戶開啟一個線程</p><p> InputStream is=socket.getInputStream();</p><p> DataInputStream dis=new DataInputStream(is);</p><p> String labIP=dis.readUTF();</p><p> String
94、 xmlData=dis.readUTF();</p><p> dis.close();</p><p> char[] arrays=xmlData.toCharArray();</p><p> CharArrayReader car=new CharArrayReader(arrays);</p><p> SAXReader
95、 reader=new SAXReader();</p><p> Document doc=reader.read(car);</p><p> //讀取xmlData字符串中數(shù)據(jù),把數(shù)據(jù)轉(zhuǎn)換成包含多個MathedLogRec類型的集合</p><p> writer=new DBLogWriter2();</p><p> wri
96、ter.writeLog(labIP, doc);</p><p> 2.1.3 DBLogWriter類</p><p> public void writeLog(String labIp, Document doc) {</p><p><b> try {</b></p><p> Class.forNa
97、me("com.mysql.jdbc.Driver");</p><p> conn = DriverManager.getConnection(</p><p> "jdbc:mysql://localhost:3306/dms", "root", "123");</p><p>
98、 String sql = "insert into logrecords(labip,logintime,logouttime,durations,clientip,logname) values(?,?,?,?,?,?) ";</p><p> PreparedStatement ps = conn.prepareStatement(sql);</p><p>
99、 List list = doc.selectNodes("/Users/matcheduser");</p><p> for(int i=0;i<list.size();i++){</p><p> Element e=(Element) list.get(i);</p><p> String name=e.selectSin
100、gleNode("name").getText();</p><p> String loginTime=e.selectSingleNode("loginTime").getText();</p><p> String logoutTime=e.selectSingleNode("logoutTime").getText(
101、);</p><p> String durations=e.selectSingleNode("durations").getText();</p><p> String logIp=e.selectSingleNode("logIP").getText();</p><p> String[] params={la
102、bIp,loginTime,logoutTime,durations,logIp,name};</p><p> for(int j=0;j<params.length;j++){</p><p> ps.setString(j+1,params[j]);</p><p><b> }</b></p><p>
103、; ps.executeUpdate();</p><p><b> }</b></p><p> //ps.executeUpdate();</p><p> conn.close();</p><p> } catch (ClassNotFoundException e) {</p><
104、;p> e.printStackTrace();</p><p> } catch (SQLException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p>&l
105、t;p> 2.1.4 FileLogWriter類</p><p> public void writeLog(String labIp,Document doc){</p><p> String xmlFileName=""+System.currentTimeMillis()+".xml";</p><p>
106、 Element e1=(Element) doc.selectSingleNode("/Users");</p><p> e1.addElement("labIP").setText(labIp);</p><p><b> try {</b></p><p> FileOutputStrea
107、m fos=new FileOutputStream(xmlFileName);</p><p> System.out.println("a.xml");</p><p> OutputFormat of=OutputFormat.createPrettyPrint();</p><p> XMLWriter writer=new XML
108、Writer(fos,of);</p><p> writer.write(doc);</p><p> fos.close();</p><p> } catch (FileNotFoundException e) {</p><p> e.printStackTrace();</p><p> } cat
109、ch (IOException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> 2.2 客戶端實現(xiàn)</b></p><p>
110、; 2.2.1 數(shù)據(jù)讀取</p><p> 讀取日志中的數(shù)據(jù),把每一條符合條件的數(shù)據(jù),封裝成LogRec對象,方法的返回值為包含多個LogRec對象的集合</p><p> public List<LogRec> readLogs(){</p><p> List<LogRec> list=new ArrayList<LogRe
111、c>();</p><p> byte[] name=new byte[32];</p><p> byte[] ip=new byte[257];</p><p><b> try {</b></p><p> FileInputStream fis=new FileInputStream(logFile
112、Name);</p><p> DataInputStream dis=new DataInputStream(fis);</p><p> int end=dis.read(name);</p><p><b> int i=0;</b></p><p> while(end!=-1){</p>
113、<p> LogRec rec=new LogRec();</p><p> String logName=new String(name);</p><p> logName=logName.trim();</p><p> dis.skipBytes(36);</p><p> int pid=dis.readInt(
114、);</p><p> short type=dis.readShort();</p><p> dis.skipBytes(6);</p><p> int logTime=dis.readInt();</p><p> dis.skipBytes(30);</p><p> dis.read(ip);&l
115、t;/p><p> String logIP=new String(ip);</p><p> logIP=logIP.trim();</p><p> if((!logName.equals("root"))&&(!logName.startsWith("."))&&(type==7||ty
116、pe==8)){</p><p><b> i++;</b></p><p> rec.setLogName(logName);</p><p> rec.setPid(pid);</p><p> rec.setLogType(type);</p><p> rec.setLogTim
117、e(logTime);</p><p> rec.setLogIP(logIP);</p><p> list.add(rec);</p><p><b> }</b></p><p> dis.skipBytes(1);</p><p> end=dis.read(name);<
118、/p><p><b> }</b></p><p> System.out.println("size="+i);</p><p> } catch (FileNotFoundException e) {</p><p> e.printStackTrace();</p><p
119、> } catch (IOException e) {</p><p> // TODO Auto-generated catch block</p><p> e.printStackTrace();</p><p><b> }</b></p><p> return list;</p>
120、<p><b> }</b></p><p> public List<LogRec> readLogins(){</p><p> File f=new File(loginsFileName);</p><p> if(!f.exists()){</p><p> return nu
121、ll;</p><p><b> }</b></p><p> List<LogRec> rec=new ArrayList<LogRec>();</p><p> SAXReader reader=new SAXReader();</p><p> Document doc;</p
122、><p><b> try {</b></p><p> doc = reader.read(f);</p><p> List list=doc.selectNodes("/users/unmatcheduser");</p><p> for(int i=0;i<list.size();
123、i++){</p><p> LogRec lr=new LogRec();</p><p> Element e=(Element) list.get(i);</p><p> lr.setLogName(e.selectSingleNode("username").getText());</p><p> lr
124、.setPid(Integer.parseInt(e.selectSingleNode("pid").getText()));</p><p> lr.setLogType(Short.parseShort(e.selectSingleNode("logType").getText()));</p><p> lr.setLogTime(Long
125、.parseLong(e.selectSingleNode("logTime").getText()));</p><p> lr.setLogIP(e.selectSingleNode("IP").getText());</p><p> rec.add(lr);</p><p><b> }</b&g
126、t;</p><p> } catch (DocumentException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p> return rec;</p><p><b> }</b>&
127、lt;/p><p> public List<LogRec> getAllLogs(){</p><p> List<LogRec> list1=readLogins();</p><p> List<LogRec> list2=readLogs();</p><p> if(list1!=null){
128、</p><p> for(LogRec rec:list1){</p><p> list2.add(rec);</p><p><b> }</b></p><p><b> }</b></p><p> return list2;</p><
129、;p><b> }</b></p><p> 2.2.2 數(shù)據(jù)發(fā)送</p><p> List中數(shù)據(jù)轉(zhuǎn)換成String的對象</p><p> 把list中的數(shù)據(jù),以XML格式保存到本地硬盤中</p><p><b> XML格式</b></p><p>&l
130、t;b> <Users></b></p><p> <matcheduser></p><p> <name>openlab</name></p><p> <loginTime>1251257328</loginTime></p><p>
131、<logoutTime>1251257390</logoutTime></p><p> <durations>62</durations></p><p> <logIP>192.168.5.146</logIP></p><p> </matcheduser></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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微機數(shù)據(jù)采集系統(tǒng)畢業(yè)論文
- 多路數(shù)據(jù)采集系統(tǒng)畢業(yè)論文
- 畢業(yè)論文--單片機數(shù)據(jù)采集系統(tǒng)
- 電子信息工程畢業(yè)論文--數(shù)據(jù)采集系統(tǒng)
- 畢業(yè)論文虛擬儀器設(shè)計-數(shù)據(jù)采集系統(tǒng)
- 無線數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn)畢業(yè)論文
- 無線數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn)畢業(yè)論文
- 通用數(shù)據(jù)采集整合系統(tǒng)dcis---畢業(yè)論文
- 基于labview的多通道數(shù)據(jù)采集系統(tǒng)(畢業(yè)論文)
- 基于labview的遠(yuǎn)程數(shù)據(jù)采集系統(tǒng)設(shè)計 畢業(yè)論文
- 基于fpga的高速數(shù)據(jù)采集系統(tǒng)設(shè)計畢業(yè)論文
- 基于fpga的高速數(shù)據(jù)采集系統(tǒng)設(shè)計畢業(yè)論文
- 畢業(yè)論文----基于fpga通用數(shù)據(jù)采集系統(tǒng)的設(shè)計
- 基于labview的多通道數(shù)據(jù)采集系統(tǒng)畢業(yè)論文
- 基于labview的多通道數(shù)據(jù)采集系統(tǒng)畢業(yè)論文
- 基于遠(yuǎn)程調(diào)用數(shù)據(jù)的新聞采集系統(tǒng)---畢業(yè)論文
- 畢業(yè)論文-基于fpga通用數(shù)據(jù)采集測試系統(tǒng)的設(shè)計
- 畢業(yè)論文-基于fpga通用數(shù)據(jù)采集測試系統(tǒng)的設(shè)計
- 畢業(yè)論文-基于fpga通用數(shù)據(jù)采集測試系統(tǒng)的設(shè)計
- 基于單片機的數(shù)據(jù)采集系統(tǒng)設(shè)計畢業(yè)論文
評論
0/150
提交評論