網(wǎng)絡(luò)課程設(shè)計---簡單聊天系統(tǒng)的設(shè)計與實現(xiàn)_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  簡單聊天程序的設(shè)計與實現(xiàn) </p><p><b>  摘 要</b></p><p>  本課程設(shè)計主要是設(shè)計并實現(xiàn)一個簡單的聊天程序,該聊天程序能夠支持多人聊天,聊天的內(nèi)容可以僅僅支持文本信息,聊天程序包括服務(wù)器程序和客戶端程序。在課程設(shè)計中系統(tǒng)的開發(fā)平臺為Eclipse程序運行平臺為Windows XP。</p><

2、;p>  關(guān)鍵詞:聊天程序;服務(wù)器;客戶端;Eclipse</p><p><b>  1 引 言</b></p><p>  本課程設(shè)計主要是簡單聊天程序的設(shè)計,使用MSN或QQ,分析聊天程序的功能需求及工作原理。該聊天程序能夠支持多人聊天,聊天的內(nèi)容可以僅僅支持文本信息,聊天程序包括服務(wù)器程序和客戶端程序。</p><p>  1.

3、1 課程設(shè)計目的</p><p>  該課程設(shè)計的目的主要是通過對簡單聊天程序的設(shè)計及QQ原理的分析,了解聊天程序的功能需求及工作原理;熟悉TCP/IP協(xié)議以及套節(jié)字編程原理;熟悉Eclipse編程環(huán)境及Socket/ServerSocket編程方法。</p><p>  1.2 課程設(shè)計要求</p><p> ?。?)按要求編寫課程設(shè)計報告書,能正確闡述設(shè)計結(jié)果。

4、</p><p>  (2)通過課程設(shè)計培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)和團(tuán)隊協(xié)作精神。</p><p> ?。?)學(xué)會文獻(xiàn)檢索的基本方法和綜合運用文獻(xiàn)的能力。</p><p> ?。?)在老師的指導(dǎo)下,要求每個學(xué)生獨立完成課程設(shè)計的全部內(nèi)容。</p><p>  1.3 課程設(shè)計平臺</p><p>  課程設(shè)

5、計中系統(tǒng)的開發(fā)平臺為Eclipse,程序運行平臺為Windows XP。</p><p>  2 需 求 分 析</p><p><b>  2.1功能需求分析</b></p><p>  (1)用戶端之間的信息發(fā)送,本程序需要實現(xiàn)的最基本的功能。用戶在界面上可以將自己需要發(fā)送的信息填入相應(yīng)的對話框中,點擊發(fā)送按鈕后,可以將信息正常的發(fā)送給相

6、應(yīng)的其它用戶,這個過程中的客戶端與客戶端之間使用點對點發(fā)送信息,預(yù)計利用TCP/IP協(xié)議中的UDP協(xié)議,在本程序中共需要3個端口,此功能預(yù)計使用3號端口。</p><p> ?。?)在線用戶主機(jī)IP列表的維護(hù)。在用戶發(fā)送信息之前,需要選擇相應(yīng)的目的地端IP,這也就需要客戶端擁有在線用戶主機(jī)的IP地址,這個在線主機(jī)列表的維護(hù)是需要客戶端定時自動向服務(wù)器端發(fā)送信息,服務(wù)器端收集并維護(hù)在線用戶列表,再發(fā)送回客戶端。需要

7、在客戶端和服務(wù)器端都使用定時器來完成此功能。此功能預(yù)計使用1、2號端口。</p><p>  (3)在C/S模式中,服務(wù)器與客戶端是相互依賴的。在客戶端啟用以后,需要查看服務(wù)器端是否在線,服務(wù)器在線才能正常使用客戶端,如果服務(wù)器不在線,則在檢測一定次數(shù)以后自動退出客戶端程序。在使用過程中,客戶端在指定時間內(nèi)未向服務(wù)器端發(fā)送信息的,服務(wù)器認(rèn)為客戶端下線;客戶端在一定時間內(nèi)未收到服務(wù)器端信息的,認(rèn)為服務(wù)器已經(jīng)下線,則

