畢業(yè)設(shè)計格式范文樣本_第1頁
畢業(yè)設(shè)計格式范文樣本_第2頁
畢業(yè)設(shè)計格式范文樣本_第3頁
畢業(yè)設(shè)計格式范文樣本_第4頁
畢業(yè)設(shè)計格式范文樣本_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

資料內(nèi)容僅供您學(xué)習(xí)參考,如有不當(dāng)或者侵權(quán),請聯(lián)系改正或者刪除?;贘AVA實(shí)現(xiàn)聊天室***(巢湖學(xué)院計算機(jī)科學(xué)與技術(shù)系,安徽巢湖238000)摘要:隨著時代的發(fā)展,時間、信息兩個概念顯得越來越突出。在第一時間掌握第一手資料,是打敗對手取得成功的秘訣。伴隨著計算機(jī)網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,通信業(yè)也蒸蒸日上。現(xiàn)在個人電腦已普及到各個家庭、單位中。為了能實(shí)時、準(zhǔn)確地實(shí)現(xiàn)與朋友、親人、同事之間的聯(lián)系,網(wǎng)絡(luò)聊天是一種比較經(jīng)濟(jì)實(shí)惠的途徑,其發(fā)展前景可觀。本系統(tǒng)利用Java中的socket網(wǎng)絡(luò)編程和多線程技術(shù)實(shí)現(xiàn)。主要包括登陸連接、服務(wù)器管理、客戶聊天三大功能。管理員和用戶經(jīng)過登陸界面分別進(jìn)入到服務(wù)器端和客戶端,客戶經(jīng)過socket連接服務(wù)器,服務(wù)器經(jīng)過多線程技術(shù)轉(zhuǎn)發(fā)信息到其它客戶端。這種服務(wù)器集中轉(zhuǎn)發(fā)信息的優(yōu)點(diǎn)是通信穩(wěn)定,缺點(diǎn)是增加了服務(wù)器端的負(fù)擔(dān)。傳統(tǒng)的面對面之間的交流由于受地域和時間的影響,已經(jīng)滿足不了當(dāng)今社會的需求。利用聊天室這種影響將會降到最小,人與人之間的交流將會更加方便、快捷,能夠大幅度提高人們的交流效率。關(guān)鍵詞:聊天室;Java;socket;多線程;C/STheDesignandImplementationofChatRoomBasedonJAVA***(DepartmentofComputerScienceandTechnology,ChaoHuCollege,ChaoHu,AhHui,238000)Abstract:Withthedevelopmentandprogressofthetimes,theconceptoftimeandinformationbecomemoreandmoreoutstanding.Andthewinnerswillbetheoneswhofirstgraspthefirsthanddata.Astheinternettechnologyisdevelopingrapidly,thecommunicationsindustryisthrivingtoo.Personalcomputersareextensivelyspreadingamongallfamiliesandunits.Inordertocommunicatewithfamilymembers,friendsandworkmatesaccuratelybutonrealtime,chattingonnetisoneofthemoreeconomicalandsubstantialways,whichhasafavorableprospect.ThissystemtakeseffectbysocketnetworkprogramofJavaandmulti-thread,Ithasthreemainfunctionsoflogin,serversmanageandchatting.Theadministratoranduserlogonserver-sideandclient-sideseparatelybytheloginbox.Theclientsconnectthemselvestoserversthroughthesocket,thentheserverssendthesemessagestootherclientsbymulti-thread.Theadvantageofforwardinginformationscentrallyresultsinastablecommunication,butitsweaknessleadstoaburdentotheserver-side.Traditionalface-to-facecommunicationisrestrictedbytimeandregion,whichcannotmeetthedemandsofmodernsociety.Chattingroomcanreducetheinfluenceabovetotheminimum,andthecommunicationamongpeoplewillbemoreconvenientandquick,theintercourseefficiencyisincreasedgreatly.Keywords:chattingroom;java;socket;multi-thread;c/s前言使用Java開發(fā)網(wǎng)絡(luò)程序在網(wǎng)絡(luò)飛速發(fā)展的今天已經(jīng)顯得格外重要,與使用其它語言開發(fā)網(wǎng)絡(luò)程序一樣,Java的網(wǎng)絡(luò)開發(fā)是相當(dāng)方便的,經(jīng)過Socket進(jìn)行網(wǎng)絡(luò)信息傳輸。但與其它語言不同,Java語言天生具備網(wǎng)絡(luò)開發(fā)的優(yōu)越性,使用Java能夠快速開發(fā)安全的基于網(wǎng)絡(luò)的服務(wù)和應(yīng)用程序。在網(wǎng)絡(luò)飛速發(fā)展的今天,各種各樣的的交流變的非常重要。人們的交流已經(jīng)不能局限在小范圍內(nèi),人們渴望與其它國家或地區(qū)的人們進(jìn)行交流。但由于地域的限制使人們不可能在短時間內(nèi)得到面對面的交流。于是,人們不得不使用Internet這個能夠把全世界所有的人短時間內(nèi)都聯(lián)系到一起的新生事物,因此網(wǎng)上聊天室就誕生了。剛開始的聊天室的功能很簡單,就是單純的文字交流。但隨著時間的發(fā)展和技術(shù)的提高,現(xiàn)在的聊天室已經(jīng)具備強(qiáng)大的功能。例如,傳輸文件,語音聊天,視頻聊天等。使人們不但僅滿足于言語上的交流,還能夠分享彼此的珍藏的圖片,看到對方的面容。這些新功能都受到了大家的一致好評。隨著手機(jī)能夠上網(wǎng),手機(jī)也能夠登錄到網(wǎng)上聊天室中,使人們不但僅局限于坐在電腦前聊天,能夠隨時隨地的上網(wǎng)聊天。目錄第一章緒論 11.1論文背景及課題來源 11.2本課題在國內(nèi)外的發(fā)展?fàn)顩r 11.3應(yīng)解決的問題及系統(tǒng)開發(fā)意義 1第二章開發(fā)工具及相關(guān)技術(shù)介紹 22.1Java與Socket簡介 22.2JBuilder5介紹 32.3C/S模型介紹 32.4用Java實(shí)現(xiàn)Socket模型 42.5Java中的線程模型簡介 52.6SQLSERVER簡介 5第三章系統(tǒng)需求分析 73.1系統(tǒng)任務(wù)描述 73.2系統(tǒng)功能分析 73.2.1系統(tǒng)的功能需求 73.2.2系統(tǒng)數(shù)據(jù)流圖. 83.2.3系統(tǒng)數(shù)據(jù)分析 93.3系統(tǒng)可行性分析 10第四章系統(tǒng)設(shè)計 124.1系統(tǒng)總體結(jié)構(gòu)設(shè)計 124.2數(shù)據(jù)庫設(shè)計 144.3系統(tǒng)功能模塊詳細(xì)設(shè)計 14第五章編碼與實(shí)現(xiàn) 185.1系統(tǒng)主要模塊代碼 185.1.1啟動、停止服務(wù)器 185.1.2客戶端連接服務(wù)器 195.1.3聊天室發(fā)送信息 205.1.4服務(wù)器轉(zhuǎn)發(fā)信息 205.1.5服務(wù)器顯示在線用戶人數(shù) 215.2系統(tǒng)測試 21結(jié)束語 26參考文獻(xiàn) -27-致謝 -28-附錄 -29-附錄A源程序主要代碼 -29-第一章緒論1.1論文背景及課題來源隨著網(wǎng)絡(luò)技術(shù)的發(fā)展和普及,Internet已經(jīng)成為人們獲取有關(guān)信息和相互交流的重要途徑之一,越來越多的機(jī)構(gòu)和組織開始利用網(wǎng)絡(luò)資源傳遞、發(fā)布、收集和管理信息。這對各種類型的網(wǎng)絡(luò)提供一次很大的挑戰(zhàn)與機(jī)遇,特別是經(jīng)過網(wǎng)絡(luò)進(jìn)行信息交互的這種活動,更加使網(wǎng)絡(luò)的經(jīng)營方式充滿了活力和機(jī)動性[5]?;贑/S模型的Java聊天室是應(yīng)用于網(wǎng)絡(luò)交流領(lǐng)域的系統(tǒng),它的主要特點(diǎn)有:1.通用性:聊天室系統(tǒng)在各種各樣的網(wǎng)絡(luò)中均能夠運(yùn)行,系統(tǒng)具有較高的可移植性和使用性;2.實(shí)用性:系統(tǒng)具有良好的人機(jī)界面,便于各類使用者操作,提供了人性化的服務(wù);3.及時性:經(jīng)過網(wǎng)絡(luò)的連接,系統(tǒng)雙方的交流能夠在短期內(nèi)進(jìn)行,相比與傳統(tǒng)面對面的交流節(jié)省不少時間[15]。聊天室中聊天內(nèi)容的及時性和準(zhǔn)確性是極其重要的,它主要針對當(dāng)今社會快節(jié)奏生活,人們沒有很多時間來等信息。本系統(tǒng)提供的功能便于系統(tǒng)使用雙方的信息交流,有效的提高了使用者的使用效率,縮短了使用者的使用時間[6]。1.2本課題在國內(nèi)外的發(fā)展?fàn)顩r隨著網(wǎng)絡(luò)技術(shù)的發(fā)展和普及,多數(shù)網(wǎng)站紛紛利用自己的網(wǎng)絡(luò)資源建立聊天室,并為客戶提供各種各樣便捷的服務(wù)。中國的一些龍頭網(wǎng)站,如sina,有很多聊天室,供國內(nèi)外的不同的人們進(jìn)行不同話題的討論,不但將會員發(fā)展由國內(nèi)延伸到國際,更是為提高自身的知名度提供了方便[2]。聊天室的開放性、信息資源的多樣性可為網(wǎng)站發(fā)展提供優(yōu)良的廣告宣傳和商品推廣,這是其它網(wǎng)站活動方式所無法比擬的,聊天室趨向方便化、快捷化是各大網(wǎng)站成長的必然經(jīng)歷的階段[8]。1.3應(yīng)解決的問題及系統(tǒng)開發(fā)意義本系統(tǒng)針對聊天室用戶的需要,建立了客戶端和服務(wù)器端。主要解決的問題包括:1.服務(wù)器端和客戶端要實(shí)現(xiàn)界面化,而且界面盡量人性化。2.服務(wù)器端能夠正確的啟動,而且時刻監(jiān)視客戶端,保持與客戶端的連接。3.客戶端能夠快速準(zhǔn)確的連接上服務(wù)器端,發(fā)送的信息經(jīng)服務(wù)器端能夠轉(zhuǎn)發(fā)給其它客戶。4.異常處理,對于用戶的不正確的操作系統(tǒng)應(yīng)該有提示?;贑/S的Java聊天室系統(tǒng)它的開發(fā)意義在于為人們之間相互交流提供了一個快捷、方便的應(yīng)用平臺。大型網(wǎng)站能夠經(jīng)過聊天室來提高自身的知名度,增加的訪問流量。第二章開發(fā)工具及相關(guān)技術(shù)介紹2.1Java與Socket簡介Java語言是Sun公司于1991年創(chuàng)立的一種新的程序設(shè)計語言。該語言與C/C++等傳統(tǒng)程序設(shè)計語言不同,具有突出的平臺獨(dú)立性,高度的可靠性和安全性特點(diǎn)。1999年6月SUN公司重新定義了Java技術(shù)的結(jié)構(gòu),將Java2平臺分為三個版本:標(biāo)準(zhǔn)版(J2SE),企業(yè)版(J2EE)和微縮版(J2ME)。當(dāng)前,Java技術(shù)除了沿著J2SE,J2EE,J2ME三種技術(shù)為主脈絡(luò)迅速發(fā)展外,還密切關(guān)注Internet環(huán)境下各種新型信息技術(shù)的發(fā)展,并能夠迅速與這些新技術(shù)融合,積極支持這些新技術(shù)應(yīng)用的開發(fā)[1]。Socket是Java中需要編寫較低層次的網(wǎng)絡(luò)通信程序(例如Client/Server應(yīng)用程序)時提供的一種通訊機(jī)制。Socket是兩個程序進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通信的端點(diǎn),一般由一個地址加上一個端口號來標(biāo)識。每個服務(wù)程序都在一個眾所周知的端口上提供服務(wù),而想使用服務(wù)的客戶端程序則需要連接該端口。經(jīng)過Socket的數(shù)據(jù)是原始字節(jié)流信息,通信雙方必須根據(jù)約定的協(xié)議對數(shù)據(jù)進(jìn)行處理與解釋[15]。Socket通信機(jī)制提供了兩種通信方式:有連接方式(TCP)和無連接方式(UDP數(shù)據(jù)報)。有連接方式中,通信雙方在開始時必須進(jìn)行一次連接過程,建立一條通信鏈路。通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。無連接方式中,通信雙方不存在一個連接過程,一次網(wǎng)絡(luò)I/O以一個數(shù)據(jù)報形式進(jìn)行,而且每次網(wǎng)絡(luò)I/O能夠和不同主機(jī)的不同進(jìn)程進(jìn)行。無連接方式開銷小于有連接方式,可是所提供的數(shù)據(jù)傳輸服務(wù)不可靠,不能保證數(shù)據(jù)報一定到達(dá)目的地[14]。Java的有連接通信采用流式I/O模式。Socket是兩個進(jìn)程間通信鏈的端點(diǎn),每個Socket有兩個流:一個輸入流和一個輸出流。只要向Socket的輸出流寫,一個進(jìn)程就能夠經(jīng)過網(wǎng)絡(luò)連接向其它進(jìn)程發(fā)送數(shù)據(jù);同樣,經(jīng)過讀Socket的輸入流,就能夠讀取傳輸來的數(shù)據(jù)[9]。有連接通信一般要經(jīng)歷以下四個基本步驟:創(chuàng)立Socket,建立連接;打開連接到Socket的輸入/輸出流;按照一定的協(xié)議對Socket進(jìn)行讀/寫操作;關(guān)閉Socket。第(3)步是程序員用來調(diào)用Socket和實(shí)現(xiàn)程序功能的關(guān)鍵步驟,其它三步在各種程序中基本相同[5]。2.2JBuilder5介紹JBuilder5是美國Borland公司最新推出的遵循SUN公司J2EE標(biāo)準(zhǔn)的集成開發(fā)工具,是當(dāng)前使用最廣泛的Java開發(fā)工具之一。JBuilder作為業(yè)界領(lǐng)先的Java開發(fā)工具,在集成了Tomcat并支持WebLogic的同時,其套裝版更是集成了DreamweaverUltraDev,RationalRose等產(chǎn)品,JBuilder5提供了可視化的集成開發(fā)工具,支持開發(fā)人員向?qū)O大地簡化了開發(fā)人員的工作,使開發(fā)更為快捷,方便[12]。JBuilder5是一組全面的高效率工具,使用Java編程語言創(chuàng)立可伸縮的,高性能的和具有不依賴于平臺性能的應(yīng)用程序。由于可伸縮性和基于組件,JBuilder能夠開發(fā)所有級別的應(yīng)用工程,從Apple到連接企業(yè)級的,分布式的,多層解決方案的網(wǎng)絡(luò)數(shù)據(jù)庫應(yīng)用。JBuilder5環(huán)境是用純Java編寫。任何Java編寫的程序都能夠在JBuilder上運(yùn)行、調(diào)試和工作[3]。2.3C/S模型介紹C/S是Client/Server的縮寫,即客戶機(jī)/服務(wù)器技術(shù),也能夠稱為C/S模型。很顯然,C/S技術(shù)有以下幾個基本特點(diǎn):1.C/S技術(shù)一定包含兩個部分,一個作為用戶接口的前端,另一個作為共享資源接口的后端。前端被稱為客戶端,后端被稱為服務(wù)器端。客戶進(jìn)程包含邏輯和提供用戶接口,服務(wù)進(jìn)程充當(dāng)一個管理共享資源的軟件引擎,這些共享資源能夠是數(shù)據(jù)庫,打印機(jī),調(diào)制解調(diào)器和處理機(jī)等。2.前端與后端的任務(wù)對計算機(jī)資源有完全不同的要求,這些計算機(jī)資源包括:處理機(jī)速度,內(nèi)存,磁盤速度,容量,輸入輸出設(shè)備等。3.客戶機(jī)與服務(wù)器由于可能基于完全不同的硬件和操作系統(tǒng),因此它們之間的交流可能完全經(jīng)過一套標(biāo)準(zhǔn)的已定義的API與RPC。4.可伸縮性是C/S系統(tǒng)的一個很重要特性。無論是水平伸縮還是垂直伸縮都有很出眾的表現(xiàn)。在這里,水平伸縮(Horizontalscaling)意味著方便地添加和刪除客戶工作站。垂直伸縮(Verticalscaling)意味著移植到一個更大更快速的服務(wù)器或多服務(wù)器時,即服務(wù)的升級和集群都會比較方便[4]。C/S軟件技術(shù)是一種通用的,基于消息的技術(shù)。在本論文中,我們這樣描述C/S,網(wǎng)絡(luò)上的一臺計算機(jī)向網(wǎng)絡(luò)上的另外一臺計算機(jī)請求一個進(jìn)程或數(shù)據(jù),如圖1所示。響應(yīng)服務(wù)器響應(yīng)服務(wù)器客戶端請求網(wǎng)絡(luò)圖1:C/S技術(shù)模型Client/Server結(jié)構(gòu)的優(yōu)點(diǎn)是速度快,缺點(diǎn)是當(dāng)Server進(jìn)行更新時,Client也必須更新[6]。2.4用Java實(shí)現(xiàn)Socket模型首先,我們先介紹一下Socket的運(yùn)行過程。一般在服務(wù)器的指定端口被綁定一個Socket,此時服務(wù)器只是處于等待狀態(tài),監(jiān)聽客戶的連接請求。這個過程如圖2所示。服務(wù)器服務(wù)器客戶端監(jiān)聽端口連接請求圖2:服務(wù)器監(jiān)聽客戶的連接請求服務(wù)器一旦接收到客戶機(jī)的連接請求,服務(wù)器選擇一個新的端口并綁定一個新的Socket與客戶端建立的Socket對,這個過程如圖3所示。對客戶機(jī)來說,連接請求被接受,客戶端的Socket便被成功創(chuàng)立了,Socket通信便能夠開始進(jìn)行。由于Server端的輸出流是服務(wù)端的輸入流,Server端的輸入流是服務(wù)器的輸出流,反之亦然,因此,Client與Server能夠經(jīng)過讀寫各自Socket進(jìn)行交流。下面我們來看看在Java里對Socket的運(yùn)行過程實(shí)現(xiàn)。服務(wù)器使用ServerSocket類來處理客戶機(jī)的連接請求。當(dāng)客戶機(jī)連接到服務(wù)器所監(jiān)聽的端口時,ServerSocket將分監(jiān)聽端口監(jiān)聽端口服務(wù)器客戶端連接請求端口圖3:服務(wù)器處理連接請求配一個新的Socket對象。這個新的Socket對象將連接到一些新端口,負(fù)責(zé)處理與之相對應(yīng)客戶機(jī)的通信。然后,服務(wù)器繼續(xù)監(jiān)聽ServerSocket,處理新的客戶機(jī)連接。[13]客戶機(jī)首先創(chuàng)立一個Socket對象,用于和服務(wù)器的通信。之后需創(chuàng)立兩個對象:DataInputStream和PrintStream,前者用于從Socket的InputStream輸入流中讀取數(shù)據(jù),后者則用于向Socket的OutputStream的寫數(shù)據(jù)[11]。2.5Java中的線程模型簡介線程是程序中的一個執(zhí)行流。一個執(zhí)行流是由CPU運(yùn)行程序代碼并操縱程序的數(shù)據(jù)所形成的。因此,線程被認(rèn)為是以CPU為主體的行為。在Java中線程的模型就是一個CPU、程序代碼和數(shù)據(jù)的封裝體。Java中的線程模型包含三部分。(1)一個虛擬的CPU。(2)該CPU執(zhí)行的代碼。(3)代碼所操作的數(shù)據(jù)。線程模型在Java中是由Java.lang.Thread類進(jìn)行定義和描述的。程序中的線程都是Thread的實(shí)例。因此用戶能夠經(jīng)過創(chuàng)立Thread的實(shí)例或定義并創(chuàng)立Thread子類的實(shí)例建立和控制自己的線程序[7]。2.6SQLSERVER簡介SqlServer是微軟公司推出的新一代關(guān)系數(shù)據(jù)庫管理系統(tǒng),它繼承了SqlServer7.0版本的優(yōu)點(diǎn),同時又增加了許多新的功能,具有功能強(qiáng)大、使用方便、可伸縮性強(qiáng)、與相關(guān)軟件高度集成等特點(diǎn)。一經(jīng)推出,就受到了專業(yè)人士的好評,當(dāng)前已經(jīng)成為web數(shù)據(jù)庫系統(tǒng)中較為常見的一個數(shù)據(jù)庫系統(tǒng)。SqlServer可運(yùn)行在windows98/NT//XP等多種操作系統(tǒng)下[10]。SqlServer的重要管理工具:1.服務(wù)管理器能夠經(jīng)過服務(wù)管理器啟動、停止、暫停SqlServer服務(wù)器的相關(guān)服務(wù)。當(dāng)操作服務(wù)器中的數(shù)據(jù)時,應(yīng)該首先確保該服務(wù)器正常啟動了相應(yīng)的服務(wù)[13]。2.企業(yè)管理器企業(yè)管理器提供了一種圖形化界面來操作數(shù)據(jù)庫對象,在該界面中能夠進(jìn)行數(shù)據(jù)庫、表等數(shù)據(jù)對象的創(chuàng)立、查詢、修改、刪除等操作,能夠完成SqlServer中絕大多數(shù)的管理工作。3.查詢分析器查詢分析器是運(yùn)行、測試用戶的Transact-sql語句、批處理和腳本的場所。Transact-sql(又稱為t-sql)是SqlServer在標(biāo)準(zhǔn)的SQL語句上進(jìn)行了擴(kuò)充的語言,是交互式的結(jié)構(gòu)化查詢語言,能夠完成對SqlServer數(shù)據(jù)庫的所有操作。SQL(structuredquerylanguage,結(jié)構(gòu)化查詢語言)起源于IBM的實(shí)驗(yàn)室,當(dāng)前SQL語言已經(jīng)成為操作和檢索關(guān)系數(shù)據(jù)庫中數(shù)據(jù)的標(biāo)準(zhǔn)語言。在ASP中,只要訪問數(shù)據(jù)庫,就必然會使用SQL語言。第三章系統(tǒng)需求分析3.1系統(tǒng)任務(wù)描述本系統(tǒng)是采用Java基于C/S開發(fā)的聊天室。管理員在經(jīng)過登錄界面進(jìn)入管理員界面,即系統(tǒng)的服務(wù)器端并啟動服務(wù)器后。此時,如果有用戶登錄會在服務(wù)器端顯示登錄用戶的用戶名和當(dāng)前連接的用戶人數(shù),如果有用戶聊天,服務(wù)器會顯示出聊天信息。管理員在管理界面中能夠隨時關(guān)閉服務(wù)器。此時,所有的客戶端都將失去和服務(wù)器端的連接,從而,用戶所有的聊天信息發(fā)送將不成功。用戶只需要在登錄界面中輸入正確的用戶名和密碼即可登錄聊天室而且連接上服務(wù)器。在聊天室中,用戶能夠和聊天室中所有的用戶發(fā)送信息,還能夠接收所有用戶發(fā)送的信息,能夠查看到當(dāng)前服務(wù)器的狀態(tài)。如果用戶已經(jīng)登錄了聊天室,而服務(wù)器還沒有啟動,則用戶是不能夠利用聊天室收發(fā)信息的。如果在運(yùn)行過程中,服務(wù)器斷開則系統(tǒng)會有提示。3.2系統(tǒng)功能分析3.2.1系統(tǒng)的功能需求聊天室程序一般需要完成以下一些基本功能:登錄聊天室;啟動服務(wù)器;關(guān)閉服務(wù)器;用戶之間的聊天;退出聊天室。本系統(tǒng)具體功能需求如下:(1)聊天室管理員經(jīng)登錄界面登錄到管理界面,即系統(tǒng)的服務(wù)器端。用戶經(jīng)登錄界面都進(jìn)入聊天大廳。兩類界面根據(jù)系統(tǒng)使用者的角色不同,登錄界面也有所不同。(2)不論是管理員還是用戶都需要在登錄界面輸入正確的用戶名和密碼后才能夠登錄到各自的界面中去。(3)系統(tǒng)的兩個主要界面都是為方便管理員和用戶操作的。首先,管理員進(jìn)入到管理界面后能夠方便的啟動/停止服務(wù)器,看到在線用戶的信息和聊天信息。用戶進(jìn)入到聊天大廳中能夠聊天,查看服務(wù)器狀態(tài)。(4)一個用戶退出聊天室對其它用戶不能產(chǎn)生影響,而服務(wù)器斷開與客戶端的連接則所有的用戶都失去與服務(wù)器的連接。(5)用戶的聊天信息錄入,重寫,發(fā)送,接收方便,快捷。(6)服務(wù)器狀態(tài),聊天信息和在線用戶人數(shù)及時刷新。(7)顯著提高工作效率,減少人力、物力資源的投入。聊天室系統(tǒng)運(yùn)行穩(wěn)定、安全性高、性能可靠。3.2.2系統(tǒng)數(shù)據(jù)流圖.系統(tǒng)的頂級數(shù)據(jù)流圖如圖4所示。聊天室系統(tǒng)聊天室系統(tǒng)管理員管理員用戶用戶啟/停服務(wù)器發(fā)送信息用戶信息接收信息圖4:系統(tǒng)頂級數(shù)據(jù)流圖管理員的操作經(jīng)過聊天室系統(tǒng)將反饋給管理員自己和用戶。情況1:管理員啟動服務(wù)器,管理員界面將出現(xiàn)用戶連接信息和用戶的聊天信息,用戶在登錄后能夠進(jìn)入到聊天界面中。情況2:管理員停止服務(wù)器,管理員界面中所有的用戶信息都將不再刷新,而用戶所在聊天界面都將有服務(wù)器停止的提示。用戶的操作經(jīng)過聊天室系統(tǒng)將反饋給用戶(包括自己)和管理員。用戶的用戶名,聊天信息在管理員界面都能夠顯示出來。用戶的聊天信息能夠在自己和其它用戶的界面上顯示。登錄界面用戶名,密碼核對登錄界面用戶名,密碼核對管理員界面啟動/停止服務(wù)器查看在線用戶人數(shù)查看用戶聊天信息口令核對口令正確口令錯誤圖5:管理員界面2級數(shù)據(jù)流圖聊天室界面2級數(shù)據(jù)流圖:登錄界面登錄界面用戶名,密碼核對聊天室界面發(fā)送聊天信息接收聊天信息查看連接狀態(tài)口令錯誤口令核對口令正確圖6:聊天室界面2級數(shù)據(jù)流圖3.2.3系統(tǒng)數(shù)據(jù)分析在仔細(xì)調(diào)查聊天室過程的基礎(chǔ)上,總結(jié)出該系統(tǒng)需要滿足以下系統(tǒng)數(shù)據(jù)的需求:系統(tǒng)管理員資料。包括管理員用戶名和管理員密碼。用戶信息記錄用戶的資料。包括用戶的用戶名、登錄密碼、真實(shí)姓名、電話、傳真、所屬地區(qū)。聊天室系統(tǒng)總體E-R圖如圖7所示:客戶客戶管理員客戶管理聊天管理圖7聊天室系統(tǒng)總體E-R圖聊天室系統(tǒng)管理員屬性圖如圖8所示:管理員管理員管理員密碼管理員用戶名圖8:管理員屬性圖聊天室系統(tǒng)客戶個人資料屬性圖如圖9所示:客戶客戶用戶名傳真真實(shí)姓名電話密碼地區(qū)圖9:客戶個人資料屬性圖3.3系統(tǒng)可行性分析從技術(shù)發(fā)面來看,Java語言的優(yōu)點(diǎn)主要表現(xiàn)在:簡單、面向?qū)ο?、多線程、安全性等方面。

