版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
北京郵電大學(xué)畢業(yè)設(shè)計(jì)緒論1.1引言在網(wǎng)絡(luò)飛速發(fā)展的今天,互聯(lián)網(wǎng)成為人們快速獲取、發(fā)布和傳遞信息的重要渠道,它在人們政治、經(jīng)濟(jì)、生活等各個(gè)方面發(fā)揮著重要的作用?;ヂ?lián)網(wǎng)上存在大量的信息所以信息交換也顯得尤為重要。人們一直在尋找一種方便、低廉的交流信息的工具,因此網(wǎng)上聊天便成為人們的首選?;贘ava網(wǎng)絡(luò)編程的強(qiáng)大功能,本次畢業(yè)設(shè)計(jì)使用Java編寫一個(gè)工作板即基于局域網(wǎng)工作交流平臺(tái)系統(tǒng)。工作板即基于局域網(wǎng)工作交流平臺(tái)利用的是互聯(lián)網(wǎng)線路,通過(guò)文字、文件的信息交流與互動(dòng),有效節(jié)省了溝通雙方的時(shí)間與經(jīng)濟(jì)成本;工作板即基于局域網(wǎng)工作交流平臺(tái)不但成為人們的溝通工具,還成為了人們利用其進(jìn)行電子商務(wù)、工作、學(xué)習(xí)等交流的平臺(tái),致力于幫助企業(yè)提高運(yùn)作效率,降低溝通成本、拓展商業(yè)機(jī)會(huì),它給員工提供更方便的溝通方式,增強(qiáng)了企業(yè)的信息共享和溝通能力,提高員工日常工作效率,減少企業(yè)內(nèi)部通訊費(fèi)用和出差次數(shù),從而為企業(yè)節(jié)省開支,同時(shí)也提高了員工的合作意識(shí),增強(qiáng)了企業(yè)的凝聚力。一般來(lái)說(shuō),聊天工具大多數(shù)由客戶端程序和服務(wù)器程序外加服務(wù)器端用于存放客戶數(shù)據(jù)的數(shù)據(jù)庫(kù)組成,本系統(tǒng)采用客戶機(jī)/服務(wù)器架構(gòu)模式通過(guò)Java提供的Socket類來(lái)連接客戶機(jī)和服務(wù)器并使客戶機(jī)和服務(wù)器之間相互通信,由于聊天是多點(diǎn)對(duì)多點(diǎn)的而Java提供的多線程功能用多線程可完成多點(diǎn)對(duì)多點(diǎn)的聊天,數(shù)據(jù)庫(kù)管理系統(tǒng)用Oracle11g完成并通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)。本系統(tǒng)建立在JAVA平臺(tái)上,系統(tǒng)的設(shè)計(jì)使用了面向?qū)ο蠹夹g(shù)和面向?qū)ο蟮脑O(shè)計(jì)原則。系統(tǒng)采用C/S結(jié)構(gòu),客戶端與客戶端以及客戶端與服務(wù)器端之間通過(guò)Socket傳送消息。使用JAVA語(yǔ)言編寫,開發(fā)工具采用MyEclipse。服務(wù)器端設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中,采用了多線程技術(shù),可以在單個(gè)程序當(dāng)中同時(shí)運(yùn)行多個(gè)不同的線程,執(zhí)行不同的任務(wù)。大大增強(qiáng)了程序?qū)Ψ?wù)器資源的利用?;诰钟蚓W(wǎng)工作交流平臺(tái)系統(tǒng)完成后將可進(jìn)行用戶間的聊天、對(duì)好友進(jìn)行添加、對(duì)新用戶的注冊(cè)、發(fā)送消息、接受消息等等功能。1.2國(guó)內(nèi)外企業(yè)即時(shí)通訊(工作交流平臺(tái))研究現(xiàn)狀企業(yè)即時(shí)通信:簡(jiǎn)稱EIM(EnterpriseInstantMessaging),它是一種面向企業(yè)終端使用者的網(wǎng)絡(luò)溝通工具服務(wù),使用者可以通過(guò)安裝了即時(shí)通信的終端機(jī)進(jìn)行兩人或多人之間的實(shí)時(shí)溝通。交流內(nèi)容包括文字、界面、語(yǔ)音、視頻及文件互發(fā)等。相對(duì)于個(gè)人即時(shí)通信工具而言,企業(yè)即時(shí)通信工具剔除了娛樂(lè)等因素,且更加強(qiáng)調(diào)安全。
目前,市場(chǎng)上的企業(yè)級(jí)即時(shí)通信工具主要包括:騰訊公司的RTX、IBM公司的LotusSametime、微軟公司的UC、點(diǎn)擊科技的GKE、中國(guó)互聯(lián)網(wǎng)辦公室的IMO、紅杉樹公司的EasyTouch、億企通的Jingoal等。經(jīng)過(guò)幾年來(lái)的市場(chǎng)考驗(yàn)和同行競(jìng)爭(zhēng),提供企業(yè)級(jí)即時(shí)通信軟件服務(wù)的廠商也經(jīng)歷了大浪淘沙的艱難歷程,目前的市場(chǎng)格局主要分為三類:第一類是介入即時(shí)通信領(lǐng)域時(shí)間較早的國(guó)際企業(yè),如IBM、微軟等。其優(yōu)勢(shì)在于起步早,產(chǎn)品在進(jìn)入中國(guó)前已在國(guó)外企業(yè)用戶中得到了廣泛應(yīng)用,企業(yè)知名度和產(chǎn)品知名度較高;缺點(diǎn)是在面對(duì)中國(guó)企業(yè)用戶的特定需求時(shí),其產(chǎn)品的適應(yīng)度還較差,另外,國(guó)際廠商為了實(shí)現(xiàn)大而全的目的,它們的即時(shí)通信產(chǎn)品往往與自身的其他軟件系統(tǒng)關(guān)聯(lián)度、依賴度很強(qiáng)(如微軟OCS和ExchangeServer2003的緊密捆綁,IBMSametime與Lotus的緊密結(jié)合),這無(wú)疑會(huì)增加企業(yè)用戶的采購(gòu)成本。第二類是以騰訊為代表的國(guó)產(chǎn)軟件企業(yè)。它們的產(chǎn)品設(shè)計(jì)更加貼近中國(guó)企業(yè)的實(shí)際需求,產(chǎn)品操作更加貼近中國(guó)人的使用習(xí)慣,并亦具有很高的品牌知名度。目前,此類企業(yè)已經(jīng)成為中國(guó)企業(yè)級(jí)即時(shí)通信市場(chǎng)的主導(dǎo)力量,據(jù)第三方統(tǒng)計(jì)數(shù)據(jù),僅騰訊RTX就已占到超過(guò)70%的市場(chǎng)份額。第三類是眾多創(chuàng)業(yè)性的新興企業(yè)。他們的特點(diǎn)是靈活性高,每個(gè)項(xiàng)目的定制性強(qiáng);缺點(diǎn)是產(chǎn)品不成熟,品牌影響力差。該類企業(yè)由于其自身的資金和技術(shù)等薄弱環(huán)節(jié),目前還不足以對(duì)企業(yè)即時(shí)通信市場(chǎng)造成影響。
總之,目前中國(guó)企業(yè)即時(shí)通信領(lǐng)域的一個(gè)顯著特征就是,國(guó)內(nèi)外廠商都在爭(zhēng)奪這個(gè)未來(lái)被普遍看好的市場(chǎng),未來(lái)中國(guó)企業(yè)即時(shí)通訊行業(yè)發(fā)展的方向?yàn)椋航y(tǒng)一通信化、功能定制化、移動(dòng)終端化、競(jìng)爭(zhēng)激烈化和行業(yè)整合化。1.3研究的意義近年來(lái),隨著全球信息化的不斷發(fā)展,網(wǎng)絡(luò)也在飛速發(fā)展。出于高效、快速地處理各種事務(wù)的目的,越來(lái)越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來(lái)進(jìn)行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡(jiǎn)化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴(kuò)大,業(yè)務(wù)量地增加,企業(yè)內(nèi)部多的信息越來(lái)越私密,企業(yè)只希望員工通過(guò)內(nèi)部局域網(wǎng)進(jìn)行溝通與交流,避免企業(yè)內(nèi)部機(jī)密通過(guò)Internet泄露到外部。為了解決上述矛盾,人們提出了開發(fā)工作板即局域網(wǎng)工作交流平臺(tái)的構(gòu)想,通過(guò)局域網(wǎng)工作交流平臺(tái)軟件,企業(yè)員工可以隨時(shí)的進(jìn)行即時(shí)信息傳遞,鑿開網(wǎng)絡(luò)會(huì)議等,有利于提高工作效率,同時(shí)有保護(hù)了企業(yè)內(nèi)部的信息安全。1.4本文的主要工作隨著用戶對(duì)軟件功能的需求不斷提高,企業(yè)即時(shí)通訊的產(chǎn)品也不斷地更新?lián)Q代。企業(yè)即時(shí)通訊的發(fā)展不論是在基礎(chǔ)應(yīng)用方面還是在擴(kuò)展應(yīng)用方面都有著飛躍。本文首先對(duì)工作板即基于局域網(wǎng)工作交流平臺(tái)軟件的發(fā)展以及其對(duì)人們的生活有何影響作了簡(jiǎn)述,并對(duì)開發(fā)環(huán)境和工具進(jìn)行了相應(yīng)說(shuō)明并對(duì)此工作交流平臺(tái)軟件系統(tǒng)進(jìn)行了較為詳細(xì)的分析;進(jìn)而提出了該多功能交流平臺(tái)軟件的設(shè)計(jì)方案。在本次多功能工作交流平臺(tái)軟件的設(shè)計(jì)與開發(fā)中,本人主要設(shè)計(jì)開發(fā)登錄模塊、注冊(cè)模塊、聊天模塊、并對(duì)此工作交流平臺(tái)軟件系統(tǒng)的登錄模塊、注冊(cè)模塊、聊天模塊的設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行了較詳細(xì)的說(shuō)明和分析。
2相關(guān)技術(shù)及環(huán)境簡(jiǎn)介在確定系統(tǒng)的開發(fā)前景、意義、目標(biāo)之后,就是選擇好開發(fā)工具以及運(yùn)用相關(guān)的技術(shù)來(lái)開發(fā)系統(tǒng)。在模式上,我們選擇C/S架構(gòu)的操作模式,這樣可以方便公司統(tǒng)一管理,使得公司只需維護(hù)服務(wù)器,員工只要安裝客戶端即可做相關(guān)操作。接下來(lái),將對(duì)本系統(tǒng)所用到的開發(fā)環(huán)境、語(yǔ)言和相關(guān)技術(shù)進(jìn)行介紹,主要是對(duì)本次開發(fā)涉及到的理論知識(shí)和用到的開發(fā)工具做相關(guān)闡述。2.1MyEclipse介紹MyEclipse企業(yè)級(jí)工作平臺(tái)(MyEclipseEnterpriseWorkbench,簡(jiǎn)稱MyEclipse)是對(duì)EclipseIDE的擴(kuò)展,利用它我們可以在數(shù)據(jù)庫(kù)和JavaEE的開發(fā)、發(fā)布以及應(yīng)用程序服務(wù)器的整合方面極大的提高工作效率。它是功能豐富的JavaEE集成開發(fā)環(huán)境,包括了完備的編碼、調(diào)試、測(cè)試和發(fā)布功能,完整支持HTML,Struts,,JSP,CSS,Javascript,Spring,SQL,Hibernate。MyEclipse是一個(gè)十分優(yōu)秀的用于開發(fā)Java,J2EE的Eclipse插件集合,MyEclipse的功能非常強(qiáng)大,支持也十分廣泛,尤其是對(duì)各種開源產(chǎn)品的支持十分不錯(cuò)。MyEclipse目前支持JavaServlet,AJAX,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC數(shù)據(jù)庫(kù)鏈接工具等多項(xiàng)功能??梢哉f(shuō)MyEclipse是幾乎囊括了目前所有主流開源產(chǎn)品的專屬eclipse開發(fā)工具。在結(jié)構(gòu)上,MyEclipse的特征可以被分為7類:JavaEE模型WEB開發(fā)工具EJB開發(fā)工具應(yīng)用程序服務(wù)器的連接器JavaEE項(xiàng)目部署服務(wù)數(shù)據(jù)庫(kù)服務(wù)MyEclipse整合幫助對(duì)于以上每一種功能上的類別,在Eclipse中都有相應(yīng)的功能部件,并通過(guò)一系列的插件來(lái)實(shí)現(xiàn)它們。MyEclipse結(jié)構(gòu)上的這種模塊化,可以讓我們?cè)诓挥绊懫渌K的情況下,對(duì)任一模塊進(jìn)行單獨(dú)的擴(kuò)展和升級(jí)。簡(jiǎn)單而言,MyEclipse是Eclipse的插件,也是一款功能強(qiáng)大的JavaEE集成開發(fā)環(huán)境,支持代碼編寫、配置、測(cè)試以及除錯(cuò),MyEclipse5.5以前版本需先安裝Eclipse。MyEclipse5.5以后版本安裝時(shí)不需安裝Eclipse。2.2Java語(yǔ)言Java語(yǔ)言是SUN公司于1995年5月推出的新一代面向?qū)ο蟮挠?jì)算機(jī)通用編程語(yǔ)言,是繼WWW之后又一引起世界轟動(dòng)的產(chǎn)品。Java語(yǔ)言的特點(diǎn)是跨平臺(tái)和強(qiáng)大的網(wǎng)絡(luò)編程功能。在Java語(yǔ)言誕生之前,Internet已存在,所以Java語(yǔ)言本身就封裝了大量進(jìn)行網(wǎng)絡(luò)編程的類庫(kù),使得網(wǎng)絡(luò)編程功能強(qiáng)大,同時(shí)又簡(jiǎn)化了網(wǎng)絡(luò)編程的操作。因此利用Java語(yǔ)言可以開發(fā)出功能強(qiáng)大的網(wǎng)絡(luò)應(yīng)用程序。2.2.1Jar命令功能:Java歸檔工具語(yǔ)法:jar[命令選項(xiàng)][manifest]destinationinput-file[input-files]jar工具是個(gè)java應(yīng)用程序,可將多個(gè)文件合并為單個(gè)JAR歸檔文件。jar是個(gè)多用途的存檔及壓縮工具,它基于ZIP和ZLIB壓縮格式。然而,設(shè)計(jì)jar的主要目的是便于將javaapplet或應(yīng)用程序打包成單個(gè)歸檔文件。將applet或應(yīng)用程序的組件(.class文件、圖像和聲音)合并成單個(gè)歸檔文件時(shí),可以用java代理(如瀏覽器)在一次HTTP事務(wù)處理過(guò)程中對(duì)它們進(jìn)行下載,而不是對(duì)每個(gè)組件都要求一個(gè)新連接。這大大縮短了下載時(shí)間。jar還能壓縮文件,從而進(jìn)一步提高了下載速度。此外,它允許applet的作者對(duì)文件中的各個(gè)項(xiàng)進(jìn)行簽名,因而可認(rèn)證其來(lái)源。jar工具的語(yǔ)法基本上與tar命令的語(yǔ)法相同。命令選項(xiàng):-c:在標(biāo)準(zhǔn)輸出上創(chuàng)建新歸檔或空歸檔。-t:在標(biāo)準(zhǔn)輸出上列出內(nèi)容表。-x[file]:從標(biāo)準(zhǔn)輸入提取所有文件,或只提取指定的文件。如果省略了file,則提取所有文件;否則只提取指定文件。-f:第二個(gè)參數(shù)指定要處理的jar文件。在-c(創(chuàng)建)情形中,第二個(gè)參數(shù)指的是要?jiǎng)?chuàng)建的jar文件的名稱(不是在標(biāo)準(zhǔn)輸出上)。在-t(表(或-x(抽取)這兩種情形中,第二個(gè)參數(shù)指定要列出或抽取的jar文件。-v:在標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備上生成長(zhǎng)格式的輸出結(jié)果。-m:包括指定的現(xiàn)有清單文件中的清單信息。用法舉例:“jarcmfmyManifestFilemyJarFile*.class”-0:只儲(chǔ)存,不進(jìn)行ZIP壓縮。-M:不創(chuàng)建項(xiàng)目的清單文件。-u:通過(guò)添加文件或更改清單來(lái)更新現(xiàn)有的JAR文件。例如:“jar-uffoo.jarfoo.class”將文件foo.class添加到現(xiàn)有的JAR文件foo.jar中,而“jarumfmanifestfoo.jar”則用manifest中的信息更新foo.jar的清單。-C:在執(zhí)行jar命令期間更改目錄。例如:“jar-uffoo.jar-Cclasses*”將classes目錄內(nèi)的所有文件加到foo.jar中,但不添加類目錄本身。2.2.2Java和InternetTCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)是internet的主要協(xié)議,定義了計(jì)算機(jī)和外設(shè)進(jìn)行通信所使用的規(guī)則(應(yīng)用層,傳輸層,網(wǎng)絡(luò)層,鏈路層)。大多數(shù)基于internet的應(yīng)用程序被看作TCP/IP協(xié)議的上一層.如:ftp,http,smtp,pop3,telnet,nntp等。Java提供的網(wǎng)絡(luò)功能有三大類:URL,Socket,Datagram.其中,URL是三大功能中最高級(jí)的一種,通過(guò)URLJava程序可以直接送出或讀入網(wǎng)絡(luò)上的數(shù)據(jù)。Socket是傳統(tǒng)網(wǎng)絡(luò)程序最常用的方式,可以想象為兩個(gè)不同的程序通過(guò)網(wǎng)絡(luò)的通信信道。Datagram是更低級(jí)的網(wǎng)絡(luò)傳輸方式,它把數(shù)據(jù)的目的紀(jì)錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡(luò)上。2.3C/S模式介紹20世紀(jì)90年代出現(xiàn)并迅速占據(jù)主導(dǎo)地位的一種計(jì)算模式為客戶機(jī)/服務(wù)器模式,簡(jiǎn)稱為C/S模式,它實(shí)際上就是把主機(jī)—終端模式中原來(lái)全部集中在主機(jī)部分的任務(wù)一分為二,保留在主機(jī)上的部分負(fù)責(zé)集中處理和匯總運(yùn)算,成為服務(wù)器;而下放到終端的部分負(fù)責(zé)為用戶提供友好的交互界面,稱為客戶機(jī)。相對(duì)于以前的模式,C/S模式最大的改進(jìn)是不再把所有軟件都裝進(jìn)一臺(tái)計(jì)算機(jī),而是把應(yīng)用系統(tǒng)分成兩個(gè)不同的角色和兩個(gè)不同的地位:一般在運(yùn)算能力較強(qiáng)的計(jì)算機(jī)上安裝服務(wù)器端程序,而在一般的PC上安裝客戶機(jī)程序。正是由于個(gè)人PC機(jī)的出現(xiàn)使客戶機(jī)/服務(wù)器模式成為可能,因?yàn)镻C機(jī)具有一定的運(yùn)算能力,用它代替了上面第一種模式的啞終端后,就可以把主機(jī)端的一部分工作放在客戶機(jī)端完成,從而減輕了主機(jī)的負(fù)擔(dān),也增加了系統(tǒng)對(duì)用戶的響應(yīng)速度和響應(yīng)能力。客戶機(jī)和服務(wù)器之間通過(guò)相應(yīng)的網(wǎng)絡(luò)協(xié)議來(lái)進(jìn)行通訊??蛻魴C(jī)向服務(wù)器發(fā)出數(shù)據(jù)請(qǐng)求,服務(wù)器將數(shù)據(jù)傳送給客戶機(jī)進(jìn)行計(jì)算,計(jì)算完畢,計(jì)算結(jié)果可返回給服務(wù)器。這種模式的優(yōu)點(diǎn)充分利用了客戶機(jī)的性能,使計(jì)算能力大大提高;另外,由于客戶機(jī)和服務(wù)器之間的通訊是通過(guò)網(wǎng)絡(luò)協(xié)議進(jìn)行的,是一種邏輯的聯(lián)系,因此物理上在客戶機(jī)和服務(wù)器兩端是易于擴(kuò)充的。C/S模式是目前占主流的網(wǎng)絡(luò)計(jì)算模式。該模式在操作過(guò)程中采取的是主動(dòng)請(qǐng)示方式:首先服務(wù)器方要先啟動(dòng),并根據(jù)請(qǐng)示提供相應(yīng)服務(wù)(過(guò)程如下):打開一個(gè)通信通道同時(shí)通知本地主機(jī),服務(wù)器愿意在某一個(gè)公認(rèn)地址上接收客戶請(qǐng)求。等待某個(gè)客戶請(qǐng)求到達(dá)該端口。接收到重復(fù)服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答信號(hào)。返回第二步,等待另一客戶請(qǐng)求。關(guān)閉該服務(wù)器??蛻舳耍捍蜷_一個(gè)通信通道,并連接到服務(wù)器所在主機(jī)的特定端口。向服務(wù)器發(fā)送服務(wù)請(qǐng)求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請(qǐng)求。請(qǐng)求結(jié)束后關(guān)閉通信通道并終止。分布運(yùn)算和分布管理是客戶機(jī)/服務(wù)器模式的特點(diǎn)。最后選擇了C/S模式。2.4Socket編程2.4.1Socket簡(jiǎn)介Socket,簡(jiǎn)稱套接字,用于實(shí)現(xiàn)網(wǎng)絡(luò)上客戶和服務(wù)器之間的連接。也就是說(shuō)網(wǎng)絡(luò)上兩個(gè)或兩個(gè)以上雙工方式通信的進(jìn)程之間總有一個(gè)連接,這個(gè)連接的端點(diǎn)成為套接字,套接字是在比較低的層次上通信的。具體的說(shuō):一個(gè)服務(wù)器應(yīng)用程序一般偵聽一個(gè)特定的端口等待客戶端的連接請(qǐng)求,當(dāng)一個(gè)連接請(qǐng)求到達(dá)時(shí),客戶端和服武器端建立一個(gè)通信連接,在連接過(guò)程中,客戶端被分配一個(gè)本地端口與一個(gè)Socket建立連接,客戶端通過(guò)寫Socket來(lái)通知服務(wù)器,以讀Socket中的信息,類似的服務(wù)器也獲得一個(gè)本地端口,它需要一個(gè)新的端口號(hào)來(lái)偵聽原始端口上的其他連接請(qǐng)求。服務(wù)器也通過(guò)它的本地端口連接一個(gè)Socket,通過(guò)讀寫和客戶端通信。Socket程序的工作過(guò)程:建立Socket連接:在通信開始之前由通信雙方確認(rèn)身份,建立一條專用的虛擬連接通道。數(shù)據(jù)通信:利用虛擬連接通道傳送數(shù)據(jù)信息進(jìn)行通道。關(guān)閉:通信結(jié)束時(shí),再將所建的虛擬連接拆除。具體如下圖2-17.關(guān)閉3.客戶端socket6.寫5.讀5.讀6.寫7.關(guān)閉4.接收2.監(jiān)聽1.服務(wù)器socket:7.關(guān)閉3.客戶端socket6.寫5.讀5.讀6.寫7.關(guān)閉4.接收2.監(jiān)聽1.服務(wù)器socket圖2-1Socket套接字原理圖2.4.2關(guān)于TCP/IP協(xié)議TCP協(xié)議是網(wǎng)絡(luò)通信的基石,對(duì)此Java專門提供了Socket的類庫(kù),在其中抽象出TCP協(xié)議通信的常用方法:TCP協(xié)議與三次握手。為了實(shí)現(xiàn)客戶端同服務(wù)器端的通信,客戶端首先發(fā)送一個(gè)“SYN”數(shù)據(jù)包。如果服務(wù)器收到SYN標(biāo)記,它將發(fā)回一個(gè)“SYN+ACK”數(shù)據(jù)包。接著,客戶端為了表示收到了這個(gè)SYN+ACK信息,會(huì)向服務(wù)器發(fā)送一個(gè)最終確認(rèn)信息(ACK包)。這種SYN,SYN+ACK,ACK的步驟被稱為TCP連接建立時(shí)的“三次握手”,在這之后,連接就建立起來(lái)了,這個(gè)連接將一直保持活動(dòng)狀態(tài),直到超時(shí)或者任何一方發(fā)出一個(gè)FIN(結(jié)束)信號(hào)。這種通信模式也叫客戶端/服務(wù)器(C/S)模式。如下圖2-2:第一次握手,主機(jī)A向主機(jī)B發(fā)送連接請(qǐng)求第一次握手,主機(jī)A向主機(jī)B發(fā)送連接請(qǐng)求第二次握手,主機(jī)B收到主機(jī)A的請(qǐng)求,向主機(jī)A回發(fā)一個(gè)確認(rèn),同時(shí)向主機(jī)A發(fā)送一個(gè)連接請(qǐng)求第二次握手,主機(jī)B收到主機(jī)A的請(qǐng)求,向主機(jī)A回發(fā)一個(gè)確認(rèn),同時(shí)向主機(jī)A發(fā)送一個(gè)連接請(qǐng)求主機(jī)A主機(jī)B SYN=1,SEQ= ACK=1,SYN=1,SEQ=第三次握手,主機(jī)A收到主機(jī)B發(fā)送的數(shù)據(jù)包再向主機(jī)B發(fā)送一個(gè)確認(rèn)連接第三次握手,主機(jī)A收到主機(jī)B發(fā)送的數(shù)據(jù)包再向主機(jī)B發(fā)送一個(gè)確認(rèn)連接 ACK=1圖2-2三次握手協(xié)議由此可見,通過(guò)客戶端和服務(wù)器的“三次握手”,雙方可以建立暢通的通信信道,在此信道上雙方互相傳輸數(shù)據(jù)。2.4.3服務(wù)器和客戶機(jī)網(wǎng)絡(luò)最基本的目的就是讓兩臺(tái)機(jī)器連接到一起,并相互“交談”或者“溝通”。一旦兩臺(tái)機(jī)器都發(fā)現(xiàn)了對(duì)方,就可以展開一次令人愉快的雙向?qū)υ?。但它們?cè)鯓硬拍堋鞍l(fā)現(xiàn)”對(duì)方呢?這就像在游樂(lè)園里那樣,一臺(tái)機(jī)器不得不停留在一個(gè)地方,偵聽其他機(jī)器說(shuō):“嘿!你在哪里呢?”
“停留在一個(gè)地方”的機(jī)器叫做“服務(wù)器”(Server),到處“找人”的機(jī)器則叫做“客戶機(jī)”(Client)或者“客戶”。它們之間的區(qū)別只有在客戶機(jī)試圖同服務(wù)器連接的時(shí)候才顯得非常明顯。一旦連通,就變成了一種雙向通信,誰(shuí)來(lái)扮演服務(wù)器或者客戶機(jī)便顯得不那么重要了。
所以服務(wù)器的主要任務(wù)是偵聽建立連接的請(qǐng)求,這是由我們創(chuàng)建的特定服務(wù)器對(duì)象完成的。而客戶機(jī)的任務(wù)是試著與一臺(tái)服務(wù)器建立連接,這是由我們創(chuàng)建的特定客戶機(jī)對(duì)象完成的。一旦連接建好,那么無(wú)論在服務(wù)器端還是客戶機(jī)端,連接只是魔術(shù)般地變成了一個(gè)IO數(shù)據(jù)流對(duì)象。從這時(shí)開始,我們可以像讀寫一個(gè)普通的文件那樣對(duì)待連接。所以一旦建好連接,我們只需使用自己熟悉的IO命令即可。這正是Java聯(lián)網(wǎng)最方便的一個(gè)地方。如下圖2-3:服務(wù)器服務(wù)器 Socket(TCP)Socket(TCP)Socket(TCP)………… UDPUDPUDP圖2-3服務(wù)器和客戶機(jī)的連接2.5編程運(yùn)行環(huán)境1.硬件環(huán)境:CPU:Inter(R)Core(TM)i5CPU內(nèi)存:3GB硬盤:500GB2.軟件環(huán)境:操作系統(tǒng):Windows7應(yīng)用軟件:MyEclipse8.5+JDK1.7+Oracle11g2.6ORACLE數(shù)據(jù)庫(kù)簡(jiǎn)介ORACLE數(shù)據(jù)庫(kù)系統(tǒng)是美國(guó)ORACLE公司(甲骨文)提供的以分布式數(shù)據(jù)庫(kù)為核心的一組軟件產(chǎn)品,是目前最流行的客戶/服務(wù)器(CLIENT/SERVER)或B/S體系結(jié)構(gòu)的數(shù)據(jù)庫(kù)之一。比如SilverStream就是基于數(shù)據(jù)庫(kù)的一種中間件。ORACLE數(shù)據(jù)庫(kù)是目前世界上使用最為廣泛的數(shù)據(jù)庫(kù)管理系統(tǒng),作為一個(gè)通用的數(shù)據(jù)庫(kù)系統(tǒng),它具有完整的數(shù)據(jù)管理功能;作為一個(gè)關(guān)系數(shù)據(jù)庫(kù),它是一個(gè)完備關(guān)系的產(chǎn)品;作為分布式數(shù)據(jù)庫(kù)它實(shí)現(xiàn)了分布式處理功能。但它的所有知識(shí),只要在一種機(jī)型上學(xué)習(xí)了ORACLE知識(shí),便能在各種類型的機(jī)器上使用它。Oracle數(shù)據(jù)庫(kù)最新版本為OracleDatabase12c。Oracle數(shù)據(jù)庫(kù)12c引入了一個(gè)新的多承租方架構(gòu),使用該架構(gòu)可輕松部署和管理數(shù)據(jù)庫(kù)云。此外,一些創(chuàng)新特性可最大限度地提高資源使用率和靈活性,如OracleMultitenant可快速整合多個(gè)數(shù)據(jù)庫(kù),而AutomaticDataOptimization和HeatMap能以更高的密度壓縮數(shù)據(jù)和對(duì)數(shù)據(jù)分層。這些獨(dú)一無(wú)二的技術(shù)進(jìn)步再加上在可用性、安全性和大數(shù)據(jù)支持方面的主要增強(qiáng),使得Oracle數(shù)據(jù)庫(kù)12c2.7JDBCJDBC(JavaDataBaseConnectivity,java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫的類和接口組成。JDBC為工具/數(shù)據(jù)庫(kù)開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開發(fā)人員能夠用純JavaAPI編寫數(shù)據(jù)庫(kù)應(yīng)用程序,同時(shí),JDBC也是個(gè)商標(biāo)名。有了JDBC,向各種關(guān)系數(shù)據(jù)發(fā)送SQL語(yǔ)句就是一件很容易的事。換言之,有了JDBCAPI,就不必為訪問(wèn)Sybase數(shù)據(jù)庫(kù)專門寫一個(gè)程序,為訪問(wèn)Oracle數(shù)據(jù)庫(kù)又專門寫一個(gè)程序,或?yàn)樵L問(wèn)Informix數(shù)據(jù)庫(kù)又編寫另一個(gè)程序等等,程序員只需用JDBCAPI寫一個(gè)程序就夠了,它可向相應(yīng)數(shù)據(jù)庫(kù)發(fā)送SQL調(diào)用。同時(shí),將Java語(yǔ)言和JDBC結(jié)合起來(lái)使程序員不必為不同的平臺(tái)編寫不同的應(yīng)用程序,只須寫一遍程序就可以讓它在任何平臺(tái)上運(yùn)行,這也是Java語(yǔ)言“編寫一次,處處運(yùn)行”的優(yōu)勢(shì)。Java數(shù)據(jù)庫(kù)連接體系結(jié)構(gòu)是用于Java應(yīng)用程序連接數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)方法。JDBC對(duì)Java程序員而言是API,對(duì)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)連接的服務(wù)提供商而言是接口模型。作為API,JDBC為程序開發(fā)提供標(biāo)準(zhǔn)的接口,并為數(shù)據(jù)庫(kù)廠商及第三方中間件廠商實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接提供了標(biāo)準(zhǔn)方法。JDBC使用已有的SQL標(biāo)準(zhǔn)并支持與其它數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn),如ODBC之間的橋接。JDBC實(shí)現(xiàn)了所有這些面向標(biāo)準(zhǔn)的目標(biāo)并且具有簡(jiǎn)單、嚴(yán)格類型定義且高性能實(shí)現(xiàn)的接口。2.8小結(jié)本章主要是介紹本系統(tǒng)設(shè)計(jì)及開發(fā)所要涉及的相關(guān)技術(shù)。從程序員的角度簡(jiǎn)單概括性地介紹了相關(guān)知識(shí),如用到的開發(fā)工具、開發(fā)環(huán)境、系統(tǒng)需要的技術(shù)支持,系統(tǒng)運(yùn)行環(huán)境等,從而能從整體上對(duì)現(xiàn)系統(tǒng)的技術(shù)層次有一定的了解。本章作為此次設(shè)計(jì)的第二章,主要是考慮到有些知識(shí)事先介紹能讓讀者對(duì)于系統(tǒng)的框架和內(nèi)容初步的認(rèn)識(shí),而且能夠更好的理清此次設(shè)計(jì)思路和開發(fā)方案。
3需求分析3.1可行性分析3.1.1經(jīng)濟(jì)可行性由于本系統(tǒng)的主要背景是畢業(yè)課程設(shè)計(jì),不注重直接的經(jīng)濟(jì)效益和其后的發(fā)展方向,只在注重自身水平和能力的提高,對(duì)自身的經(jīng)濟(jì)要求也不高,只要有一臺(tái)能運(yùn)行Java軟件的電腦便可,相關(guān)資料參考文獻(xiàn)可從網(wǎng)上和圖書館查找,所以不用考慮到經(jīng)濟(jì)問(wèn)題。3.1.2技術(shù)可行性技術(shù)上的可行性分析主要分析技術(shù)條件能順利完成開發(fā)工作,硬、軟件能滿足開發(fā)者的需要等。系統(tǒng)的軟件開發(fā)平臺(tái)已成熟可行。硬件方面,科技飛速發(fā)展的今天,硬件更新的速度越來(lái)越快,容量越來(lái)越大,可靠性越來(lái)越高,價(jià)格越來(lái)越低,其硬件平臺(tái)完全能滿足此系統(tǒng)的需要。本系統(tǒng)的開發(fā)利用Oracle11g作為本系統(tǒng)的數(shù)據(jù)庫(kù),它是一個(gè)支持多用戶的新型數(shù)據(jù)庫(kù),適用于大中規(guī)模的數(shù)據(jù)量需求。學(xué)校校園網(wǎng)的建設(shè)也為新系統(tǒng)服務(wù)器/客戶端的結(jié)構(gòu)提供了硬件的支持。使用Java作為系統(tǒng)開發(fā)的開發(fā)環(huán)境,它提供完善的指令控制語(yǔ)句、類與對(duì)象的支持及豐富的數(shù)據(jù)類型,給開發(fā)高性能系統(tǒng)提供的保障為開發(fā)滿足客戶要求的系統(tǒng),保證了代碼的模塊化要求,而代碼模塊化的提高,非常有利于以后對(duì)新系統(tǒng)的擴(kuò)展與修改。3.1.3操作可行性本系統(tǒng)為一個(gè)小型的局域網(wǎng)聊天系統(tǒng),所耗費(fèi)的資源非常的小,現(xiàn)在一般的電腦無(wú)論是硬件還是軟件都能夠滿足條件,因此,本系統(tǒng)在運(yùn)行上是可行的。3.1.4需求可行性分析可靠性高,能在由于系統(tǒng)問(wèn)題或其它原因產(chǎn)生錯(cuò)誤后,作出相對(duì)應(yīng)處理,比如網(wǎng)絡(luò)初始化失敗、服務(wù)器不在線等,可以提示用戶安全退出本程序,在出現(xiàn)不可知的錯(cuò)誤以后,可以盡量安全的退出程序。在程序的設(shè)計(jì)過(guò)程中,要求能盡可能多的設(shè)想到用戶使用過(guò)程中可能發(fā)生的事件,并能在判斷事件后做出相應(yīng)的處理,使程序具有較高的容錯(cuò)性能。宜操作性,程序簡(jiǎn)單易懂,容易上手使用。設(shè)計(jì)界面是,簡(jiǎn)化界面的復(fù)雜性,模擬QQ等現(xiàn)有即時(shí)通訊工具的界面,使用戶能很容易看懂并使用。開發(fā)文檔易理解,保證以后自己二次開發(fā)或他人接手開發(fā)時(shí),能夠清晰的理解整個(gè)系統(tǒng)的設(shè)計(jì)思路和實(shí)現(xiàn)細(xì)節(jié)。模塊化設(shè)計(jì)此軟件的功能,不同的模塊實(shí)現(xiàn)不同的功能,使得軟件易于以后的維護(hù)與擴(kuò)展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應(yīng)用。3.1.5性能可行性從時(shí)間上看,在三個(gè)月的時(shí)間里學(xué)習(xí)相關(guān)知識(shí),并開發(fā)系統(tǒng),時(shí)間上是有點(diǎn)緊,但是可以實(shí)現(xiàn),通過(guò)三個(gè)多月的努力功能基本上是可以實(shí)現(xiàn)的。綜上所述,本系統(tǒng)的設(shè)計(jì)與開發(fā)在技術(shù)上和軟、硬件設(shè)備上的條件都是滿足的,因此,它在技術(shù)上是可行的。3.2系統(tǒng)功能需求本系統(tǒng)主要通過(guò)客戶端、服務(wù)器端來(lái)體現(xiàn)工作板系統(tǒng)的基本功能。1、服務(wù)器端處理用戶注冊(cè)處理用戶登錄處理用戶發(fā)送信息,服務(wù)器監(jiān)控聊天內(nèi)容,服務(wù)器過(guò)濾非法內(nèi)容處理用戶得到信息處理用戶退出存用戶聊天信息。2、客戶端(1)用戶注冊(cè)界面及結(jié)果
(2)用戶登錄界面及結(jié)果
(3)用戶發(fā)送信息界面及結(jié)果
(4)用戶得到信息界面及結(jié)果
(5)用戶退出界面及結(jié)果3.3系統(tǒng)性能需求1.實(shí)用性:為局域網(wǎng)交流提供方便,有效進(jìn)行作業(yè)管理??蓱?yīng)用于企業(yè)辦公室,以及校園電子閱覽室
2.操作簡(jiǎn)單:本系統(tǒng)應(yīng)該適用于不同水平的使用者,包括事業(yè)單位和企業(yè)單位,同時(shí)系統(tǒng)不應(yīng)太復(fù)雜和煩瑣,因此要求系統(tǒng)的操作盡可能簡(jiǎn)單易行。
3.技術(shù)先進(jìn):產(chǎn)品的系統(tǒng)設(shè)計(jì)和開發(fā)應(yīng)緊跟著整個(gè)計(jì)算機(jī)發(fā)展潮流,采用當(dāng)時(shí)最先進(jìn)的設(shè)計(jì)思想,利用最新的開發(fā)技術(shù)和開發(fā)工具。使系統(tǒng)能夠無(wú)論在功能設(shè)計(jì)上,還是在技術(shù)實(shí)現(xiàn)上,都處于同行業(yè)的領(lǐng)先地位。4.安裝使用簡(jiǎn)便:服務(wù)器端的安裝簡(jiǎn)潔明了,客戶機(jī)無(wú)需再裝任何軟件就可以直接注冊(cè)登陸聊天。5.代碼可讀性好:文中的代碼將盡可能簡(jiǎn)潔、易懂。3.4系統(tǒng)運(yùn)行環(huán)境運(yùn)行環(huán)境Windows7必要環(huán)境JDK1.6以上
硬件環(huán)境CPU400MHz以上,內(nèi)存64MB以上
4概要設(shè)計(jì)在這里我們將該工作板即基于局域網(wǎng)工作交流平臺(tái)系統(tǒng)命名為IMessaging,現(xiàn)在對(duì)該系統(tǒng)進(jìn)行概要設(shè)計(jì)。采用客戶機(jī)/服務(wù)器(C/S)的模式來(lái)設(shè)計(jì),是一個(gè)2層的C/S結(jié)構(gòu):應(yīng)用程序服務(wù)器→應(yīng)用程序客戶端,其分層機(jī)構(gòu)如圖4-1所示。圖4-1C/S客戶層也叫做應(yīng)用表示層,也就是我們說(shuō)的客戶端,這是應(yīng)用程序的用戶接口部分。給即時(shí)通訊工具設(shè)計(jì)一個(gè)客戶層具有很多優(yōu)點(diǎn),這是因?yàn)榭蛻魧訐?dān)負(fù)著用戶與應(yīng)用間的對(duì)話功能。它用于檢查用戶的輸入數(shù)據(jù),顯示應(yīng)用的輸出數(shù)據(jù)。為了使用戶能直接地進(jìn)行操作,客戶層需要使用圖形用戶接口。若通訊用戶變更,系統(tǒng)只需要改寫顯示控制和數(shù)據(jù)檢查程序就可以了,而不會(huì)影響其他兩層。服務(wù)層又叫做功能層,相當(dāng)于應(yīng)用的本體,它是將具體的業(yè)務(wù)處理邏輯編入程序中。例如,用戶需要檢查數(shù)據(jù),系統(tǒng)設(shè)法將有關(guān)檢索要求的信息一次性地傳送給功能層;而用戶登錄后,聊天登錄信息是由功能層處理過(guò)的檢索結(jié)果數(shù)據(jù),它也是一次性傳送給表示層的。在應(yīng)用設(shè)計(jì)中,必須避免在表示層和功能層之間進(jìn)行多次的數(shù)據(jù)交換,這就需要盡可能進(jìn)行一次性的業(yè)務(wù)處理,達(dá)到優(yōu)化整體設(shè)計(jì)的目的。軟件開發(fā)過(guò)程中的概要設(shè)計(jì),主要解決實(shí)現(xiàn)該系統(tǒng)需求的程序模塊設(shè)計(jì)問(wèn)題。包括如何把該系統(tǒng)劃分成若干個(gè)模塊、決定各個(gè)模塊之間的接口、模塊之間傳遞的信息,以及模塊結(jié)構(gòu)的設(shè)計(jì)等。4.1工作板即基于局域網(wǎng)工作交流平臺(tái)系統(tǒng)的實(shí)施原理4.1.1工作方式和技術(shù)原理本系統(tǒng)的IM工作方式如下:登陸IMessaging通訊服務(wù)器,獲取一個(gè)自建立的歷史的交流對(duì)象列表(同事列表),然后自身標(biāo)志為在線狀態(tài),當(dāng)好友列表中的某人在任何時(shí)候登錄上線并試圖通過(guò)你的計(jì)算機(jī)聯(lián)系你時(shí),IM系統(tǒng)會(huì)發(fā)一個(gè)消息提醒你,然后你能與他建立一個(gè)聊天會(huì)話通道進(jìn)行各種消息如鍵入文字、通過(guò)語(yǔ)音等的交流,從技術(shù)上來(lái)說(shuō),聊天系統(tǒng)的基本技術(shù)原理如下:第一步,用戶A輸入自己的用戶名和密碼登錄IM服務(wù)器,服務(wù)器通過(guò)讀取用戶數(shù)據(jù)庫(kù)來(lái)驗(yàn)證用戶身份,如果驗(yàn)證通過(guò),登記用戶A的IP地址、IM客戶端軟件的版本號(hào)及使用的TCP/UDP端口號(hào),然后返回用戶A登錄成功的標(biāo)志,此時(shí)用戶A在IM系統(tǒng)中的狀態(tài)為在線(OnlinePresence)。第二步,根據(jù)用戶A存儲(chǔ)在IM服務(wù)器上的好友列表(BuddyList),服務(wù)器將用戶A在線的相關(guān)信息發(fā)送給也同時(shí)在線的IM好友的PC機(jī),這些信息包括在線狀態(tài)、IP地址、IM客戶端使用的TCP端口(Port)號(hào)等,IM好友的客戶端收到此信息后將在予以提示。第三步是IM服務(wù)器把用戶A存儲(chǔ)在服務(wù)器上的好友列表及相關(guān)信息回送到他的客戶端機(jī),這些信息包括也在線狀態(tài)、IP地址、IM客戶端使用的TCP端口(Port)號(hào)等信息,用戶A的IM客戶端收到后將顯示這些好友列表及其在線狀態(tài)。4.1.2通訊方式在本系統(tǒng)中,如果用戶A想與他的在線好友用戶B聊天,他將直接通過(guò)服務(wù)器發(fā)送過(guò)來(lái)的用戶B的IP地址、TCP端口號(hào)等信息,直接向用戶B的PC機(jī)發(fā)出聊天信息,用戶B的IM客戶端軟件收到后顯示在屏幕上,然后用戶B再直接回復(fù)到用戶A的PC機(jī),這樣雙方的即時(shí)文字消息就不再IM服務(wù)器中轉(zhuǎn),而是直接通過(guò)網(wǎng)絡(luò)進(jìn)行點(diǎn)對(duì)點(diǎn)的通訊,即對(duì)等通訊方式(PeerToPeer)。4.2軟件設(shè)計(jì)流程因?yàn)樵撓到y(tǒng)其需求是十分明確的,所以該系統(tǒng)的開發(fā)流程采用瀑布模型進(jìn)行設(shè)計(jì),分為幾大步驟:先進(jìn)行需求分析,再是系統(tǒng)設(shè)計(jì),然后是詳細(xì)設(shè)計(jì)與編碼,其次是軟件的測(cè)試,最后是軟件的運(yùn)行和維護(hù)。在實(shí)際過(guò)程中這些步驟經(jīng)常是重疊和彼此間有信息交換,它不是一個(gè)簡(jiǎn)單線性過(guò)程,而是包括開發(fā)步驟的多個(gè)反復(fù)。如圖4-2所示。需求分析需求分析系統(tǒng)設(shè)計(jì)詳細(xì)設(shè)計(jì)與編碼軟件測(cè)試 軟件運(yùn)行與維護(hù)圖4-2工作板即基于局域網(wǎng)工作交流平臺(tái)系統(tǒng)開發(fā)流程圖4.3系統(tǒng)功能模塊根據(jù)以上分析,本系統(tǒng)主要完成以下幾方面的功能,如圖4-3客戶端工作板(工作交流平臺(tái))操作數(shù)據(jù)庫(kù)服務(wù)器端聊天添加好友查找好友用戶登錄用戶注冊(cè)監(jiān)聽客戶建立連接客戶端工作板(工作交流平臺(tái))操作數(shù)據(jù)庫(kù)服務(wù)器端聊天添加好友查找好友用戶登錄用戶注冊(cè)監(jiān)聽客戶建立連接交互圖4-3系統(tǒng)功能模塊1、服務(wù)器端在服務(wù)器端,主要的功能模塊是建立連接、操作數(shù)據(jù)庫(kù)和監(jiān)聽客戶。2、客戶端在客戶端,系統(tǒng)主要實(shí)現(xiàn)的功能模塊有用戶注冊(cè)、用戶登錄、查找好友、添加好友、聊天和文件傳輸。4.4客戶端實(shí)現(xiàn)流程圖客戶端的實(shí)現(xiàn)流程具體如下:用戶首先進(jìn)行注冊(cè),注冊(cè)成功后,將注冊(cè)信息保存到數(shù)據(jù)庫(kù)中。接下來(lái)用戶就可以登陸系統(tǒng),通過(guò)數(shù)據(jù)庫(kù)驗(yàn)證用戶名和密碼,若用戶名和密碼存在且正確,則登陸成功,反之,則重新注冊(cè)。登陸成功后,系統(tǒng)會(huì)自動(dòng)從數(shù)據(jù)庫(kù)中更新用戶的好友列表,雙擊好友頭像,打開聊天窗口就可以同好友進(jìn)行交流。如圖4-4所示:登錄點(diǎn)擊登錄,連接到數(shù)據(jù)庫(kù)用戶名和密碼是否為空登錄點(diǎn)擊登錄,連接到數(shù)據(jù)庫(kù)用戶名和密碼是否為空是是注冊(cè)是否成功 注冊(cè)是否成功否否 驗(yàn)證用戶名注冊(cè)用戶名是否存在 否注冊(cè)用戶名是否存在開始密碼是否正確 是開始密碼是否正確 是我的好友列表 我的好友列表雙擊我的好友雙擊我的好友聊天窗口聊天窗口結(jié)束結(jié)束圖4-4客戶端實(shí)現(xiàn)流程圖4.5類模塊設(shè)計(jì)各類模塊設(shè)計(jì)概要:LoginFrame類:用戶登陸,主程序入口類,啟動(dòng)各個(gè)主要線程ChatFrame類:用戶交流
RegFrame類:用戶注冊(cè)
RecvThread類:接收消息線程
SendFileThread類:發(fā)送文件FileRecvListenThread類:文件傳輸監(jiān)聽線程FileReceiverThread類:接受文件………由于該系統(tǒng)文件很多,更多請(qǐng)參照系統(tǒng)源文件4.6程序設(shè)計(jì)的重點(diǎn)1、界面設(shè)計(jì)
界面統(tǒng)一,色彩大氣,通用,操作流程化,按鈕、字體中規(guī)中矩,快捷鍵一致。2、功能設(shè)計(jì)由于該系統(tǒng)牽涉到的功能很多,設(shè)計(jì)的時(shí)候應(yīng)該注意主次分明,應(yīng)該把每一個(gè)模塊設(shè)計(jì)好,各個(gè)模塊之間互不干擾。4.7接口設(shè)計(jì)1.外部接口
(1)用戶界面本軟件的屏幕格式,按鈕格式,輸入輸出方式等都是完全按照人性化的設(shè)計(jì),方便用戶執(zhí)行各種操作。各個(gè)按鈕簡(jiǎn)單明了,互動(dòng)性強(qiáng),適用于各類人群。用戶通過(guò)主界面的按鈕進(jìn)行系統(tǒng)的控制,同時(shí)系統(tǒng)返回一個(gè)信息。
(2)硬件接口
本軟件產(chǎn)品的用戶需要通過(guò)鍵盤及鼠標(biāo)進(jìn)行操作,進(jìn)入主界面后點(diǎn)擊相應(yīng)的按鈕,進(jìn)行規(guī)定的鍵盤操作,然后分別在主界面有相應(yīng)的動(dòng)作反應(yīng)。
(3)本軟件與操作平臺(tái)無(wú)關(guān),能適用于各種操作系統(tǒng)。2.內(nèi)部接口
內(nèi)部模塊之間的接口是通過(guò)內(nèi)部函數(shù)完成,在程序設(shè)計(jì)中用設(shè)計(jì)軟件本身所帶的調(diào)用函數(shù)實(shí)現(xiàn)。
5詳細(xì)設(shè)計(jì)5.1系統(tǒng)功能要求5.1.1基于局域網(wǎng)工作交流平臺(tái)的要求此軟件是模擬現(xiàn)今國(guó)內(nèi)最為流行的即時(shí)性通訊工具QQ而設(shè)計(jì)的,能夠?qū)崿F(xiàn)注冊(cè)、登錄、添加好友、文字聊天、等功能。該軟件是采用C/S結(jié)構(gòu),即客戶端與服務(wù)器端的結(jié)構(gòu)體系?;趯?duì)該軟件功能的分析,本文分別對(duì)客戶端與服務(wù)器端進(jìn)行了設(shè)計(jì)。該軟件服務(wù)器端的功能是實(shí)現(xiàn)對(duì)客戶端提交的用戶信息進(jìn)行處理。服務(wù)器設(shè)計(jì)內(nèi)容包含:信息接收、注冊(cè)、登錄、添加好友等?!靶畔⒔邮铡笔翘峁┓?wù)器接受客戶端發(fā)送信息的功能;“注冊(cè)”是服務(wù)器端接受到用戶的注冊(cè)信息請(qǐng)求后,將請(qǐng)求信息寫入到數(shù)據(jù)庫(kù),為用戶的注冊(cè)提了相關(guān)服務(wù);“登錄”是服務(wù)器通過(guò)驗(yàn)證登錄信息來(lái)實(shí)現(xiàn)相關(guān)的服務(wù);“好友添加”是服務(wù)器對(duì)添加的好友信息進(jìn)行處理等相關(guān)操作??蛻舳思从脩羰褂玫膽?yīng)用程序端。用戶通過(guò)該軟件的客戶端來(lái)實(shí)現(xiàn)網(wǎng)上聊天的相關(guān)功能:注冊(cè)、登錄、添加好友、文字聊天、聊天等。注冊(cè)功能是提交用戶相關(guān)信息以及獲得一個(gè)屬于自己登錄該聊天軟件系統(tǒng)的用戶ID號(hào);登錄功能是實(shí)現(xiàn)驗(yàn)證用戶信息與合法使用該聊天軟件系統(tǒng)的權(quán)限;添加好友是實(shí)現(xiàn)用戶之間好友添加的操作;添加好友成功后,就可以與好友之間開始文字聊天、文件傳輸、聊天等功能。5.1.2基于局域網(wǎng)工作交流平臺(tái)的管理子系統(tǒng)要求對(duì)數(shù)據(jù)庫(kù)中的在線用戶信息進(jìn)行管理。對(duì)數(shù)據(jù)庫(kù)中的非在線用戶信息進(jìn)行管理。對(duì)數(shù)據(jù)庫(kù)中的聊天信息進(jìn)行管理。5.2系統(tǒng)性能要求系統(tǒng)的性能要求一般包括:計(jì)算和查詢響應(yīng)時(shí)間、處理容量、存儲(chǔ)容量、人機(jī)交互的友好性、系統(tǒng)的安全性、可靠性以及容錯(cuò)能力等,如果是網(wǎng)絡(luò)系統(tǒng)還應(yīng)包括系統(tǒng)傳輸交換能力。本系統(tǒng)非網(wǎng)絡(luò)系統(tǒng),所以符合系統(tǒng)的一般性能要求即可。系統(tǒng)的性能要求應(yīng)從以下幾個(gè)方面確定:(1)容量要求:確定系統(tǒng)的容量要求,如處理的記錄數(shù)和處理數(shù)據(jù)的最大容量等(2)精度要求:確定系統(tǒng)的精度要求,如數(shù)據(jù)或數(shù)值檢索的精度要求、數(shù)據(jù)傳輸?shù)木纫蟮取?3)時(shí)間特性要求:確定系統(tǒng)的時(shí)間特性要求。如處理時(shí)間、響應(yīng)時(shí)間及其峰值負(fù)載期間允許偏離范圍,系統(tǒng)各項(xiàng)功能的順序關(guān)系,由于輸入類型的不同和操作方式的變化引起的有限順序的變化。(4)適應(yīng)性要求:必須指明反映系統(tǒng)環(huán)境變化的系統(tǒng)適應(yīng)能力和系統(tǒng)適應(yīng)能力的各種參數(shù)。說(shuō)明當(dāng)需求發(fā)生變化時(shí)系統(tǒng)的適應(yīng)能力,指出為適應(yīng)這些變化而需要設(shè)計(jì)的軟件和過(guò)程。(5)人機(jī)交互友好性:要有適應(yīng)與用戶特點(diǎn)的智能化人機(jī)交互界面,便于用戶操作使用。(6)系統(tǒng)可靠性:為提高系統(tǒng)可靠性必須采用模塊化、結(jié)構(gòu)化設(shè)計(jì),需要對(duì)容錯(cuò)處理的模塊提供備份,以減少系統(tǒng)故障。(7)系統(tǒng)可維修性:系統(tǒng)應(yīng)具有奧好的可維修性,以便在系統(tǒng)故障時(shí)能迅速恢復(fù)運(yùn)行。本系統(tǒng)應(yīng)具有如下性能:(1)數(shù)據(jù)庫(kù)系統(tǒng)的擴(kuò)充能力(2)快速的信息交換能力(3)快速的響應(yīng)能力(4)具有較大的數(shù)據(jù)存儲(chǔ)能力(5)系統(tǒng)迅速恢復(fù)能力5.3數(shù)據(jù)庫(kù)設(shè)計(jì)基于局域網(wǎng)工作交流平臺(tái)是一個(gè)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng),系統(tǒng)的所有信息都是保存在數(shù)據(jù)庫(kù)中。在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的開發(fā)中,數(shù)據(jù)庫(kù)的結(jié)構(gòu)設(shè)計(jì)是一個(gè)非常重要的問(wèn)題。我們這里所說(shuō)的數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)是指數(shù)據(jù)庫(kù)中各個(gè)表結(jié)構(gòu)的設(shè)計(jì),包括信息存在哪個(gè)表中、各個(gè)表的結(jié)構(gòu)如何以及各個(gè)表之間的關(guān)系。數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)的好壞,將直接對(duì)應(yīng)用系統(tǒng)的效率以及實(shí)現(xiàn)的效果產(chǎn)生影響,好的數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)會(huì)減少數(shù)據(jù)庫(kù)的存儲(chǔ)量,數(shù)據(jù)的完整性和一致性比較高,系統(tǒng)具有較快的響應(yīng)速度,簡(jiǎn)化基于此數(shù)據(jù)庫(kù)的應(yīng)用程序的實(shí)現(xiàn)等。本系統(tǒng)使用的是ORACLE數(shù)據(jù)庫(kù)。5.3.1數(shù)據(jù)庫(kù)需求分析數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)的第一個(gè)階段,也是非常重要的一個(gè)階段時(shí)數(shù)據(jù)庫(kù)需求分心。在這個(gè)階段主要時(shí)收集基本數(shù)據(jù)以及數(shù)據(jù)處理的流程,為以后進(jìn)一步設(shè)計(jì)打下基礎(chǔ)。1.內(nèi)容:調(diào)查應(yīng)用系統(tǒng)用戶所需要操作的數(shù)據(jù),決定在數(shù)據(jù)庫(kù)中存儲(chǔ)什么數(shù)據(jù)。2.處理:調(diào)查應(yīng)用系統(tǒng)用戶要求對(duì)數(shù)據(jù)進(jìn)行什么樣的處理,理清數(shù)據(jù)庫(kù)中各種數(shù)據(jù)之間的關(guān)系。3.數(shù)據(jù)項(xiàng):包括名稱、含義、類型、取值范圍、長(zhǎng)度以及和其他數(shù)據(jù)項(xiàng)之間的邏輯關(guān)系。4.數(shù)據(jù)結(jié)構(gòu):若干個(gè)數(shù)據(jù)項(xiàng)有意義的集合,包括名稱、含義以及組成數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)項(xiàng)。5.3.2數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)設(shè)計(jì)概念結(jié)構(gòu)是獨(dú)立于實(shí)際數(shù)據(jù)模型的信息結(jié)構(gòu),必須將其轉(zhuǎn)化為邏輯結(jié)構(gòu)后才能進(jìn)行數(shù)據(jù)庫(kù)應(yīng)用的設(shè)計(jì).也就是要將概念上的結(jié)構(gòu)轉(zhuǎn)化為數(shù)據(jù)庫(kù)系統(tǒng)所支持的實(shí)際數(shù)據(jù)模型。第一種轉(zhuǎn)化是將實(shí)體轉(zhuǎn)化為關(guān)系表。這種轉(zhuǎn)化比較簡(jiǎn)單,只需要將實(shí)體的屬性定義為表的屬性即可。第二種轉(zhuǎn)化是聯(lián)系的轉(zhuǎn)化。即將各個(gè)實(shí)體之間的聯(lián)系轉(zhuǎn)化為表格之間的關(guān)系,如外部鍵的定義。在上面工作的基礎(chǔ)上的基礎(chǔ)上歸納出人員管理數(shù)據(jù)庫(kù)表格的組成、列的屬性、表格之間的聯(lián)系等等。該數(shù)據(jù)庫(kù)系統(tǒng)要求具有以下方面的特點(diǎn):結(jié)構(gòu)合理;所建立的數(shù)據(jù)冗余度小,獨(dú)立性強(qiáng);建檔、修改、查詢、統(tǒng)計(jì)快準(zhǔn)確;保密性、可靠性好。。5.3.3數(shù)據(jù)庫(kù)表的創(chuàng)建工作板即基于局域網(wǎng)工作交流平臺(tái)系統(tǒng)中各個(gè)表格的設(shè)計(jì)結(jié)果如下面的各表格所示。每個(gè)表格表示數(shù)據(jù)庫(kù)中的一個(gè)表。本系統(tǒng)中,主要包含兩個(gè)表:一個(gè)是保存用戶用戶名和密碼的P_user表,另一個(gè)是保存用戶基本信息的dtproperties表。具體內(nèi)容如下:表5-1dtproperties表列名數(shù)據(jù)類型說(shuō)明ID主鍵Number包含一個(gè)作為記錄識(shí)別標(biāo)志的長(zhǎng)整數(shù)的數(shù)字域。是用戶表的主索引。ObjectidNumber包含用戶的ID。PropertyVarchar2包含用戶存儲(chǔ)個(gè)人信息ValueVarchar2包含用戶注冊(cè)密碼UvalueVarchar2包含用戶昵稱LvalueBlob包含用戶頭像表5-2P_user表列名數(shù)據(jù)類型說(shuō)明P_usernameVarchar2包含用戶名P_passwordVarchar2包含用戶登錄密碼5.4系統(tǒng)基本功能設(shè)計(jì)與實(shí)現(xiàn)本設(shè)計(jì)主要完成的是服務(wù)器程序模塊,以及客戶端登錄、注冊(cè)模塊、添加好友模塊、聊天模塊和文件傳輸模塊,本節(jié)對(duì)系統(tǒng)主要功能模塊設(shè)計(jì)進(jìn)行詳細(xì)的說(shuō)明。5.4.1服務(wù)器程序模塊設(shè)計(jì)與實(shí)現(xiàn)服務(wù)器與客戶間通過(guò)套接口Socket(TCP)連接。在java中使用套接口相當(dāng)簡(jiǎn)單,JavaAPI為處理套接口的通信提供了一個(gè)類.Socket,使得編寫網(wǎng)絡(luò)應(yīng)用程序相對(duì)容易。服務(wù)器采用多線程以滿足多用戶的請(qǐng)求,并通過(guò)創(chuàng)建一個(gè)ServerSocket對(duì)象來(lái)監(jiān)聽來(lái)自客戶的連接請(qǐng)求,默認(rèn)端口為8000,然后無(wú)限循環(huán)調(diào)用accept()方法接受客戶程序的連接。服務(wù)器具有以下功能:?jiǎn)?dòng)服務(wù),建立偵聽,接受客戶端連接。從流中讀取經(jīng)過(guò)序列化的對(duì)象。分析讀取的對(duì)象進(jìn)行相應(yīng)的操作(登錄信息的驗(yàn)證反饋、注冊(cè)信息的驗(yàn)證和反饋、轉(zhuǎn)發(fā)聊天信息等)。向客戶端發(fā)送系統(tǒng)消息。保存日志。關(guān)閉服務(wù),并向客戶端發(fā)送服務(wù)器關(guān)閉消息。服務(wù)器程序模塊源碼:ServerSocketserverSocket;//服務(wù)器套接字staticVectoru=newVector(1,1);//初始聊天用戶對(duì)象集staticVectorv=newVector(1,1);//初始聊天信息對(duì)象集publicvoidrun() { Try //無(wú)限循環(huán)實(shí)現(xiàn)多線程,實(shí)現(xiàn)與多個(gè)用戶的同時(shí)連接 while(true) { //監(jiān)聽并接受客戶的請(qǐng)求 Socketclient=serverSocket.accept(); //繼承Thread支持多線程 newConnection(client,u,v); }} catch(IOExceptione) {fail(e,"不能監(jiān)聽!");} }當(dāng)用戶發(fā)送聊天信息時(shí),服務(wù)端將會(huì)收到客戶端用Socket傳輸過(guò)來(lái)的聊天信息對(duì)象,然后將其強(qiáng)制轉(zhuǎn)換為Chat對(duì)象,并將本次用戶的聊天信息對(duì)象添加到聊天對(duì)象集Message中,以供所有聊天用戶訪問(wèn)。5.4.2用戶注冊(cè)模塊設(shè)計(jì)與實(shí)現(xiàn)客戶端通過(guò)RegFrame.java請(qǐng)求注冊(cè),填寫用戶名、密碼、昵稱和頭像等注冊(cè)信息,并驗(yàn)證用戶名是否與數(shù)據(jù)庫(kù)中的用戶名重復(fù),用戶名和密碼是否為空。如果用戶名不與數(shù)據(jù)庫(kù)中的信息重復(fù),且用戶名和密碼不為空,則注冊(cè)成功;反之,則系統(tǒng)提示重新輸入。相關(guān)界面如圖5-1。驗(yàn)證要求如下:1、驗(yàn)證用戶名是否為空:即用戶名的字符長(zhǎng)度不為0,,如果驗(yàn)證通過(guò),就繼續(xù)下面驗(yàn)證,否則返回錯(cuò)誤信息。2、驗(yàn)證密碼是否為空:即密碼的字符長(zhǎng)度不為0,如果驗(yàn)證通過(guò),就繼續(xù)下面驗(yàn)證,否則返回錯(cuò)誤信息。圖5-1注冊(cè)界面主要實(shí)現(xiàn)代碼如下:jb1.addActionListener(newActionListener(){@Override publicvoidactionPerformed(ActionEventarg0){ lf1.isreg=true; Propertiesp=lf1.p; try{Socketsock=newSocket(p.getProperty("server"),Integer.parseInt(p.getProperty("port")));lf1.socket=sock; Stringusername=usertext.getText(); Stringpwd=jtf2.getText(); OutputStreamos=sock.getOutputStream(); PrintStreamps=newPrintStream(os); //發(fā)送驗(yàn)證信息 ps.println("reg:"+username+":"+pwd); BufferedReaderbr=newBufferedReader(newInputStreamReader(sock.getInputStream())); //接受驗(yàn)證結(jié)果 Stringresult=br.readLine(); if(result.equals("ok")) { //注冊(cè)成功,在服務(wù)器寫入用戶名和密碼,在本地生成相應(yīng)的文件 jLabel.setText("注冊(cè)成功"); Filefile=newFile(".\\"+username); file.mkdir(); file=newFile(".\\"+username+"\\my.txt"); file.createNewFile(); Filef2=newFile(".\\"+username+"\\friends.txt"); f2.createNewFile(); Stringindex=newInteger(jcb1.getSelectedIndex()).toString(); Propertiesp2=newProperties(); p2.setProperty("myQname",jtf3.getText()); p2.setProperty("mytitle",titletext.getText()); p2.setProperty("myimg",index);FileOutputStreamoStream=newFileOutputStream(file.getAbsolutePath()); p2.store(oStream,null); } else{ jLabel.setText("注冊(cè)失敗"); } }catch(NumberFormatExceptione){ e.printStackTrace(); }catch(UnknownHostExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace();} }});5.4.3用戶登錄模塊設(shè)計(jì)與實(shí)現(xiàn)系統(tǒng)的登錄模塊是比較重要的,這是用戶的一個(gè)身份驗(yàn)證,是通訊系統(tǒng)必須的一個(gè)功能模塊。用戶在注冊(cè)獲得賬號(hào)和密碼后,在LoginFrame.java登錄界面填寫用戶名和密碼,并封裝成對(duì)象,通過(guò)建立在Socket的連接至上的對(duì)象輸出流將用戶登錄信息提交給服務(wù)器,服務(wù)器通過(guò)用戶提交過(guò)來(lái)的信息和數(shù)據(jù)庫(kù)中原有的用戶信息進(jìn)行比較和驗(yàn)證,如果結(jié)果一致表明驗(yàn)證成功,并將該用戶的狀態(tài)改為在線,最后將登錄結(jié)果返回給客戶端。如果登錄成功,客戶端將繼續(xù)啟動(dòng)聊天主界面。如果不一致,給用戶返回登錄錯(cuò)誤信息。驗(yàn)證要求如下:1、驗(yàn)證用戶名是否為空:即用戶名的字符長(zhǎng)度不為0,如果驗(yàn)證通過(guò),就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回錯(cuò)誤信息。2、驗(yàn)證密碼是否為空:即密碼的字符長(zhǎng)度不為0,如果驗(yàn)證通過(guò),就進(jìn)行繼續(xù)下面驗(yàn)證,否則返回錯(cuò)誤信息。以下為登錄驗(yàn)證的流程圖:驗(yàn)證輸入信息登錄系統(tǒng)開始驗(yàn)證輸入信息登錄系統(tǒng)開始 不符合結(jié)束進(jìn)入系統(tǒng)符合結(jié)束進(jìn)入系統(tǒng)圖5-2用戶登錄流程圖當(dāng)以上信息驗(yàn)證成功時(shí),客戶端將打開與服務(wù)之間的Socket連接,用對(duì)象輸出流包裝后將用戶登錄的信息發(fā)送給服務(wù)器端,并接收服務(wù)器處理完用戶登錄的信息。
當(dāng)客戶端收到服務(wù)器返回的信息時(shí),將會(huì)用信息對(duì)話框的形式告知用戶是否登錄成功,若成功則顯示收發(fā)主界面MainFrame,關(guān)閉Socket連接。相關(guān)界面如圖5-3。圖5-3登錄界面主要實(shí)現(xiàn)代碼如下://登錄界面publicLoginFrame(){//讀取配置文件,連接服務(wù)器需要 HelpTool.ReadServerConfig(p,".\\server.txt"); System.out.println(p.getProperty("server")+p.getProperty("port")); //設(shè)置窗體關(guān)閉事件 jf1.addWindowListener(newWindowAdapter(){ @Override publicvoidwindowClosing(WindowEventarg0){ System.exit(1); } }); //設(shè)置發(fā)送密碼驗(yàn)證按鈕事件 jb1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ try{ //創(chuàng)建Socket來(lái)發(fā)送驗(yàn)證信息 if(!isreg) socket=newSocket(HelpTool.server_ip,HelpTool.port); OutputStreamos=socket.getOutputStream(); PrintStreamps=newPrintStream(os); ps.println("new:"+jtf1.getText()+":"+jtf2.getText()); //等待服務(wù)器發(fā)送驗(yàn)證結(jié)果BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream())); Stringresult=br.readLine(); if(result.equals("right")) { jf1.setVisible(false); MainFramemf=newMainFrame(socket,jtf1.getText()); } }catch(UnknownHostExceptione1){ e1.printStackTrace(); }catch(IOExceptione1){ e1.printStackTrace(); } } });5.4.4添加好友模塊設(shè)計(jì)與實(shí)現(xiàn)用戶在登錄成功后會(huì)進(jìn)入客戶端界面。如果想和朋友進(jìn)行聊天,就將好友的用戶名輸入到文本框中并用鼠標(biāo)點(diǎn)擊擊添加好友,好友收到對(duì)方請(qǐng)求后,點(diǎn)擊“是”,則成功添加好友。相關(guān)界面如圖5-4。圖5-4添加好友界面主要實(shí)現(xiàn)代碼如下: 1.在MainFrame.java界面中,當(dāng)用戶點(diǎn)擊“添加好友”按鈕時(shí),觸發(fā)添加好友事件。代碼如下://添加好友事件 set.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEventarg0){ Stringname=addfriend.getText(); if(!name.isEmpty()) { try{ OutputStreamos=clientSocket.getOutputStream(); PrintStreamps=newPrintStream(os); ps.println("addfriend:"+name+":"+me); }catch(IOExceptione){ e.printStackTrace(); } } } });2.在RecvThread.java中,當(dāng)添加好友的請(qǐng)求傳送到服務(wù)器時(shí),服務(wù)器啟動(dòng)線程處理添加好友的請(qǐng)求,處理代碼如下://有人請(qǐng)求添加好友 elseif(ss[0].equals("addfriend")) { Stringinfo=ss[1]+"想加你為好友,你是否接受?";intresult=javax.swing.JOptionPane.showConfirmDialog(null,info,"添加好友",javax.swing.JOptionPane.YES_NO_OPTION,javax.swing.JOptionPane.INFORMATION_MESSAGE);if(result==JOptionPane.YES_OPTION) { OutputStreamos=s.getOutputStream(); PrintStreamps=newPrintStream(os);ps.println("sendfriend:"+ss[1]+":"+me.getName()+":"+me.getQname()+":"+me.getTitle()+":"+me.getImg()); Propertiesp=newProperties(); Personperson=newPerson(ss[1],ss[2],ss[3],Integer.parseInt(ss[4])); HelpTool.ReadServerConfig(p,".\\"+me.getName()+"\\friends.txt"); p.setProperty(ss[1],ss[2]+","+ss[3]+","+ss[4]); FileWriterfos=newFileWriter(".\\"+me.getName()+"\\friends.txt"); p.store(fos,null); friends.put(ss[1],person); listModel.addElement(person); changeStatus(ss[1],1); }}5.4.5聊天模塊設(shè)計(jì)與實(shí)現(xiàn)聊天信息的發(fā)送與接收都是通過(guò)Socket類實(shí)現(xiàn)的。將要發(fā)送的內(nèi)容輸入文本框,當(dāng)用戶點(diǎn)擊完發(fā)送按鈕后,程序開始將當(dāng)前用戶名、聊天對(duì)象和聊天內(nèi)容進(jìn)行封裝,然后獲取Socket連接,再用對(duì)象輸出流包裝Socket的輸出流將聊天信息對(duì)象發(fā)送給服務(wù)器端。圖5-5好友聊天界面主要實(shí)現(xiàn)代碼如下:1.在MainFrame.java界面中,在成功添加好友,雙擊好友頭像,即打開了聊天界面ChatFrame.java(如圖5-5),具體實(shí)現(xiàn)代碼如下://雙擊好友頭像事件 MouseListenermouseListener=newMouseAdapter(){ publicvoidmouseClicked(MouseEvente){ if(e.getClickCount()==2){ intindex=friendList.locationToIndex(e.getPoint()); Personperson=(Person)listModel.get(index); try{ Objecttmp=ChatFrames.get(person.getName()); if(tmp==null) { ChatFramecFrame=newChatFrame(clientSocket,person); ChatFrames.put(person.getName(),cFrame); cFrame.jf.setVisible(true); } else { ChatFramecf=(ChatFrame)tmp; cf.jf.setVisible(true); } }catch(NumberFormatExceptione1){ e1.printStackTrace(); }System.out.println("DoubleclickedonItem"+person.getQname());}}};2.在ChatFrame.java界面中的文本框中輸入要發(fā)送給好友的內(nèi)容,當(dāng)用戶點(diǎn)擊完“發(fā)送”按鈕后,程序開始將當(dāng)前用戶名、聊天對(duì)象和聊天內(nèi)容進(jìn)行封裝,然后獲取Socket連接,再用對(duì)象輸出流包裝Socket的輸出流將聊天信息對(duì)象發(fā)送給服務(wù)器端。具體實(shí)現(xiàn)代碼如下://確認(rèn)添加好友,并發(fā)送自己的信息 elseif(ss[0].equals("sendfriend")) { System.out.println(str); Propertiesp=newProperties(); Personps=newPerson(ss[1],ss[2],ss[3],Integer.parseInt(ss[4])); HelpTool.ReadServerConfig(p,".\\"+me.getName()+"\\friends.txt"); p.setProperty(ss[1],ss[2]+","+ss[3]+","+ss[4]); FileWriterfos=newFileWriter(".\\"+me.getName()+"\\friends.txt"); p.store(fos,null); listModel.addElement(ps); friends.put(ss[1],ps); changeStatus(ss[1],1);}//設(shè)置發(fā)送按鈕的發(fā)送事件 sendbtn.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ Stringsendstr=ChatStr.getText(); try{ OutputStreamos=client.getOutputStream(); PrintStreamps=newPrintStream(os); ps.println("talk:"+op.getName()+":"+sendstr); Stringrecord=ChatRecord.getText(); ChatRecord.setText(record+"我說(shuō):"+sendstr+"\n"); ChatStr.setText(""); }catch(IOExceptione1){ e1.printStackTrace(); } } });5.4.6文件傳輸模塊設(shè)計(jì)與實(shí)現(xiàn)在用戶聊天窗口中,點(diǎn)擊“發(fā)送文件”,在發(fā)送文件窗口中選擇要發(fā)送的文件,好友收到對(duì)方請(qǐng)求后,好友同意,此時(shí)就可以給好友發(fā)送文件。相關(guān)界面如圖5-6,5-7,,5-8。圖5-6選擇文件界面圖5-7是否接收文件對(duì)話框圖5-8文件傳輸界面主要實(shí)現(xiàn)代碼如下:1.在ChatFrame.java界面中,當(dāng)用戶點(diǎn)擊完“發(fā)送文件”按鈕后,觸發(fā)發(fā)送文件事件,出現(xiàn)如圖5-6的選擇文件窗口。代碼如下://設(shè)置發(fā)送文件按鈕的發(fā)送事件 sendfilebtn.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ JFileChooserjfc=newJFileChooser("choosefile"); jfc.setDialogTitle("Chose..."); intresult=jfc.showOpenDialog(null); jfc.setVisible(true); FileselectedFile=null; if(result==JFileChooser.APPROVE_OPTION){ selectedFile=jfc.getSelectedFile(); if(selectedFile.exists()){ OutputStreamos; try{ os=client.getOutputStream(); PrintStreamps=newPrintStream(os);ps.println("sendfile:"+op.getName()+":"+selectedFile.getName()); Sockets=newSocket(HelpTool.server_ip,HelpTool.fileport); SendFileThreadsfr=newSendFileThread(selectedFile,s); sfr.start(); }catch(IOExceptione){ e.printStackTrace(); } System.out.println("Yes!Youhaveselectedtherightfile."+selectedFile.getName()); }else{ System.out.println("No!Youdidnotselecttherightfile."); } }elseif(result==JFileChooser.CANCEL_OPTION){ System.out.println("Cancelbuttonispushed."); }elseif(result==JFileChooser.ERROR_OPTION){ System.err.println("Errorwhenselectfile."); } } });2.在選擇文件窗口中,選擇好準(zhǔn)備發(fā)送給好友的文件,點(diǎn)擊“打開”,系統(tǒng)則自動(dòng)為好友彈出一個(gè)確認(rèn)是否接收文件的對(duì)話框(如圖5-7)。代碼如下//確認(rèn)接收文件 elseif(ss[0].equals("sendfile")) { Stringinfo=ss[1]+"想給你傳送文件:"+ss[2]+",你是否接受?";intresult=javax.swing.JOptionPane.showConfirmDialog(null,info,"文件傳輸",javax.swing.JOptionPane.YES_NO_OPTION,javax.swing.JOptionPane.INFORMATION_MESSAGE); if(result==JOptionPane.YES_OPTION) { JFileChooserjfc=newJFileChooser("choosefile"); jfc.setDialogTitle("Chose..."); jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); intresult1=jfc.showOpen
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《論文寫作》課程課件
- 內(nèi)蒙古鄂爾多斯西部四旗2025屆高三下第一次測(cè)試數(shù)學(xué)試題含解析
- 湖北省沙洋縣后港中學(xué)2025屆高考英語(yǔ)五模試卷含解析
- 浙江省樂(lè)清市知臨中學(xué)2025屆高三二診模擬考試英語(yǔ)試卷含解析
- 吉林省長(zhǎng)春二中2025屆高考數(shù)學(xué)四模試卷含解析
- 陜西省西安市長(zhǎng)安區(qū)2025屆高三下學(xué)期聯(lián)合考試數(shù)學(xué)試題含解析
- 2025屆天津五區(qū)縣高考考前提分語(yǔ)文仿真卷含解析
- 現(xiàn)代學(xué)徒制課題:市域產(chǎn)教聯(lián)合體與行業(yè)產(chǎn)教融合共同體內(nèi)開展現(xiàn)場(chǎng)工程師培養(yǎng)的機(jī)制創(chuàng)新研究(研究思路模板、技術(shù)路線圖)
- 2025屆四川省德陽(yáng)五中高考仿真卷語(yǔ)文試卷含解析
- 安徽省安慶市六校2025屆高三第六次模擬考試數(shù)學(xué)試卷含解析
- 發(fā)酵酸菜加工廠建設(shè)項(xiàng)目可行性研究報(bào)告
- 包豪斯對(duì)現(xiàn)代設(shè)計(jì)的影響
- 基于分形結(jié)構(gòu)的多頻與寬帶天線技術(shù)研究
- 人間生活-中國(guó)部分+課件高中美術(shù)湘美版(2019)美術(shù)鑒賞1
- YY/T 1771-2021彎曲-自由恢復(fù)法測(cè)試鎳鈦形狀記憶合金相變溫度
- LY/T 1755-2008國(guó)家濕地公園建設(shè)規(guī)范
- JJF 1874-2020(自動(dòng))核酸提取儀校準(zhǔn)規(guī)范
- GB/T 7378-2012表面活性劑堿度的測(cè)定滴定法
- GB/T 37762-2019同步調(diào)相機(jī)組保護(hù)裝置通用技術(shù)條件
- GB/T 36961-2018超高強(qiáng)鋼熱沖壓工藝通用技術(shù)
- 國(guó)開Photoshop圖像處理模式試題1及答案
評(píng)論
0/150
提交評(píng)論