8、提示用戶并建議退出,在用戶一定時間后沒有退出的則自動關(guān)閉客戶端程序[1]。</p><p><b>  2.2數(shù)據(jù)需求分析</b></p><p> ?。?)客戶端之間聊天信息。在控件上顯示時格式化,更易于用戶的查看自己發(fā)送或接收到的信息。</p><p>  (2)在線用戶聊天信息。服務(wù)器端存放在適當(dāng)?shù)目臻g中,在發(fā)送給客戶端時,對信息列表進(jìn)行

9、格式化,便于客戶端提取信息。</p><p> ?。?)客戶端向服務(wù)器端發(fā)送的確認(rèn)在線信息。包括客戶端剛剛啟動時的初始化信息和在使用過程中的確認(rèn)在線信息。</p><p>  (4)其它程序內(nèi)部可能需要設(shè)計的數(shù)據(jù)結(jié)構(gòu)體。</p><p><b>  2.3性能需求分析</b></p><p>  (1)可靠性高,能在由于

10、系統(tǒng)問題或其它原因產(chǎn)生錯誤后,作出相對應(yīng)處理,比如網(wǎng)絡(luò)初始化失敗、服務(wù)器不在線等,可以提示用戶安全退出本程序,在出現(xiàn)不可知的錯誤以后,可以盡量安全的退出程序。在程序的設(shè)計過程中,要求能盡可能多的設(shè)想到用戶使用過程中可能發(fā)生的事件,并能在判斷事件后做出相應(yīng)的處理,使程序具有較高的容錯性能[2]。(2)宜操作性,程序簡單易懂,容易上手使用。設(shè)計界面是,簡化界面的復(fù)雜性,模擬QQ等現(xiàn)有即時通訊工具的界面,使用戶能很容易看懂并使用。</p

11、><p>  (3)開發(fā)文檔易理解,保證以后自己二次開發(fā)或他人接手開發(fā)時,能夠清晰的理解整個系統(tǒng)的設(shè)計思路和實現(xiàn)細(xì)節(jié)。</p><p>  (4)模塊化設(shè)計此軟件的功能,不同的模塊實現(xiàn)不同的功能,使得軟件易于以后的維護(hù)與擴(kuò)展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應(yīng)用。</p><p><b>  2.4運行需求分析</b></

12、p><p><b> ?。?)用戶界面</b></p><p>  程序較小,啟動速度快??稍诰W(wǎng)絡(luò)中使用,有注冊功能,需進(jìn)行用戶登錄。啟動后的應(yīng)用界面要清爽,設(shè)計要簡單明了,要具有較高的易用性。</p><p><b> ?。?)故障處理</b></p><p>  在遇到可預(yù)知的故障與情況時,能提示用

13、戶并自動退出;在遇到不可預(yù)知的故障時能安全退出。</p><p>  3 設(shè) 計 原 理</p><p>  3.1 聊天程序的工作原理</p><p>  QQ聊天程序采用的是C/S通信模式,即客戶/服務(wù)模式,它把一個應(yīng)用劃分成功能不同的兩個部分,分別在不同的計算機(jī)上運行,其中一個為服務(wù)端程序,用來響應(yīng)和提供固定的服務(wù),一個為客戶端程序,用來向服務(wù)端提出請求和要

14、求某種服務(wù)。在數(shù)量關(guān)系上,通常有一對一的(即一個服務(wù)端程序和一個客戶端程序之間通信),也有一對多的(即一個服務(wù)端程序和多個客戶端程序之間通信),也有多對多的(即多個服務(wù)端程序和多個客戶端程序之間通信)。所謂服務(wù)端程序、客戶端程序也是相對的概念,有時在一個程序中既有服務(wù)端又有客戶端的功能。QQ聊天程序分成了兩個程序,一個安裝在騰訊公司的服務(wù)器上,我們稱之為服務(wù)端程序,一個安裝在QQ用戶的計算機(jī)上,我們稱之為客戶端程序。在許多介紹網(wǎng)絡(luò)通信編