1.簡單性

Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭文件、預(yù)處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動強(qiáng)迫同型。Java實(shí)現(xiàn)了自動的垃圾收集,簡化了內(nèi)存管理的工作。這使程序設(shè)計更加簡便,同時減少了出錯的可能。

2.面向?qū)ο?/p>

Java提供了簡單的類機(jī)制和動態(tài)的構(gòu)架模型。對象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,經(jīng)過繼承和重載機(jī)制,子類能夠使用或重新定義父類或超類所提供的方法,從而既實(shí)現(xiàn)了代碼的復(fù)用,又提供了一種動態(tài)的解決方案。

Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計語言,它除了數(shù)組、布爾和字符三個基本數(shù)據(jù)類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創(chuàng)立新類就無法創(chuàng)立程序,Java程序在運(yùn)行時必須先創(chuàng)立一個類的實(shí)例,然后才能提交運(yùn)行。

Java同樣支持繼承特性,Java的類能夠從其它類中繼承行為,但Java只支持類的單重繼承,即每個類只能從一個類中繼承。

Java支持界面,界面允許程序員定義方法但又不立即實(shí)現(xiàn),一個類能夠?qū)崿F(xiàn)多個界面,利用界面能夠得到多重繼承的許多優(yōu)點(diǎn)而又沒有多重繼承的問題。

