




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、企業(yè)內(nèi)部信息交流平臺(服務(wù)器端)目 錄企業(yè)內(nèi)部信息交流平臺(服務(wù)器端)1引言11 緒論11.1 系統(tǒng)研發(fā)的目的和意義11.2 問題定義11.3 可行性研究11.4 需求分析21.4.1 用戶需求21.4.2 服務(wù)器端功能需求22 系統(tǒng)設(shè)計22.1 數(shù)據(jù)庫設(shè)計22.1.1 數(shù)據(jù)庫及表關(guān)系22.1.2 建庫、表的規(guī)則32.2 系統(tǒng)架構(gòu)32.3 功能模塊的設(shè)計42.4 界面操作流程設(shè)計62.4.1 啟動服務(wù)業(yè)務(wù)流程62.4.2 停止服務(wù)業(yè)務(wù)流程62.4.3 查看服務(wù)器配置62.4.4 公司信息維護(hù)業(yè)務(wù)流程72.4.5 部門信息維護(hù)業(yè)務(wù)流程72.4.6 用戶信息維護(hù)業(yè)務(wù)流程73 系統(tǒng)功能實現(xiàn)83.1
2、數(shù)據(jù)實體類的實現(xiàn)83.2 業(yè)務(wù)邏輯類功能介紹93.3 服務(wù)器端程序界面93.3.1 主窗體93.3.2 實現(xiàn)serverlistenthread113.3.3 實現(xiàn)serverreceivethread類154 系統(tǒng)測試194.1 說明194.2測試環(huán)境配置194.3 測試用例194.3.1 偵聽客戶端測試用例194.3.2 維護(hù)公司信息測試用例194.3.3 維護(hù)部門信息測試用例204.3.4 維護(hù)用戶信息測試用例204.3.5 添加維護(hù)用戶信息測試用例205 運行與維護(hù)206 總結(jié)與展望20參考文獻(xiàn)21致 謝22附錄23外文頁24企業(yè)內(nèi)部信息交流平臺(服務(wù)器端)摘 要 強大的網(wǎng)絡(luò)資源給人們
3、的生活帶來了質(zhì)的飛躍。對于現(xiàn)代人來說,哪一天突然沒有了網(wǎng)絡(luò),生活將無法想象。而對于不同的社會群體對網(wǎng)絡(luò)資源的需求又有所不同。在企業(yè)或公司內(nèi)部,員工之間的溝通與交流是很重要的。為了有效利用內(nèi)網(wǎng)資源、提高員工的工作效率以及保證企業(yè)或公司內(nèi)部信息安全。擁有一款即時通訊工具是很必要的,而企業(yè)內(nèi)部信息交流平臺的開發(fā)正是為了滿足這一需求。它的開發(fā)采用了c/s架構(gòu)。主要涉及的技術(shù)有socket(套接字)、thread(線程)、jdbc(數(shù)據(jù)庫訪問)。其開發(fā)過程體現(xiàn)了面向?qū)ο蟮乃枷?。正文部分由需求分析、系統(tǒng)設(shè)計、系統(tǒng)實現(xiàn)、系統(tǒng)測試和運行與維護(hù)五部分組成。其中重點且詳細(xì)闡述了服務(wù)器端的核心內(nèi)容:啟動和停止服務(wù)器
4、(socket技術(shù));偵聽線程(serverlistenthread)和消息接收線程(serverreceivethread)。關(guān)鍵字 socket 線程 jdbc(數(shù)據(jù)庫訪問) 面向?qū)ο笠蚤_發(fā)僅限于公司內(nèi)部使用的即時通訊工具,不僅能滿足員工之間的溝通與交流,而且還能有效利用內(nèi)網(wǎng)資源,保證內(nèi)部信息安全。基于企業(yè)內(nèi)部信息交流平臺的自身特點和安全性的考慮,采用面向?qū)ο蟮木幊陶Z言來開發(fā)。面向?qū)ο缶幊痰乃枷牒诵氖抢^承、封裝和多態(tài)。通過這些特性來組織解決復(fù)雜的程序。c+是面向?qū)ο蟮木幊陶Z言,它包含了c語言的所有特性、屬性和優(yōu)點。但該平臺是一個網(wǎng)絡(luò)應(yīng)用程序。要求較好的可移植性。而java正是適應(yīng)了這一要
5、求。它是一種很好的編程語言,簡單易用。除了具有面向?qū)ο蟪绦蛟O(shè)計的優(yōu)點和可移植性外,同時還具備穩(wěn)健性和安全性。面向?qū)ο蠛唵蔚念悪C制和動態(tài)靈活的接口模型,使得開發(fā)工作完全集中于對象本身和接口的設(shè)計13。企業(yè)內(nèi)部信息交流平臺在設(shè)計和開發(fā)過程中,不僅僅局限于基本功能的實現(xiàn)。它最大的特點就是使用netbeans ide集成開發(fā)工具,該工具是針對java語言的圖形化的界面開發(fā)工具。提供了功能強大的swing等多種組建。方便了應(yīng)用程序的開發(fā)。通過創(chuàng)建包,使用包的管理機制,對各個功能模塊劃分使具有相同功能的文件放在同一包下,顯得結(jié)構(gòu)清晰。并且在編碼過程中看起來繁瑣,但通過導(dǎo)入包,使得包與包之間的文件可以相互訪
6、問,體現(xiàn)了代碼的可充用性。它優(yōu)化的結(jié)構(gòu)體現(xiàn)了程序的簡單、容易修改并且可擴(kuò)充性好,同時也充分體現(xiàn)了面向?qū)ο蟮木幊趟枷搿1疚陌凑障到y(tǒng)分析、設(shè)計、實現(xiàn)以及測試與維護(hù)劃分章節(jié)。重點在于詳細(xì)介紹系統(tǒng)實現(xiàn)部分中服務(wù)器端的服務(wù)器啟動與停止、客戶端與服務(wù)器端的通信(即對客戶端的偵聽線程和接收轉(zhuǎn)發(fā)消息線程)。其它部分也做了簡單介紹。1 緒論1.1 系統(tǒng)研發(fā)的目的和意義設(shè)計開發(fā)企業(yè)內(nèi)部信息交流平臺目的為:一是充分利用內(nèi)部網(wǎng)絡(luò)資源,保證企業(yè)內(nèi)部信息的安全性;二是便于對員工的管理,促進(jìn)員工之間的交流,提高工作效率。1.2 問題定義企業(yè)內(nèi)部信息交流平臺服務(wù)器端主要實現(xiàn)的功能為服務(wù)器的啟動和停止(涉及服務(wù)器端偵聽線程和消
7、息接收或轉(zhuǎn)發(fā)線程);公司、部門和用戶信息的維護(hù)。主要涉及技術(shù)為socket套接字、thread線程和jdbc數(shù)據(jù)庫訪問。對于整個系統(tǒng)來說,實現(xiàn)客戶端與服務(wù)器端的通信是關(guān)鍵。所以前一部分便成為服務(wù)器端的重點核心內(nèi)容。1.3 可行性研究 聊天的工具很多,但是并不都具有針對性。而且與外網(wǎng)聊天的工具不僅會影響到員工工作效率,而且企業(yè)內(nèi)部信息的安全性也受到威脅。本軟件采用java語言編寫具有很好的跨平臺性和可移植性。它提供友好的界面,結(jié)合了數(shù)據(jù)庫技術(shù)。安裝方便,針對性強,有利于企業(yè)管理。本軟件一定能得到廣大客戶的歡迎。作者在具備了開發(fā)環(huán)境的基礎(chǔ)上,能夠熟練應(yīng)用java語言進(jìn)行編碼實現(xiàn)。1.4 需求分析1
8、.4.1 用戶需求開發(fā)一款企業(yè)內(nèi)部使用的即時通信工具,對該工具的要求是:為了加強對用戶的管理,不向用戶提供在線注冊功能,只提供個人信息的更新功能;公司信息、部門信息、用戶注冊信息由管理員統(tǒng)一維護(hù);管理員可以查看在線用戶的信息;用戶可以保存聊天記錄;設(shè)計成仿“qq”界面;該工具只提供聊天功能。1.4.2 服務(wù)器端功能需求啟動服務(wù)啟動服務(wù)server_startup自動設(shè)置服務(wù)器端套接字,啟動服務(wù)后監(jiān)聽客戶端的請求,同時顯示連接狀態(tài)和接收請求的信息。停止服務(wù)停止服務(wù)server_stop向客戶端發(fā)送消息,關(guān)閉服務(wù)器端的套接字,斷開與客戶端的連接,顯示服務(wù)器狀態(tài)。查看服務(wù)器配置信息查看服務(wù)器配置信息
9、server_configuration顯示服務(wù)器端的ip地址和端口號查看在線人員詳細(xì)信息查看在線人員詳細(xì)信息server_oline顯示當(dāng)前在線人員的詳細(xì)信息公司基本信息維護(hù)更新公司基本信息server_updcorpinfo向服務(wù)器發(fā)送更新公司信息的請求,更新公司的基本信息部門信息維護(hù)增加部門信息server_adddeptinfo填寫新增部門信息,向服務(wù)器發(fā)送增加部門信息的請求,增加一個新部門刪除部門信息server_deldeptinfo向服務(wù)器發(fā)送刪除部門信息的請求,刪除部門的基本信息更新部門信息server_uptdeptinfo向服務(wù)器發(fā)送更改部門信息的請求,更改部門的基本信息增
10、加用戶的基本信息server_adduserbasinfo填寫新用戶信息,向服務(wù)器發(fā)送增加用戶信息的請求,增加一個新用戶用戶基本信息維護(hù)刪除用戶的基本信息server_deluserbaseinfo向服務(wù)器發(fā)送刪除用戶信息的請求,刪除用戶的基本信息更新用戶的基本信息server_upduserbaseinfo向服務(wù)器發(fā)送更改用戶信息的請求,更改用戶的基本信息初始化用戶的密碼server_inituserpwd向服務(wù)器發(fā)送更改用戶信息的請求,將用戶的密碼作初始化處理2 系統(tǒng)設(shè)計2.1 數(shù)據(jù)庫設(shè)計企業(yè)內(nèi)部信息交流平臺軟件的后臺數(shù)據(jù)庫采用microsoft sql server 2000 enter
11、prise edition 數(shù)據(jù)庫管理系統(tǒng)建立并維護(hù)。數(shù)據(jù)庫設(shè)計過程中使用sql server的查詢分析器創(chuàng)建了數(shù)據(jù)庫腳本文件corperation_msg.sql。其中sql server的登錄模式為混和身份驗證,超級用戶的用戶名及密碼均為sa,sql server服務(wù)器的端口號:1433。2.1.1 數(shù)據(jù)庫及表關(guān)系“企業(yè)內(nèi)部信息交流平臺”數(shù)據(jù)庫名稱:cm_master涉及的表包含 t_userinfo:用戶信息表; t_corp:公司信息表; t_dept:部門信息表。見表關(guān)系圖1-1。圖2-1表關(guān)系圖2.1.2 建庫、表的規(guī)則數(shù)據(jù)庫名稱以小寫英文單詞命名。表命名:t_表義名,其中表名要使
12、用有意義的英文單詞表示,且單詞的首字母大寫。字段名稱以大寫英文單詞命名。為每個表創(chuàng)建相關(guān)約束,主要包括主鍵約束、外鍵約束、默認(rèn)值約束、檢查約束等。2.1.3 表設(shè)計以下是數(shù)據(jù)庫中的各個表結(jié)構(gòu):t_userinfo(用戶信息表)列名數(shù)據(jù)類型(精度范圍)空/非空約束條件useraccountvarchar(20)非空pkdeptidint空fk 參照t_dept表(deptid)usernamevarchar(20)非空default: 您的姓名nicknamevarchar(20)非空default: 您的昵稱pwdvarbinary(46)非空default: 111111sexbit非空de
13、fault: 0代表男phonevarchar(15)空emailvarchar(30)空regionvarchar(10)空myinfovarchar(50)空olineipvarchar(15)空headpicvarchar(20)非空default: default.gif補充說明由于pwd字段的值存入之前要用pwdencrypt函數(shù)做加密處理t_corp(公司表)表名列名數(shù)據(jù)類型(精度范圍)空/非空約束條件corpnamevarchar(50)非空corpaddrvarchar(50)非空corpdomainvarchar(20)corpemailvarchar(30)corpphon
14、evarchar(15)corpfaxvarchar(15)補充說明t_dept(部門表)列名數(shù)據(jù)類型(精度范圍)空/非空約束條件deptidint非空pk、標(biāo)識列、identity(1,1)deptnamevarchar(30)非空deptdescrvarchar(100)補充說明2.2 系統(tǒng)架構(gòu) “企業(yè)內(nèi)部信息交流平臺”軟件采用基于c/s模式的三層架構(gòu)體系。三層架構(gòu)包括:客戶層、服務(wù)層、數(shù)據(jù)層。圖2-2系統(tǒng)架構(gòu)圖客戶層是應(yīng)用程序的用戶接口部分。擔(dān)負(fù)著用戶和服務(wù)器間的對話功能。它用于檢查用戶的輸入數(shù)據(jù)(比如驗證用戶輸入的日期格式),但不包括有關(guān)業(yè)務(wù)本身的處理邏輯(比如用戶身份的驗證)??蛻魧?/p>
15、也負(fù)責(zé)顯示應(yīng)用程序處理過的數(shù)據(jù)。服務(wù)層主要充當(dāng)“客戶層”和“數(shù)據(jù)層”的橋梁,它從“客戶層”接收命令請求,然后根據(jù)命令的類別執(zhí)行相應(yīng)的處理:比如從數(shù)據(jù)庫中查詢數(shù)據(jù)、為客戶層轉(zhuǎn)發(fā)聊天消息等等。數(shù)據(jù)層主要由數(shù)據(jù)庫管理系統(tǒng)來充當(dāng),該平臺采用microsoft公司的sql server 2000作為數(shù)據(jù)管理工具。因此,從服務(wù)層傳送到數(shù)據(jù)層的“命令”一般都是通過sql語言來實現(xiàn)的。2.3 功能模塊的設(shè)計服務(wù)器端的各個包的劃分,見表2-1。表2-1包的劃分包名說明base數(shù)據(jù)實體包baseform用戶界面包commonform自定義界面包bl業(yè)務(wù)實體包utils工具類包properties資源文件包img圖
16、像資源包通過劃分模塊,將具有相同功能的java類文件,封裝在包中,當(dāng)需要用到某個類函數(shù)時,通過導(dǎo)包后直接使用。這樣不僅使用方便,而且框架結(jié)構(gòu)清晰。1 baseform(用戶界面包)見圖2-3服務(wù)器端表示層:圖2-3服務(wù)器端表示層上圖是在baseform包要建立的各個用戶界面。它們都繼承了jframe類。severreceivetread類和serverlistenthread類繼承了tread類。2 base包是數(shù)據(jù)實體包,它包含各個類文件中的公司信息(corperation)、部門信息(department)、用戶信息(userinfo)和在線用戶信息(onlineuser)的基本數(shù)據(jù),通過
17、set、get方法給數(shù)據(jù)賦值和獲取數(shù)據(jù)值。3 bl包是業(yè)務(wù)實體類包,它包括:corperationbl、departmentbl、userinfobl 和departuserbl。其中corperationbl、departmentbl、userinfobl類繼承了utils工具包中的dbutils類,通過它來建立與數(shù)據(jù)之間的聯(lián)系,訪問數(shù)據(jù)庫中的數(shù)據(jù)。4 utils 包是工具包,它包括:dbutils類、propconfig類、commonutils類和constantvalues類。 其中dbutil類是為業(yè)務(wù)實體類建立了與數(shù)據(jù)庫的連接;propconfig類將工程中的資源文件讀取后存入到p
18、roperties類包的實例中,本類中包含4個properties類的資源實例:dbconfigprop數(shù)據(jù)庫配置資源實例、socketprop套接字配置資源實例、messageprop 消息資源實例和sqlpropt-sql資源實例。通過類名.方法名()訪問消息資源實例;commonutils類是共通函數(shù)類,它主要完成獲取當(dāng)前屏幕寬度和高度、設(shè)置組件的啟動位置、關(guān)閉輸入輸出文件流、向文件中添加內(nèi)容、從文件中讀取數(shù)據(jù)、生成新的文件、獲取本地系統(tǒng)時間以及獲取服務(wù)器ip地址和端口號。constantvalues類存儲常用的常量信息,常量信息以公有靜態(tài)屬性值存儲,通過類.屬性名直接調(diào)用以下常量的值。
19、5 img 包中存放圖片;properties包中包含鍵值的文件。 commonform包存放了用戶自定義的用戶界面。2.4 界面操作流程設(shè)計2.4.1 啟動服務(wù)業(yè)務(wù)流程啟動服務(wù)偵聽客戶端處理請求內(nèi)容結(jié)束接受請求圖2-4 啟動服務(wù)2.4.2 停止服務(wù)業(yè)務(wù)流程停止服務(wù)向客戶端發(fā)送信息斷開與服務(wù)端連接結(jié)束圖 2-5 停止服務(wù)2.4.3 查看服務(wù)器配置實現(xiàn):顯示服務(wù)器端的ip地址和端口號。2.4.4 公司信息維護(hù)業(yè)務(wù)流程更新公司信息返回失敗消息返回成功消息結(jié)束更新數(shù)據(jù)成功失敗圖 2-6公司信息更新2.4.5 部門信息維護(hù)業(yè)務(wù)流程增加部門信息更新部門信息刪除部門信息返回成功信息返回失敗消息結(jié)束處理變更
20、請求發(fā)送部門信息變更請求失敗成功圖 2-7部門信息維護(hù)2.4.6 用戶信息維護(hù)業(yè)務(wù)流程增加用戶信息更新用戶信息返回成功消息密碼初始化刪除用戶信息返回失敗消息結(jié)束處理變更請求發(fā)送用戶信息變更請求失敗成功圖2-8用戶信息維護(hù)3 系統(tǒng)功能實現(xiàn)圖3-1服務(wù)器端狀態(tài)圖3.1 數(shù)據(jù)實體類的實現(xiàn)數(shù)據(jù)實體類的實現(xiàn)主要是用set和get方法設(shè)置和獲取數(shù)據(jù)實體的屬性值。下面是各個實體類屬性和成員方法。corperation(公司信息)數(shù)據(jù)實體類,如下圖3-2。圖3-2 corperation類圖其它三個實體類分別是department(部門信息)數(shù)據(jù)實體類、onlineuser(在線用戶信息)數(shù)據(jù)實體類、user
21、info(用戶信息)數(shù)據(jù)實體類。3.2 業(yè)務(wù)邏輯類功能介紹業(yè)務(wù)邏輯類主要是處理與數(shù)據(jù)實體信息相關(guān)的邏輯。比如公司業(yè)務(wù)邏輯類:corperationbl類主要用來處理和公司信息相關(guān)的業(yè)務(wù)邏輯,其中g(shù)etcorperation()為公有方法用于取得公司的基本信息、updatecorperation()為公有方法用于更新公司的基本信息。3.3 服務(wù)器端程序界面主要闡述主窗體的服務(wù)啟動與關(guān)閉。3.3.1 主窗體圖 3-3“啟動服務(wù)器”界面 主窗體的功能介紹服務(wù)器端的主窗體包含服務(wù)器端程序的核心功能,服務(wù)器管理員可以通過該窗體執(zhí)行下面的操作:啟動服務(wù)器、關(guān)閉服務(wù)器、查看服務(wù)器配置信息。作者
22、在主窗體上設(shè)置菜單欄,把“公司信息維護(hù)”、“部門信息維護(hù)”、“用戶信息維護(hù)”等功能項集中放置在“信息維護(hù)”菜單中,把“啟動服務(wù)器”、“停止服務(wù)器”、“查看服務(wù)器配置信息”等功能項放置在“系統(tǒng)管理”菜單中。除此之外,為方便用戶操作,我們將“啟動服務(wù)器”、“停止服務(wù)器”、“查看服務(wù)器配置信息”和“用戶信息維護(hù)”這四個常用功能項放置在工具欄中。 控件及主菜單實現(xiàn)本窗體界面上包含的控件種類包括:jpanel(作jtoolbar和jtextarea的容器)、jtoolbar、jscrollpane(jtextarea的容器)、jtextarea、jmenubar、jmenu、jmenuit
23、em、jseperator。其中jmenuitem的界面設(shè)計見圖3-4。圖3-4 主菜單 功能代碼實現(xiàn)圖3-3是服務(wù)器端程序的啟動界面。當(dāng)服務(wù)器端程序打開的時候,服務(wù)就已經(jīng)啟動了,這時不僅要向用戶提示相應(yīng)的信息,而且還要禁用工具欄上“啟動服務(wù)”的按鈕和系統(tǒng)管理(i)菜單下的“啟動服務(wù)器(s)”菜單項。mainjframe中聲明了三個實例變量,它們是服務(wù)器端偵聽套接字serversocket,其作用是建立服務(wù)器端套接字;在線用戶集合onlineusersvector,作用是保存所有在線用戶類的實例;服務(wù)器端偵聽線程類listenthread,它負(fù)責(zé)偵聽客戶端的登錄請求。下面是sta
24、rtserver函數(shù)的實現(xiàn)過程:#001 private void startserver () #002 stringbuffer msgstrbuf = null; #003 /取得消息資源配置實例和網(wǎng)絡(luò)資源配置實例#004 resourcebundle msg_config = propconfig.getmsg_resource ();#005 resourcebundle socket_config =propconfig.getsocket_resource ();#006 try #007 serversocket = #008 new serversocket (#009 in
25、teger.parseint (socket_config.getstring (port);#010 /初始化界面組件狀態(tài)#011 initcomponentsstate (false,#012 msg_config.getstring(server.state.start);#013 msgstrbuf = new stringbuffer ();#014 /準(zhǔn)備日志信息 #015 msgstrbuf.append (服務(wù)器準(zhǔn)備啟動 );#016 /取得ip信息#017 msgstrbuf.append ( ip地址: );#018 msgstrbuf.append (commonutil
26、s.getserverip (serversocket);#019 /取得端口號信息#020 msgstrbuf.append ( 端口號: ); #021 msgstrbuf.append (commonutils.getserverport (serversocket);#022 msgstrbuf.append (n);#023 /取得服務(wù)器當(dāng)前時間#024 msgstrbuf.append (commonutils.getcurrenttime ();#025 msgstrbuf.append ( );#026 /取得服務(wù)器啟動成功的消息#027 msgstrbuf.append (#
27、028 msg_config.getstring (msg.serverstart.success);#029 msgstrbuf.append (n);#030 /準(zhǔn)備日志信息 #031 /顯示啟動信息 #032 logoinfojtxtarea.append (msgstrbuf.tostring ();#033 /準(zhǔn)備在線用戶集合#034 onlineusersvector = new vector ();#035 /創(chuàng)建服務(wù)器端偵聽線程#036 listenthread = #037 new serverlistenthread (serversocket,#038 onlineuse
28、rsvector, logoinfojtxtarea); #039#040 /啟動服務(wù)器偵聽線程#041 listenthread.start (); #042 catch(ioexception ioe) #043 ioe.printstacktrace ();#044 /返回錯誤消息#045 joptionpane.showmessagedialog (this,#046 msg_config.getstring (msg.serverstart.fault),#047 msg_config.getstring (msg.title.fault),#048 joptionpane.erro
29、r_message);#049 system.exit (1);#050 #051 表3-1啟動服務(wù)器代碼上面這段代碼看上去有很多,其實完成的功能很簡單。首先取得消息配置資源實例(代碼行#004)和網(wǎng)絡(luò)配置資源實例(代碼行#005)。緊接著創(chuàng)建服務(wù)器端套接字(代碼行#007),注意,這里可能會拋出ioexception,必須捕獲。服務(wù)器端的通信端口號是從perties資源文件里取得的(默認(rèn)設(shè)置為9000)。代碼行#011調(diào)用自定義函數(shù)initcomponentsstate初始化界面組件的狀態(tài),initcomponentsstate函數(shù)共有兩個參數(shù)。第一個參數(shù)為布
30、爾值,代表將組件設(shè)置為可用還是不可用。第二個參數(shù)是標(biāo)題欄狀態(tài)信息。startserver中調(diào)用該函數(shù)時,第一個參數(shù)傳遞的是false,代表“啟動服務(wù)”工具欄按鈕及啟動菜單項均不可用。第二個參數(shù)的值是從消息資源文件中讀取出來的?;氐奖?-1,從代碼行#013至代碼行#030是準(zhǔn)備啟動日志消息的過程。代碼行#018調(diào)用commonutils工具類的getserverip方法取得服務(wù)器端ip地址,該方法需要一個serversocket實例作為參數(shù)。該方法的實現(xiàn)代碼如下:表3-2 獲取ip的代碼#001 public static string getserverip(serversocket ser
31、versocket)#002 string ipstring = null;#003 try#004 ipstring=#005 serversocket.getinetaddress ().getlocalhost ().tostring ();#006 int index = ipstring.lastindexof(/);#007 ipstring = ipstring.substring(index+1);#008 catch(unknownhostexception uhe)#009 uhe.printstacktrace ();#010 #011 return ipstring;
32、#012 調(diào)用commonutils工具類的getserverport方法取得服務(wù)端程序的端口號,該方法也需要一個serversocket實例作為參數(shù)。實現(xiàn)代碼如下:表3-3 獲取port的代碼#001 public static string getserverport(serversocket serversocket)#002 string ipport = null;#003 ipport = string.valueof (serversocket.getlocalport ();#004 return ipport;#005 調(diào)用commonutils工具類的getcurrentt
33、ime獲得服務(wù)器的當(dāng)前時間。對于長字符串拼接的操作,一般不建議使用“+”運算符,因為每一次字符串相加的結(jié)果都會產(chǎn)生一個新的字符串對象。使用stringbuffer類,該類使用append方法將字符串連接起來,不會產(chǎn)生新的字符串,它同時還提供了一些對子字符串進(jìn)行操作的方法。表3-1中代碼行#032將把準(zhǔn)備好的啟動信息顯示在logoinfojtxtarea中。下面得到了一個在線用戶集合的引用(代碼行#034)。緊接著創(chuàng)建了一個服務(wù)器端的偵聽線程,并通過調(diào)用start方法啟動了該線程。如果在創(chuàng)建服務(wù)器端套接字時出現(xiàn)了問題,比如端口被占用的情況,這時會拋出一個ioexception,對該異常進(jìn)行了捕獲
34、,同時將錯誤信息返回給用戶。然后調(diào)用system類的exit方法退出應(yīng)用程序。服務(wù)器端主窗體已經(jīng)實現(xiàn),下面將介紹的是在主界面啟動時,創(chuàng)建并啟動的服務(wù)器偵聽線程(serverlistenthread),它隨時等待客戶端的上線請求。3.3.2 實現(xiàn)serverlistenthread上面介紹了startserver方法執(zhí)行到最后,創(chuàng)建了一個服務(wù)器端的偵聽線程,這個線程既然是線程類,那么就要實現(xiàn)該類的run方法,把要完成的任務(wù)寫在run方法中。該類的屬性作用:serversocket(seversocket類實例):偵聽客戶端的請求;onlineusersvector(vector類實例):記錄在線
35、用戶的集合logoinfojtxtarea(jtextfield類實例):顯示服務(wù)器運行的日志消息;stop(布爾值):線程停止的標(biāo)志;receivethread(serverreceivethread類實例):負(fù)責(zé)接收、轉(zhuǎn)發(fā)客戶端用戶的聊天消息;userbl(userinfobl類實例):負(fù)責(zé)驗證用戶身份,將注冊用戶加入在線用戶集合;msgstrbuf(stringbuffer類實例):負(fù)責(zé)準(zhǔn)備服務(wù)器運行的日志消息。下面是該類run方法的實現(xiàn)代碼,由于代碼比較長,先列出該方法要實現(xiàn)的主要功能:表3-4 偵聽線程中的run方法#001 public void run () #002 try #
36、003 while(!stop & !getserversockt ().isclosed () #004 #005 /為每個請求創(chuàng)建一個連接,并針對該連接生成一個在線用戶實例 #006 . 這里是創(chuàng)建新連接和在線用戶的代碼 /1#007 #008 /處理客戶端請求的頭信息 #009 . 這里是處理客戶端請求頭信息的代碼 /2#010#011 /如果頭信息是”login”,處理登錄請求#012 . 這里是處理登錄請求的代碼 /3#013 #014 /如果頭信息是”shutdown”#015 . 這里是處理服務(wù)器關(guān)閉的代碼 /4#016 #017 catch(socketexception se
37、) #018 se.printstacktrace ();#019 catch(ioexception ioe) #020 ioe.printstacktrace ();#021 #022 1 為每個請求創(chuàng)建一個連接,并針對該連接生成一個新的在線用戶的代碼:表3-5 為客戶創(chuàng)建連接的代碼#001 /為每一個客戶端請求創(chuàng)建一個新連接#002 socket socket = new socket ();#003 socket = this.getserversockt ().accept ();#004 /創(chuàng)建新的在線用戶實例#005 onlineuser onlineuser = new onl
38、ineuser ();#006 onlineuser.setsocket (socket);#007 /設(shè)置在線用戶消息接收實例#008 bufferedreader in = new bufferedreader (#009 new inputstreamreader (onlineuser.getsocket ().getinputstream ();#010 onlineuser.setin (in);#011 /設(shè)置在線用戶消息發(fā)送實例#012 printwriter out = new printwriter (onlineuser.getsocket ().getoutputstr
39、eam ();#013 onlineuser.setout (out);為每個客戶端的請求創(chuàng)建一個新的onlineuser實例是因為服務(wù)器端程序的這個偵聽線程只負(fù)責(zé)接收客戶端的請求,想要為多個在線用戶同時提供收發(fā)消息的服務(wù),需要為每個在線用戶創(chuàng)建另外一個單獨的接收線程(即后面將要闡述的serverreceivethread),在創(chuàng)建這個接收線程的時候,就把每個onlineuser實例當(dāng)作參數(shù)傳遞給該實例的構(gòu)造函數(shù),因為onlineuser實例具備收發(fā)消息的實例屬性。這樣以來,只要是通過身份驗證的客戶端請求,服務(wù)器都會為它創(chuàng)建一個新的服務(wù)器端接收線程,這個線程負(fù)責(zé)為每個在線用戶提供接收和轉(zhuǎn)發(fā)消息
40、的服務(wù)。2 處理客戶端請求頭的信息當(dāng)一個客戶與服務(wù)器建立了連接后,首先要向服務(wù)器發(fā)送一個標(biāo)志字符串,說明要做什么。這就是請求頭信息。代碼中的actionstring就是服務(wù)器端從客戶端那里獲得的請求頭信息。它是通過調(diào)用每個在線用戶的消息接收實例(bufferedreader)的readline方法獲得的。取得頭信息之后將對它進(jìn)行判斷。處理用戶“登錄”的代碼:表3-6 處理登錄的代碼#001 if(actionstring.equals (login) #002 string useraccountstring = null;#003 string passwordstring = null;#
41、004 /從客戶端讀取用戶帳號#005 useraccountstring = onlineuser.getin ().readline ();#006 /從客戶端讀取密碼#007 passwordstring = onlineuser.getin ().readline ();#008 onlineuser.setuseraccount (useraccountstring);#009 onlineuser.setpwd (passwordstring);#010 /檢查用戶是否已經(jīng)登錄#011 iterator iterator = onlineusersvector.iterator (
42、);#012 onlineuser tempuser = null;#013 isonline = false;#014 while(iterator.hasnext () #015 tempuser = (onlineuser)iterator.next ();#016 if(tempuser.getuseraccount ().equals (useraccountstring) #017 isonline = true;#018 break;#019 #020 #021 if(!isonline) #022 /驗證登錄用戶身份#023 if(userbl.verifieduser (on
43、lineuser) #024 sendonlineinfotoallusers (onlineuser.getuseraccount ();#025 onlineuser.getout ().write (okn);#026 onlineuser.getout ().flush ();#027 userbl.adduser (onlineusersvector,onlineuser);#028 /更新日志消息#029 msgstrbuf.delete (0,msgstrbuf.length ();#030 msgstrbuf.append (commonutils.getcurrenttime
44、 ()+ );#031 msgstrbuf.append (onlineuser.getnickname ();#032 msgstrbuf.append (上線).append (在線人數(shù):);#032 msgstrbuf.append (onlineusersvector.size(); #033 msgstrbuf.append (n);#034 logoinfojtxtarea.append (msgstrbuf.tostring (); #035 /創(chuàng)建服務(wù)器接收線程#036 recievethread = new serverreceivethread (onlineusersve
45、ctor,onlineuser,userbl,logoinfojtxtarea);#037 recievethread.start (); #038 else #039 resourcebundle msg_config = propconfig.getmsg_resource ();#040 onlineuser.getout ().write (errorn);#041 onlineuser.getout ().flush ();#042 string errorstring = msg_config.getstring (user.verified.error) + n);#043 on
46、lineuser.getout ().write (errorstring);#044 onlineuser.getout ().flush ();#045 onlineuser.getin ().close ();#046 onlineuser.getout ().close ();#047 onlineuser.getsocket ().close ();#048 onlineuser null;#049 #050 else#051 /發(fā)送消息頭#052 onlineuser.getout ().write (isonlinedn);#053 onlineuser.getout ().fl
47、ush ();#054 onlineuser.getin.close();#055 onlineuser.getout.close();#056 onlineuser.getsocket.close();#057 onlineuser null;#056 #054 分析一下上面的代碼,首先從客戶端讀取用戶帳號(代碼行#005)和密碼(代碼行#007),然后檢查在線用戶集合中是否存在請求登錄的用戶帳號(代碼行#011至#020),如果存在,將isonline屬性設(shè)為true(代碼行#017),則代表用戶已經(jīng)登錄。在代碼行#021處進(jìn)行判斷時轉(zhuǎn)向代碼行#050,向客戶端發(fā)送“isonlined”消
48、息頭,然后將剛剛創(chuàng)建onlineuser實例中的網(wǎng)絡(luò)通信資源關(guān)閉,并丟棄該實例的引用(代碼行#054至代碼行#057)。如果用戶的登錄帳號在在線用戶集合中不存在,則執(zhí)行代碼行#023,調(diào)用業(yè)務(wù)實體類userinfobl的verifieduser方法,驗證用戶身份的有效性。verifieduser方法的實現(xiàn)代碼如下:表3-7用戶身份驗證的代碼#001 public boolean verifieduser (onlineuser onlineuser)#002 boolean flag = false;#003 /準(zhǔn)備參數(shù)#004 string parampwdstring = + online
49、user.getpwd () + ;#005 string paramuseraccountstring = = + onlineuser.getuseraccount () + ;#006 resourcebundle sql_config = propconfig.getsql_resource ();#007 resultset rs = this.query (sql_config.getstring (user.verified),#008 new objectparamuseraccountstring,parampwdstring);#009 try#010 if(rs != null & rs.next ()#011 onlineuser.setuseraccount (rs.getstring (useraccount);#012 onlineuser.setnickname (rs.gets
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 營運車輛買賣合同協(xié)議
- 8《安全記心上》第2課時 教學(xué)設(shè)計-2023-2024學(xué)年道德與法治三年級上冊統(tǒng)編版
- 信息技術(shù)(財經(jīng)商貿(mào)類) 試卷 教學(xué)檢測二
- 3《公民意味著什么》(第1課時)(教學(xué)設(shè)計)2024-2025學(xué)年統(tǒng)編版道德與法治六年級上冊
- 勞動合同樣本
- 3 我們班他們班(教學(xué)設(shè)計)2024-2025學(xué)年統(tǒng)編版道德與法治四年級上冊
- 14健康過冬天(教學(xué)設(shè)計)-部編版道德與法治一年級上冊
- 6-1《老子》四章(教學(xué)設(shè)計)高二語文同步高效課堂(統(tǒng)編版 選擇性必修上冊)
- 12 盤古開天地 教學(xué)設(shè)計-2024-2025學(xué)年語文四年級上冊統(tǒng)編版
- 20《肥皂泡》教學(xué)設(shè)計-2023-2024學(xué)年統(tǒng)編版語文三年級下冊
- 深度學(xué)習(xí)架構(gòu)創(chuàng)新-深度研究
- 供應(yīng)鏈韌性提升與風(fēng)險防范-深度研究
- 基層醫(yī)療衛(wèi)生服務(wù)能力提升考核試卷
- 2025年江蘇連云港市贛榆城市建設(shè)發(fā)展集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 砥礪前行決心譜寫華章
- 2025年開學(xué)教導(dǎo)處發(fā)言稿(5篇)
- 機電設(shè)備安裝旁站監(jiān)理方案
- 2025年度民政局離婚協(xié)議書范本模板官方修訂2篇
- 《百達(dá)翡麗名表介紹》課件
- 《集裝箱標(biāo)識辨識》課件
- 2024年臨床輸血管理委員會年終的工作總結(jié)
評論
0/150
提交評論