15、程的書籍中有關(guān)網(wǎng)絡(luò)聊天的例子,當(dāng)一個客戶要與另一個客戶聊天時,第一個客戶先把聊天數(shù)據(jù)發(fā)送給服務(wù)器,然后服務(wù)器再把聊天數(shù)據(jù)轉(zhuǎn)發(fā)給第二個客戶,服務(wù)器好像一個中轉(zhuǎn)站,這在客戶數(shù)量比較少時,服務(wù)器還能承受,在客戶數(shù)量比較多時,服務(wù)器肯定要癱瘓。何況客戶之間還要傳送文件、語音聊天、視頻聊天等等,為了減少服務(wù)器的壓力,各客戶端之間需要直接通信。</p><p> ?。?)在服務(wù)端和客戶端之間(一對多)</p>

16、<p>  用于客戶端程序登錄,驗證用戶密碼,獲取其它在線好友信息等等。</p><p> ?。?)在客戶端和客戶端之間(多對多)</p><p>  用于在線好友間直接通信聊天。此時每個客戶端程序上既有實現(xiàn)服務(wù)端功能的部分,又有實現(xiàn)客戶端功能的部分,前者用于接收聊天數(shù)據(jù),后者用于發(fā)送聊天數(shù)據(jù)。</p><p>  在用C/S模式進(jìn)行通信時,作為客戶端在請

17、求與服務(wù)端連接時需要知道服務(wù)端的IP地址,騰訊公司的服務(wù)器具有固定的公網(wǎng)地址,這沒有問題。但是在客戶端和客戶端之間通信時,每個用戶的IP地址都是ISP所給的臨時地址,無法固定,那么某個用戶要與另一個用戶連接時,怎么知道對方的IP地址呢?當(dāng)一個用戶連接到Internet后,獲得了一個臨時的公網(wǎng)地址,當(dāng)?shù)卿浀絈Q時,QQ服務(wù)端會獲得該上線用戶的IP地址,然后告知其他要與該上線用戶聊天的用戶,其他用戶就可以連接該用戶與之直接通信了。</

18、p><p>  在Win32平臺上,對于眾多的基層網(wǎng)絡(luò)協(xié)議,Winsock是訪問它們的首選接口。如果想從頭開發(fā)一個網(wǎng)絡(luò)通信應(yīng)用程序,TCP/IP就是首選協(xié)議之一。為了保證可靠的數(shù)據(jù)傳輸,宜選擇TCP協(xié)議[3]。</p><p>  3.2 TCP/IP協(xié)議</p><p>  TCP/IP(Transmission Control Protocol/Internet P

19、rotocol)的簡寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個協(xié)議是Internet最基本的協(xié)議、Internet國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡單地說,就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。</p><p>  網(wǎng)際協(xié)議IP是TCP/IP的心臟,也是網(wǎng)絡(luò)層中最重要的協(xié)議。</p><p>  IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動程序)發(fā)來的數(shù)據(jù)包,并

20、把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因為IP并沒有做任何事情來確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。</p><p>  高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時,通常假設(shè)包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ),這

21、些服務(wù)相信數(shù)據(jù)包是從一個有效的主機(jī)發(fā)送來的。IP確認(rèn)包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對于一些TCP和UDP的服務(wù)來說,使用了該選項的IP包好像是從路徑上的最后一個系統(tǒng)傳遞過來的,而不是來自于它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統(tǒng)來進(jìn)行平常是被禁止的連接。那么,許多依靠IP源地址做確認(rèn)的服務(wù)將產(chǎn)生問題并且會被非法入侵[4]。</p&g