3.多線程

多線程使應(yīng)用程序能夠同時進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制中,不同的線程處理不同的任務(wù),她們之間互不干涉,不會由于一處等待影響其它部分,這樣容易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時交互操作。

Java程序能夠有多個執(zhí)行線程,如能夠讓一個線程進(jìn)行復(fù)雜的計算,而讓另一個線程與用戶進(jìn)行交互,這樣用戶能夠在不中斷計算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率[5]。4.安全性用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內(nèi)存的訪問都必須經(jīng)過對象的實(shí)例變量來實(shí)現(xiàn),這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產(chǎn)生的錯誤。 從開發(fā)環(huán)境來看,JBuilder5是一組全面高效率工具,使用Java編程語言創(chuàng)立可伸縮的,高性能的和具有不依賴于平臺性能的應(yīng)用程序。JBuilder5新增幾個新功能,并對已有的功能進(jìn)行了改造,包括一個單步產(chǎn)品安裝過程,以及自動卸載功能。其它功能還有:對JAVA的支持,WEB應(yīng)用開發(fā),EnterpriseJavaBeans(EJB),JMS和EAR向?qū)?團(tuán)隊(duì)開發(fā),編譯器的增強(qiáng)功能,工程屬性,配置JDK,部署,IDE的增強(qiáng)功能,語言的支持[1]。從自身能力來看,本人在大學(xué)三年級時對Java語言進(jìn)行過一個學(xué)期的系統(tǒng)學(xué)習(xí),對Java有一定的了解和掌握。雖然對Java的網(wǎng)絡(luò)編程不是很熟悉,可是經(jīng)過到圖書館查閱書籍和網(wǎng)上收集資料,現(xiàn)在對Java網(wǎng)絡(luò)編程有了一定的了解。第四章系統(tǒng)設(shè)計系統(tǒng)設(shè)計是本系統(tǒng)開發(fā)的重要階段,它直接影響到目標(biāo)系統(tǒng)的質(zhì)量,是整個開發(fā)工作的核心。系統(tǒng)設(shè)計階段的主要任務(wù)是:在系統(tǒng)分析提出的邏輯模型的基礎(chǔ)上,科學(xué)合理地進(jìn)行物理模型設(shè)計。系統(tǒng)設(shè)計分為:總體設(shè)計和詳細(xì)設(shè)計。總體設(shè)計包括子系統(tǒng)的劃分和模塊設(shè)計,詳細(xì)設(shè)計包括各模塊的詳細(xì)描述、輸入輸出設(shè)計等。系統(tǒng)設(shè)計遵循的原則是:系統(tǒng)性、適應(yīng)性、穩(wěn)健性、經(jīng)濟(jì)性。4.1系統(tǒng)總體結(jié)構(gòu)設(shè)計本系統(tǒng)是用Java語言基于C/S開發(fā)設(shè)計的,其核心的Socket技術(shù)決定了該系統(tǒng)的安全性和穩(wěn)定性,從而保證了本系統(tǒng)有較強(qiáng)的使用性。其最重要的功能就是實(shí)現(xiàn)了聊天信息的快速性,改變了傳統(tǒng)的面對面聊天信息不確定因素多,安全性低的狀況。聊天室設(shè)計圖如圖10所示。服務(wù)器服務(wù)器客戶代理客戶端線程用戶名用戶Socket圖10:聊天室設(shè)計圖服務(wù)器使用多線程,每個線程對應(yīng)一個客戶端,但線程經(jīng)過客戶代理同客戶端交流,在客戶代理中有兩個重要信息:一個是用戶名,一個是用戶名對應(yīng)的Socket??蛻粝蚍?wù)器請求連接后,客戶代理的Socket字段便被實(shí)例化,當(dāng)用戶登錄后,客戶代理的用戶名字段被實(shí)例化,一個完整的客戶代理生成了。對客戶端來說用戶名是可見的,客戶端提供對用戶名的操作。對服務(wù)器端來說,Socket是可見的,服務(wù)器經(jīng)過用戶名操作Socket,進(jìn)而回應(yīng)客戶端的請求?;贑/S的Java聊天室系統(tǒng)的作用是提供給人們一個平臺進(jìn)行相互交流,在交流的過程中可能出現(xiàn)的情況也是不同的。因此,可將系統(tǒng)分成兩大模塊:服務(wù)器端模塊和客戶端模塊。系統(tǒng)功能模塊圖如圖11所示:基于JAVA實(shí)現(xiàn)聊天室基于JAVA實(shí)現(xiàn)聊天室服務(wù)器端客戶端管理員登錄服務(wù)器管理用戶登錄聊天室啟動,停止服務(wù)器當(dāng)前連接人數(shù)用戶聊天信息連接服務(wù)器接收信息認(rèn)證用戶連接狀態(tài)顯示信息發(fā)送信息圖11:系統(tǒng)功能模塊圖1.服務(wù)器端模塊介紹:該模塊分為管理員登錄和服務(wù)器管理兩個子模塊。首先,管理員登錄是指管理員經(jīng)過輸入用戶名和密碼進(jìn)入到管理員界面,即系統(tǒng)的服務(wù)器端。而服務(wù)器管理是指管理員進(jìn)入到服務(wù)器端界面后,對系統(tǒng)的服務(wù)器端所做的一些操作,如啟動、停止服務(wù)器,查看當(dāng)前用戶連接人數(shù),和用戶的聊天信息。2、客戶端模塊介紹:該模塊分為用戶登錄和聊天室兩個子模塊。首先,用戶登錄是指用戶經(jīng)過輸入用戶名和密碼進(jìn)入到聊天室中,而且聊天室自動連接上服務(wù)器。聊天室模塊是指系統(tǒng)聊天室所具有的基本功能,如發(fā)送、接收信息,查看當(dāng)前和服務(wù)器連接狀態(tài),顯示發(fā)送和接收的信息。4.2數(shù)據(jù)庫設(shè)計本次數(shù)據(jù)庫開發(fā)工具為MicrosoftSQLServer,具體設(shè)計的表單如下:表1:用戶信息表字段名類型大小允許空備注usernamenvarchar20否用戶名passwordnvarchar20否密碼Truenamenvarchar10是真實(shí)姓名countrynvarchar16是所屬地區(qū)favnvarchar20是傳真telnvarchar20是電話表2:管理員信息表字段名類型大小允許空備注usernamenvarchar20否用戶名passwordnvarchar20否密碼4.3系統(tǒng)功能模塊詳細(xì)設(shè)計管理員登錄模塊流程圖如圖12所示:開始開始輸入用戶名與密碼查詢數(shù)據(jù)庫是否有這條記錄?進(jìn)入管理員界面提示用戶名或密碼錯誤結(jié)束圖12:管理員登錄模塊流程圖下面對管理員登錄程序流程圖做簡要敘述。首先,管理員在登錄界面中輸入管理員用戶名和密碼,并向系統(tǒng)發(fā)送。系統(tǒng)在收到發(fā)送信息后查詢數(shù)據(jù)庫,如果在數(shù)據(jù)庫中存有相同的信息,則運(yùn)行管理員界面。如果在數(shù)據(jù)庫中沒有相同信息,則系統(tǒng)提示錯誤,并返回登錄界面。服務(wù)器管理模塊流程圖如圖13所示:管理員管理員身份驗(yàn)證管理員界面關(guān)閉服務(wù)器啟動服務(wù)器查看在線用戶人數(shù)開始結(jié)束提示用戶名或密碼錯誤正確錯誤查看聊天信息圖13:服務(wù)器管理模塊流程圖下面對服務(wù)器管理程序流程圖做簡要敘述。首先,管理員經(jīng)過登錄界面進(jìn)入到管理員界面中。在此界面中能夠?qū)崿F(xiàn)對系統(tǒng)服務(wù)器的啟動和關(guān)閉,查看在線用戶人數(shù)和用戶的聊天信息。用戶登錄模塊流程圖如圖14所示:開始開始輸入用戶名與密碼查詢數(shù)據(jù)庫是否有這條記錄?進(jìn)入聊天室界面提示用戶名或密碼錯誤結(jié)束服務(wù)器端顯示圖14:用戶登錄模塊流程圖圖14:用戶登錄模塊流程圖用戶開始用戶開始結(jié)束身份驗(yàn)證聊天室查看連接狀態(tài)接收信息發(fā)送信息提示用戶名或密碼錯誤正確錯誤查看聊天信息圖15:聊天室模塊流程圖有啟動,則用戶能夠進(jìn)入到聊天室,可是使用不了聊天室。聊天室模塊流程圖如圖15所示。能夠?qū)α奶焓页绦蛄鞒虉D做這樣的簡要敘述:用戶在登錄界面中輸入用戶名和密碼進(jìn)入到聊天室中。在此界面中用戶能夠?qū)崿F(xiàn)向其它用戶發(fā)送信息,接收其它用戶發(fā)送的信息,查看當(dāng)前和服務(wù)器的連接狀態(tài)。第五章編碼與實(shí)現(xiàn)5.1系統(tǒng)主要模塊代碼5.1.1啟動、停止服務(wù)器classServerchatextendsThread{ publicServerchat(){ try{intPort=Integer.parseInt(textPort);InetAddresshost=InetAddress.getLocalHost();localhost.setText(host.getHostName()+""+host.getHostAddress()); ss=newServerSocket(intPort); ssLive=ss.isBound();display("服務(wù)器已啟動!"); } catch(Exceptione){ display("服務(wù)器已關(guān)閉!"); } this.start(); } publicvoidrun(){ while(true){ try{ clientSk=ss.accept(); if(clientSk!=null){ display(clientSk+"joinin");} } catch(IOExceptione){display("無法監(jiān)聽!");} inti=0; do{ Connectc=newConnect(clientSk); clients.addElement(c); if(checkName(c)){ activeConnects++; } else{ toClient.println("TAKEN"); disconnect(c); } i++; break; } while(i<clients.size()); } } }5.1.2客戶端連接服務(wù)器classClientchatextendsThread{ publicClientchat(){ try{loginName=name.getText(); intPort=Integer.parseInt(port.getText()); ipAdd=newString(ip.getText()); sk=newSocket(ipAdd,intPort); fromServer=newBufferedReader(newInputStreamReader(sk.getInputStream())); toServer=newPrintStream(sk.getOutputStream()); StringBufferinfo=newStringBuffer("INFO:"); StringuserInfo=loginName+":"; toServer.println(info.append(userInfo)); toServer.flush(); address=sk.getInetAddress(); skLive=sk.isConnected(); display("connectsuccessfully!"++address.getLocalHost());} catch(Exceptione){ display("connectfailed!");} this.start(); }5.1.3聊天室發(fā)送信息button2.addActionListener(newJava.awt.event.ActionListener(){publicvoidactionPerformed(ActionEvente){button2_actionPerformed(e);}});textField2.addKeyListener(newtextField2_KeyAdapter(this));panel2.add(label1);panel2.add(textField2);panel2.add(button2);當(dāng)客戶在發(fā)送信息文本框中寫好信息后,能夠有兩種發(fā)送方式,一種方法是點(diǎn)擊發(fā)送按鈕,另一種方法在鍵盤上敲擊”ENTER”。5.1.4服務(wù)器轉(zhuǎn)發(fā)信息publicvoidrun(){try{while(true){for(inti=0;i<chatClients.size();i++){comThread1=(CommunicateThread)chatClients.get(i);msgStack=comTrStack;ClientName=(String)ClientMsg.get(i);for(intj=0;j<msgStack.size();j++){string=(String)msgStack.get(j);broadcastInfor=ClientName+"->"+string;broadcast(broadcastInfor);}msgStack.removeAllElements();}try{Thread.sleep(100);}catch(InterruptedExceptionex){}}}catch(Exceptione){}}}首先,服務(wù)器端得到每個連接上的客戶端信息棧,讀取每個連接線程信息棧并把信息發(fā)送出去。最后清除已發(fā)送的信息。5.1.5服務(wù)器顯示在線用戶人數(shù)publicvoidnotifyRoom(){StringBufferpeople=newStringBuffer("PEOPLE"); list.removeAll(); Stringconstr=”當(dāng)前在線人數(shù)為+activeConnects”; connectTxt.setText(constr); for(inti=0;i<clients.size();i++){ Connectc=(Connect)clients.elementAt(i); list.add(); } sendClients(people);}5.2系統(tǒng)測試首先,管理員在登錄界面中輸入用戶名和密碼進(jìn)入到服務(wù)器端。圖16:管理員登錄界面進(jìn)入到服務(wù)器端后啟動服務(wù)器。這時,系統(tǒng)能夠顯示出登錄的用戶人數(shù)和用戶的聊天信息。圖17:系統(tǒng)服務(wù)器端用戶能夠經(jīng)過登錄界面進(jìn)入到聊天室,即系統(tǒng)的客戶端。圖5-3為user2所在的客戶端。圖18:系統(tǒng)客戶端若在運(yùn)行過程中有用戶退出客戶端,則服務(wù)器端會有該用戶已退出的提示,而且當(dāng)前在線人數(shù)會自動減1,在此為user2退出。圖19:有用戶退出時的服務(wù)器端若在運(yùn)行中服務(wù)器被停止,則服務(wù)器端會提示服務(wù)器已停止,而且當(dāng)前在線人數(shù)變?yōu)?,客戶端在連接狀態(tài)欄中會有連接失敗的提示,收發(fā)信息將會不成功。