22、t;<p>  如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進(jìn)行錯誤檢查,同時實現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。</p><p>  TCP將它的信息送到更高層的應(yīng)用程序,例如Telnet的服務(wù)程序和客戶程序。應(yīng)用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,

23、設(shè)備驅(qū)動程序和物理介質(zhì),最后到接收方。</p><p>  面向連接的服務(wù)(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫),但使用UDP傳送有關(guān)單個主機(jī)的信息。</p><p>  3.3 套接字編程原理</p><p>  在TCP/IP網(wǎng)絡(luò)中兩個進(jìn)

24、程間的相互作用的主機(jī)模式是客戶機(jī)/服務(wù)器模式(Client/Server model)。該模式的建立基于以下兩點:1、非對等作用;2、通信完全是異步的。客戶機(jī)/服務(wù)器模式在操作過程中采取的是主動請示方式:</p><p>  首先服務(wù)器方要先啟動,并根據(jù)請示提供相應(yīng)服務(wù):(過程如下)</p><p>  (1)打開一通信通道并告知本地主機(jī),它愿意在某一個公認(rèn)地址上接收客戶請求。</p

25、><p> ?。?)等待客戶請求到達(dá)該端口。</p><p> ?。?)接收到重復(fù)服務(wù)請求,處理該請求并發(fā)送應(yīng)答信號。</p><p> ?。?)返回第二步,等待另一客戶請求</p><p><b> ?。?)關(guān)閉服務(wù)器。</b></p><p><b>  客戶方:</b>&l

26、t;/p><p>  (1)打開一通信通道,并連接到服務(wù)器所在主機(jī)的特定端口。</p><p> ?。?)向服務(wù)器發(fā)送服務(wù)請求報文,等待并接收應(yīng)答;繼續(xù)提出請求……</p><p> ?。?)請求結(jié)束后關(guān)閉通信通道并終止。</p><p>  所謂的客戶客戶端/服務(wù)器。是一種能夠在基于網(wǎng)絡(luò)環(huán)境的分布處理過程中,使用基于連接的網(wǎng)絡(luò)通信模型。該通信模

27、型首先在客戶機(jī)和服務(wù)器之間定義一套通信協(xié)議,并創(chuàng)建一個Socket類,利用這個類來建立一條可靠的鏈接;然后,客戶端/服務(wù)器再在這條連接上可靠地傳輸數(shù)據(jù)??蛻舳税l(fā)出請求,服務(wù)器發(fā)出請求,服務(wù)器監(jiān)聽來自客戶機(jī)的請求,并為客戶端提供相應(yīng)服務(wù)。</p><p>  利用Socket類,我們可以輕松地實現(xiàn)網(wǎng)路客戶端程序的編寫,Socket類的一些常用的方法匯總?cè)缦拢?lt;/p><p>  getLoc

28、alAddress()</p><p>  讀取套接字對象的本地地址。</p><p>  getLocalPort()</p><p>  讀取套接字所使用的本地端口號。</p><p>  getlnputStream()</p><p><b>  得到一個輸入流。</b></p>

29、;<p>  getOutputStream()</p><p><b>  得到一個輸出流。</b></p><p>  通常情況下,客戶端只要能夠順序地處理服務(wù)器程序的響應(yīng)就可以了,因此客戶端程序通常不用使用多線程。</p><p>  3.4 Eclipse開發(fā)環(huán)境</p><p>  Eclipse

30、最初是由IBM公司開發(fā)的替代商業(yè)軟件Visual Age for Java的下一代IDE開發(fā)環(huán)境,是著名的跨平臺的自由集成開發(fā)環(huán)境。最初主要用來Java語言開發(fā),但是目前亦有人通過插件使其作為其他計算機(jī)語言比如C++和Python的開發(fā)工具。</p><p>  Eclipse的本身只是一個框架平臺,但是眾多插件的支持使得Eclipse擁有其他功能相對固定的IDE軟件很難具有的靈活性。許多軟件開發(fā)商以Eclips

31、e為框架開發(fā)自己的IDE。</p><p>  Eclipse采用的技術(shù)是IBM公司開發(fā)的(SWT),這是一種基于Java的窗口組件,類似Java本身提供的AWT和Swing窗口組件;不過IBM聲稱SWT比其他Java窗口組件更有效率。Eclipse的用戶界面還使用了GUI中間層JFace,從而簡化了基于SWT的應(yīng)用程序的構(gòu)建。</p><p>  Eclipse的插件機(jī)制是輕型軟件組件化

32、架構(gòu)。在富客戶機(jī)平臺上,Eclipse使用插件來提供所有的附加功能,例如支持Java以外的其他語言。 已有的分離的插件已經(jīng)能夠支持C/C++(CDT)、Perl、Ruby,Python、telnet和數(shù)據(jù)庫開發(fā)。插件架構(gòu)能夠支持將任意的擴(kuò)展加入到現(xiàn)有環(huán)境中,例如配置管理,而決不僅僅限于支持各種編程語言。</p><p>  Eclipse的設(shè)計思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式

33、附加于Eclipse核心之上。Eclipse基本內(nèi)核包括:圖形API (SWT/Jface), Java開發(fā)環(huán)境插件(JDT),插件開發(fā)環(huán)境(PDE)等[5]。</p><p><b>  4 設(shè) 計 步 驟</b></p><p>  4.1 聊天室的總體設(shè)計</p><p>  聊天室的總體設(shè)計過程比較簡單主要是構(gòu)建設(shè)計框圖。,就是當(dāng)客戶端

34、發(fā)出信息時,我們將數(shù)據(jù)寫到socket,當(dāng)對方有數(shù)據(jù)到達(dá)時,我們從socket讀出來并顯示給客戶。程序關(guān)鍵在于如何監(jiān)聽到有信息到達(dá)的過程。應(yīng)用程序流程圖如下圖所示,開始是先創(chuàng)建主窗口,然后初始化窗口,程序下面才開始消息循環(huán)處理。如果沒有消息循環(huán)的活,直接結(jié)束掉這個程序。如果有循環(huán)的話,要判斷這個窗口消息的內(nèi)容是哪種類型,然后再進(jìn)行選擇處理方式。然后依據(jù)不同的內(nèi)容選擇“創(chuàng)建控件”,還是要“判斷命令”,或是分別處理各種socket的消息。流

35、程圖如圖4-1所示</p><p>  圖4-1聊天室設(shè)計架構(gòu)圖</p><p>  4.2 聊天室的模塊</p><p>  聊天室主要包括三個模塊,服務(wù)器模塊、客戶端模塊、信息處理模塊。該聊天室可以支持多人聊天,只支持文本信息。</p><p><b> ?。?)服務(wù)器模塊</b></p><p&

36、gt;  其所包含的函數(shù)模塊如下圖所示</p><p>  圖4-2 服務(wù)器模塊圖</p><p><b> ?。?)客戶端模塊</b></p><p>  客戶端所包含的函數(shù)模塊如下圖所示</p><p>  圖4-3 客戶端模塊圖</p><p><b>  (3)信息處理模塊<

37、;/b></p><p>  信息處理模塊包括注冊信息及登錄信息的處理模塊,其所包含的函數(shù)模塊如下圖所示</p><p>  圖4-4 信息處理模塊圖</p><p><b>  4.3 程序的調(diào)試</b></p><p>  聊天室的程序模塊如下圖所示</p><p>  圖4-5 聊天室

38、程序模塊圖</p><p>  程序運行后,用戶注冊界面如下圖所示</p><p>  圖4-6 用戶注冊界面</p><p>  用戶登錄界面如下圖所示</p><p>  圖4-7 用戶登錄界面</p><p>  進(jìn)入聊天室的聊天界面如下圖所示</p><p>  圖4-8 聊天室界面&l