圖20:服務(wù)器被停止圖21:服務(wù)器停止后的客戶端結(jié)束語本課題是利用Java,基于C/S開發(fā)的網(wǎng)上聊天室。在分析、研究聊天室技術(shù)的基礎(chǔ)上,對系統(tǒng)的組織結(jié)構(gòu)、數(shù)據(jù)流程、用戶需求等內(nèi)容進(jìn)行了詳細(xì)的調(diào)查和分析。本課題的完成,綜合運(yùn)用了大學(xué)的專業(yè)課知識,特別是軟件工程、Java等與系統(tǒng)設(shè)計有緊密聯(lián)系的知識,并加強(qiáng)了對實(shí)際問題的分析和解決能力,做到理論聯(lián)系實(shí)際。課題中,完成了對用戶和系統(tǒng)流程的需求分析的調(diào)查,系統(tǒng)的分析和設(shè)計,增強(qiáng)了Java網(wǎng)絡(luò)編程的實(shí)際鍛煉。在本次的系統(tǒng)設(shè)計中,出現(xiàn)了有很多不足和需要改進(jìn)的地方,這在以后的設(shè)計中都需要重點(diǎn)注意并加以改進(jìn),如:對代碼某些功能和屬性認(rèn)識不清楚,在代碼編寫過程中,經(jīng)常會出現(xiàn)因?yàn)橛缅e代碼,而使系統(tǒng)產(chǎn)生錯誤。因?yàn)閷avaSocket技術(shù)掌握的不夠充分,在系統(tǒng)設(shè)計中,有些功能未能實(shí)現(xiàn),如實(shí)現(xiàn)用戶列表等。這些在聊天室中都是必須具有的功能。在界面設(shè)計中,也存在界面設(shè)計不夠完美,不夠人性化,功能不夠詳盡等問題。經(jīng)過本次的畢業(yè)設(shè)計,使我對一個應(yīng)用系統(tǒng)的開發(fā)有了進(jìn)一步的了解,對軟件開發(fā)的過程也有了較深的認(rèn)識。經(jīng)過三個月的設(shè)計和開發(fā),基于C/S的Java聊天室系統(tǒng)基本開發(fā)完畢。其功能基本符合系統(tǒng)開發(fā)前所撰寫的用戶需求分析的要求,能夠初步完成基于C/S的Java聊天室的相關(guān)功能。由于設(shè)計時間較短,系統(tǒng)開發(fā)經(jīng)驗(yàn)不足,因此該系統(tǒng)還有許多不盡如人意的地方。可是,這次畢業(yè)設(shè)計的完成,使我鞏固和加深了專業(yè)知識并積累了一次軟件開發(fā)的寶貴經(jīng)驗(yàn),這對我以后的工作和學(xué)習(xí)都有很大的實(shí)際意義的幫助。參考文獻(xiàn)[1]飛思科技產(chǎn)品研發(fā)中心.JavaTCP/IP應(yīng)用開發(fā)詳解[M].北京:電子工業(yè)出版社,[2]飛思科技產(chǎn)品研發(fā)中心.JBuilder5應(yīng)用開發(fā)詳解[M].北京:電子工業(yè)出版社,[3]王選.軟件設(shè)計方法[M].北京:清華大學(xué)出版社,1992[4]朱三元,錢樂秋,宿為名.軟件工程技術(shù)概論[M].北京:科學(xué)出版社,[5]周之英.現(xiàn)代軟件工程[M].北京:科學(xué)出版社,1992[6]郎波.Java語言程序設(shè)計[M].北京:清華大學(xué)出版社,[7]耿祥義,張躍平.Java2實(shí)用教程[M].北京:清華大學(xué)出版社,[8]徐家福,呂建.軟件語言及其實(shí)現(xiàn)[M].北京:科學(xué)出版社,[9]尉哲明,李慧哲等.Java技術(shù)教程[M].北京:清華大學(xué)出版社,[10]教育部考試中心.計算機(jī)等級考試教材-Java語言程序設(shè)計[M].北京:高等教育出版社,[11]DouglasKramer,TheJavaPlatform-AWhitePaper[J].SilicmValley:SunMarosystemPress,1996,02(9):5-6[12]HarveyM.Deitel,PaulJ.Deitel.Java.程序設(shè)計教程(原書第3版)[M].北京:機(jī)械工業(yè)出版社,[13]JamesGosling,BillJoy,etc.TheWhile-Acceptloop(Serverside)[J].Valley:SunMicrosystemPress,,18(3):16-17[14]PatrickChan,RosannaLee,DouglasKramer,Java2類庫(增補(bǔ)版)[M].北京:機(jī)械工業(yè)出版社,[15]SunMicrosystems,inc.JavaProgrammingLanguage.Silicm[J]Valley:StudentGuide,,04(7):12-14致謝首先感謝我的導(dǎo)師***老師對我的悉心幫助和關(guān)懷。從論文的選題到定稿,她都進(jìn)行了全面、具體、精心的指導(dǎo),并為我提供了良好的條件。這次畢業(yè)設(shè)計能夠按時、按要求完成,與吳老師的指導(dǎo)與幫助分不開。在與吳老師交流的三個月里,我不但學(xué)到了專業(yè)知識,更重要的是學(xué)到了嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度、認(rèn)真的工作作風(fēng)和不斷進(jìn)取的精神。她淵博的學(xué)識、縝密的邏輯、敏銳的思維、高尚的師德讓我肅然起敬,這些優(yōu)秀的品質(zhì)將在以后的生活中一直伴隨和激勵著我。其次,我要感謝大學(xué)四年來向我授過課的老師,她們讓我學(xué)到了很多寶貴的知識。同時,還要感謝我的同學(xué)和朋友,在我畢業(yè)設(shè)計的過程中,她們給了我很多無私的幫助和支持,使我得到了許多有益的啟發(fā)。最后,我要再次向指導(dǎo)老師吳其林老師、學(xué)校的老師和親愛的同學(xué)表示深深的謝意!作者:***5月10號附錄附錄A源程序主要代碼importJava.awt.*;importJava.awt.event.*;importJava.io.*;importJ.*;publicclassChatRoomServerextendsFrameimplementsRunnable{Panelpanel;ScrollPanesPanel;TextAreatextArea;Buttonbutton1;//netServerSocketServerSock;publicfinalstaticintDEFAULT_PORT=6666;//默認(rèn)端口號ThreadchatAcceptThread;//啟動接受連接的線程BroadcastThreadbroadcastThread;//廣播thread;runwhenServerislisteningJava.util.VectorClients;//記錄連接的線程Java.util.VectorClientsInfor;//記錄連接線程的信息publicstaticintindex=0;publicChatRoomServer(){try{jbInit();}catch(Exceptione){e.printStackTrace();}ServerListen();//服務(wù)器開始監(jiān)聽}privatevoidjbInit(){//初始化界面panel=newPanel();sPanel=newScrollPane();textArea=newTextArea("Serverinformation:\n");button1=newButton("退出");sPanel.add(textArea);button1.addActionListener(newJava.awt.event.ActionListener(){//退出按鈕注冊publicvoidactionPerformed(ActionEvente){button1_actionPerformed(e);}});panel.add(button1);this.addWindowListener(newChatFrame_WindowAdapter(this));//注冊到繼承了窗口適配器的類this.setSize(600,600);this.setLayout(newBorderLayout());this.add(sPanel,BorderLayout.CENTER);this.add(panel,BorderLayout.SOUTH);this.show();}privatevoidbutton1_actionPerformed(ActionEvente){exit();}publicvoidprocessMsg(Stringstr){//textArea.append(str);}privatevoidServerListen(){try{ServerSock=newServerSocket(DEFAULT_PORT);}catch(IOExceptione){processMsg(e.toString());processMsg("Serverfailed!\n");}processMsg("Serverlisteningonport:"+DEFAULT_PORT);Clients=newJava.util.Vector();ClientsInfor=newJava.util.Vector();chatAcceptThread=newThread(this);//啟動接受連接的線程chatAcceptThread.start();broadcastThread=newBroadcastThread(this);//廣播線程broadcastThread.start();//還有一個回收無用連接thread的線程}publicvoidrun(){//接受連接并記錄線程信息inti=0;try{while(true){SocketClientSock=ServerSock.accept();CommunicateThreadct=newCommunicateThread(ClientSock,this,index);//創(chuàng)立線程保持連接Clients.add(ct);//recordCommunicateThread;i++;index++;//version2ClientsInfor.add("Thread-"+i);processMsg("Thread-"+i+"joinin\n");}}catch(IOExceptione){processMsg(e.toString());}}publicvoidexit(){broadcastThread.broadcast("Serverexit!");try{ServerSock.close();}catch(IOExceptionioe){}finally{System.exit(0);}}publicstaticvoidmain(String[]args){ChatRoomServerchat=newChatRoomServer();}}classCommunicateThreadextendsThread{//保持連接線程protectedSocketClientSock;protectedBufferedReaderin=null;protectedPrintWriterout;ChatRoomServerchatFrame;booleanisTrue=true;//run()Java.util.VectorinforStack;intindex2;//publicCommunicateThread(SocketSock,ChatRoomServercFrame,intindex){ClientSock=Sock;chatFrame=cFrame;index2=index;inforStack=newJava.util.Vector();try{in=newBufferedReader(newInputStreamReader(ClientSock.getInputStream()));out=newPrintWriter(ClientSock.getOutputStream());}catch(IOExceptionei){try{ClientSock.close();}catch(IOExceptionei2){}chatFcessMsg(ei.toString());return;}this.start();}publicvoidrun(){Stringinfor;try{while(isTrue){infor=in.readLine();if(infor.equals("Clientexit!")){writeInformation(infor);//把信息寫到信息棧,以倍廣播出去stopRun();}elseif(infor!=null){writeInformation(infor);}//elsebreak;try{Thread.sleep(100);//version2}catch(InterruptedExceptionex){}}}catch(IOExceptione){;}finally{try{in.close();out.close();ClientSock.close();chatFrame.Clients.remove(index2);//在Clients中清除本線程序ChatRoomServer.index--;//}catch(IOExceptionei){;}}}publicvoidwriteInformation(Stringinfor){//寫信息棧inforStack.add(infor);}privatevoidstopRun(){//終止線程isTrue=false;}publicvoidsendInformation(Stringstr){//發(fā)送信息try{out.println(str);out.flush();}catch(Exceptione){;}}}classBroadcastThreadextendsThread{//廣播線程ChatRoomServerchatFrame2;Java.util.VectorchatClients;//連接線程信息Java.util.VectormsgStack;//信息棧Java.util.VectorClientMsg;//記錄客戶發(fā)送的信息CommunicateThreadcomThread1;CommunicateThreadcomThread2;Stringstring;//informationininforStackStringClientName;//ClientthreadnameStringbroadcastInfor;//broadcastinformation=ClientName+string;publicBroadcastThread(ChatRoomServercFrame){chatFrame2=cFrame;chatClients=chatFrame2.Clients;ClientMsg=chatFrame2.ClientsInfor;//this.start();}publicvoidbroadcast(Stringstr){//廣播for(intk=0;k<chatClients.size();k++){//sendtoeveryone分別調(diào)用每個連接線程,發(fā)送信息comThread2=(CommunicateThread)chatClients.get(k);comThread2.sendInformation(str);}}publicvoidrun(){try{while(true){for(inti=0;i<chatClients.size();i++){comThread1=(CommunicateThread)chatClients.get(i);msgStack=comTrStack;//得到每個連接的信息棧ClientName=(String)ClientMsg.get(i);//客戶名//讀取每個連接線程的信息棧并把信息發(fā)送出去for(intj=0;j<msgStack.size();j++){string=(String)msgStack.get(j);broadcastInfor=ClientName+"->"+string;broadcast(broadcastInfor);}//cleartheinforStackmsgStack.removeAllElements();//清除以發(fā)送的信息}try{Thread.sleep(100);//version2}catch(InterruptedExceptionex){}}}catch(Exceptione){}}}//處理窗口關(guān)閉事件的適配器classChatFrame_WindowAdapterextendsJava.awt.event.WindowAdapter{ChatRoomServerchatFrame;publicChatFrame_WindowAdapter(ChatRoomServerchatFrame){this.chatFrame=chatFrame;}publicvoidwindowClosing(WindowEvente){//exitprogramchatFrame.exit();//referencetothemethodexit()inChatRoomServer.}}importJava.awt.*;importJava.awt.event.*;importJava.io.*;importJ.*;publicclassChatRoomClientextendsFrameimplementsRunnable{Panelpanel1,panel2;Buttonbutton1,button2;TextFieldtextField1,textField2;Labellabel1;TextAreatextArea;ScrollPanesPanel;//netPrintWriterout;BufferedReaderin=null;Socketsock;publicfinalstaticintDEFAULT_PORT=6666;//createThreadtoReadinformationfromServerThreadreadThread;booleanisTrue=true;//threadcangoonruning??publicChatRoomClient(){try{jbInit();}catch(Exceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args){//mainmethodChatRoomClientc=newChatRoomClient();c.show();}privatevoidjbInit(){//shouldsetsize,positionandFontofeverycomponentbutton1=newButton("連接");//setFontbutton2=newButton("發(fā)送");textField1=newTextField("inputServeraddresshere!");textField2=newTextField("inputMessagehereandsendtoServer");label1=newLabel("消息:");panel1=newPanel();panel2=newPanel();sPanel=newScrollPane();textArea=newTextArea();//panel1//pressbutton1:連接toconnecttheClienttoServerbutton1.addActionListener(newJava.awt.event.ActionListener(){publicvoidactionPerformed(ActionEvente){button1_actionPerformed(e);}});//textField1:forinputtheaddressofServer;beregisteredtoKeyListener.//presskey:EntertoconnecttheClienttoServertextField1.addKeyListener(newtextField1_KeyAdapter(this));//Java.awt.event.KeyAdapter()panel1.add(button1);panel1.add(textField1);//sPanelScrollPanesPanel.add(textArea);//panel2//pressbutton2:發(fā)送tosendmessagebutton2.addActionListener(newJava.awt.event.ActionListener(){publicvoidactionPerformed(ActionEvente){button2_actionPerformed(e);}});//textField2:forinputmessage;beregisteredtoKeyListener.//presskey:EntertosendmessagetextField2.addKeyListener(newtextField2_KeyAdapter(this));panel2.add(label1);panel2.add(textField2);panel2.add(button2);//framethis.addWindowListener(newChatFrame_WindowAdapter(this));//frameisregisteredtoWindowListener

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論