39、t;/p><p>  可以進(jìn)行多人聊天,多人聊天如下圖所示</p><p><b>  圖4-9 多人聊天</b></p><p><b>  5 問 題 分 析</b></p><p>  首先是對QQ軟件的需求分析還有工作原理的熟悉,雖然平日用的已經(jīng)很熟練了,但原理方面的知識還是有點模糊,通過對資料

40、的學(xué)習(xí)及一些小程序的運行,聊天方面的原理才漸漸清晰。</p><p>  由于之前沒有學(xué)過Java,所以對Eclipse編程環(huán)境幾乎是一無所知,在程序編譯過程中遇到的問題比較多,主要是對那些錯誤還有警告開始都不知道什么意思,花了兩天的時間在程序的調(diào)試上面。另外就是一些概念性的知識欠缺,尤其是套接字編程原理,所以對程序的一些函數(shù)的功能用法有些模糊。</p><p>  其實遇到的種種問題主要

41、是兩方面的原因。一個是基礎(chǔ)知識的掌握不夠牢固,概念的混淆,不能夠很快的用最佳的方式去解決遇到的問題等等,都是由于知識的不熟練導(dǎo)致。另一個就是Java部分知識的缺乏,導(dǎo)入文件還有一些參數(shù)的選擇都要查詢一下資料,主要是第一次操作這方面的知識。針對這些問題,主要從兩個方面著手處理應(yīng)該,一方面是多對所學(xué)過的知識強(qiáng)化溫習(xí),做到熟能生巧,溫故知新。另一方面就是準(zhǔn)備的不夠充分,之前應(yīng)該及早的對所需軟件進(jìn)行熟悉,在以后的實習(xí)過程中需要注意。</p

42、><p><b>  6 總 結(jié)</b></p><p>  網(wǎng)絡(luò)的課程設(shè)計,之前沒有接觸過網(wǎng)絡(luò)編程的語言,所以感覺難度比較大,也因為如此,在找資料及向老師同學(xué)的請教中學(xué)到了很多的東西。</p><p>  這次的課程設(shè)計是簡單聊天程序,在平日的生活學(xué)習(xí)中,可以說QQ等即時通訊軟件已占據(jù)重要的位置,也深受大家的喜愛,所以這個課程設(shè)計很有現(xiàn)實意義,做

43、起來也比較感興趣。在具體做的過程中,參考了網(wǎng)絡(luò)班同學(xué)還有學(xué)長的一些程序,雖然這個聊天室的界面及功能比較簡單,但從代碼的編寫及結(jié)果的調(diào)試成功還是花了很多的心思。尤其是剛開始用Eclipse軟件的時候,從完全陌生到慢慢的了解,這其中的過程對應(yīng)用方面知識的提高有很大的幫助。</p><p>  課程設(shè)計項目的雖然要求是獨立完成,但還是很多問題的解決離不開老師的指導(dǎo)及同學(xué)之間的探討,這些在做項目的時候都是必不可少的。學(xué)校

44、提供了設(shè)計的機(jī)房還有老師的悉心指導(dǎo),這些跟課程設(shè)計的順利完成都是密不可分的,在這里感謝大家?guī)淼膸椭?lt;/p><p>  另外就是知識方面的問題,計算機(jī)網(wǎng)絡(luò)和Java Socket有很多方面的知識還是很不熟悉,具體用到的時候就感覺生疏,或者還是缺乏設(shè)計方面的實踐。課程設(shè)計的機(jī)會不是很多,由于所學(xué)的知識包含了太多的方面,所以實踐方面還是遠(yuǎn)遠(yuǎn)不夠,希望在學(xué)校期間能夠多一些類似的機(jī)會。</p><

45、p>  雖然課程設(shè)計順利的完成了,但由于水平有限,還是有很多的欠缺跟不足之處,希望老師給予指正。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1]謝希仁. 計算機(jī)網(wǎng)絡(luò). 北京:電子工業(yè)出版社,2009</p><p>  [2]Y.Daniel Liang. Java語言程序設(shè)計. 北京:機(jī)械工業(yè)出版社,200

46、8</p><p>  [3]賽奎春. JSP工程應(yīng)用與項目實踐. 北京:機(jī)械工業(yè)出版社,2005</p><p>  [4]Ian F.Darwin. Java經(jīng)典實例. 北京:中國電力出版社,1999</p><p>  [5]丁振凡. Java語言實用教程. 北京:北京郵電大學(xué)出版社,2005 附錄1:服務(wù)器程序清單</p><p&g

47、t;  // ChatService.java</p><p>  package lee;</p><p>  import java.util.*;</p><p>  import java.io.*;</p><p>  public class ChatService </p><p><b>  

48、{</b></p><p>  private static ChatService cs;</p><p>  private Properties userList;</p><p>  private LinkedList<String> chatMsg;</p><p>  private ChatServic

49、e()</p><p><b>  {</b></p><p><b>  }</b></p><p>  public static ChatService instance()</p><p><b>  {</b></p><p>  if (cs

50、 == null)</p><p><b>  {</b></p><p>  cs = new ChatService();</p><p><b>  }</b></p><p>  return cs;</p><p><b>  }</b><

51、;/p><p>  public boolean validLogin(String user , String pass) </p><p>  throws IOException</p><p><b>  {</b></p><p>  if (loadUser().getProperty(user) == null

52、)</p><p><b>  {</b></p><p>  return false;</p><p><b>  }</b></p><p>  if (loadUser().getProperty(user).equals(pass))</p><p><b&g

53、t;  {</b></p><p>  return true;</p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  public boolean addUser(St

54、ring name , String pass)</p><p>  throws Exception</p><p><b>  {</b></p><p>  if (userList == null)</p><p><b>  {</b></p><p>  user

55、List = loadUser();</p><p><b>  }</b></p><p>  if (userList.containsKey(name))</p><p><b>  {</b></p><p>  throw new Exception("用戶名已經(jīng)存在,請重新選擇

56、用戶名");</p><p><b>  }</b></p><p>  userList.setProperty(name , pass);</p><p>  saveUserList();</p><p>  return true;</p><p><b>  }<

57、;/b></p><p>  public String getMsg()</p><p><b>  {</b></p><p>  if (chatMsg == null)</p><p><b>  {</b></p><p>  chatMsg = new Li

58、nkedList<String>();</p><p>  return "";</p><p><b>  }</b></p><p>  String result = "";</p><p>  for (String tmp : chatMsg)</p&g

59、t;<p><b>  {</b></p><p>  result += tmp + "\n";</p><p><b>  }</b></p><p>  return result;</p><p><b>  }</b></p&g

60、t;<p>  public void addMsg(String user , String msg)</p><p><b>  {</b></p><p>  if (chatMsg == null)</p><p><b>  {</b></p><p>  chatMsg =

61、 new LinkedList<String>();</p><p><b>  }</b></p><p>  if (chatMsg.size() > 40)</p><p><b>  {</b></p><p>  chatMsg.removeFirst();</p&

62、gt;<p><b>  }</b></p><p>  chatMsg .add(user + "說:" + msg);</p><p><b>  }</b></p><p>  /////////////////////////////////////////////////////

63、/////////</p><p>  // 下面是系統(tǒng)的工具方法</p><p>  /////////////////////////////////////////////////////////////</p><p>  private Properties loadUser()throws IOException</p>&l

64、t;p><b>  {</b></p><p>  if (userList == null)</p><p><b>  {</b></p><p>  File f = new File("userFile.properties");</p><p>  if (!f.

65、exists())</p><p>  f.createNewFile() ; </p><p>  userList = new Properties();</p><p>  userList.load(new FileInputStream(f)); </p><p><b>  }</b>&

66、lt;/p><p>  return userList;</p><p><b>  }</b></p><p>  private boolean saveUserList()throws IOException</p><p><b>  {</b></p><p>  if

67、 (userList == null)</p><p><b>  {</b></p><p>  return false;</p><p><b>  }</b></p><p>  userList.store(new FileOutputStream("userFile.prope

68、rties"), "userList");</p><p>  return true;</p><p><b>  }</b></p><p><b>  }</b></p><p>  附錄2:客戶端程序清單</p><p>  //Chat

69、Servlet.java</p><p>  package lee;</p><p>  import java.io.IOException;</p><p>  import java.io.PrintWriter;</p><p>  import javax.servlet.ServletException;</p>

70、<p>  import javax.servlet.http.HttpServlet;</p><p>  import javax.servlet.http.HttpServletRequest;</p><p>  import javax.servlet.http.HttpServletResponse;</p><p>  import java

71、x.servlet.ServletException;</p><p>  import javax.servlet.ServletContext;</p><p>  import javax.servlet.RequestDispatcher;</p><p>  import javax.servlet.http.HttpServlet;</p>

72、<p>  import javax.servlet.http.HttpServletRequest;</p><p>  import javax.servlet.http.HttpServletResponse;</p><p>  import java.io.PrintWriter;</p><p>  import java.io.IOExce

73、ption;</p><p>  public class ChatServlet extends HttpServlet {</p><p><b>  /**</b></p><p>  * Constructor of the object.</p><p><b>  */</b></

74、p><p>  public ChatServlet() {</p><p><b>  super();</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  * Destruction of th

75、e servlet. <br></p><p><b>  */</b></p><p>  public void destroy() {</p><p>  super.destroy(); // Just puts "destroy" string in log</p><p>  

76、// Put your code here</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * The doGet method of the servlet. <br></p><p><b>  *</b>

77、</p><p>  * This method is called when a form has its tag value method equals to get.</p><p><b>  * </b></p><p>  * @param request the request send by the client to the

78、server</p><p>  * @param response the response send by the server to the client</p><p>  * @throws ServletException if an error occurred</p><p>  * @throws IOException if an error o

79、ccurred</p><p><b>  */</b></p><p>  public void doGet(HttpServletRequest request, HttpServletResponse response)</p><p>  throws ServletException, IOException {</p>

80、<p><b>  }</b></p><p><b>  /**</b></p><p>  * The doPost method of the servlet. <br></p><p><b>  *</b></p><p>  * This

81、method is called when a form has its tag value method equals to post.</p><p><b>  * </b></p><p>  * @param request the request send by the client to the server</p><p>  

82、* @param response the response send by the server to the client</p><p>  * @throws ServletException if an error occurred</p><p>  * @throws IOException if an error occurred</p><p>&

83、lt;b>  */</b></p><p>  public void doPost(HttpServletRequest request, HttpServletResponse response)</p><p>  throws ServletException, IOException {</p><p><b>  }</

84、b></p><p><b>  /**</b></p><p>  * Initialization of the servlet. <br></p><p><b>  *</b></p><p>  * @throws ServletException if an error

85、 occurs</p><p><b>  */</b></p><p>  public void init() throws ServletException {</p><p>  // Put your code here</p><p><b>  }</b></p><

86、;p>  public void service(HttpServletRequest request,HttpServletResponse response)</p><p>  throws IOException,ServletException</p><p><b>  {</b></p><p>  request.setC

87、haracterEncoding("UTF-8");</p><p>  String msg = request.getParameter("chatMsg");</p><p>  if ( msg != null && !msg.equals(""))</p><p><b>

88、;  {</b></p><p>  String user = (String)request.getSession(true).getAttribute("user");</p><p>  ChatService.instance().addMsg(user , msg);</p><p><b>  }</b&

89、gt;</p><p><b>  //設(shè)置中文流</b></p><p>  response.setContentType("text/html;charset=GBK");</p><p>  PrintWriter out = response.getWriter();</p><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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論