版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 簡(jiǎn)單聊天程序的設(shè)計(jì)與實(shí)現(xiàn) </p><p><b> 摘 要</b></p><p> 本課程設(shè)計(jì)主要是設(shè)計(jì)并實(shí)現(xiàn)一個(gè)簡(jiǎn)單的聊天程序,該聊天程序能夠支持多人聊天,聊天的內(nèi)容可以?xún)H僅支持文本信息,聊天程序包括服務(wù)器程序和客戶(hù)端程序。在課程設(shè)計(jì)中系統(tǒng)的開(kāi)發(fā)平臺(tái)為Eclipse程序運(yùn)行平臺(tái)為Windows XP。</p><
2、;p> 關(guān)鍵詞:聊天程序;服務(wù)器;客戶(hù)端;Eclipse</p><p><b> 1 引 言</b></p><p> 本課程設(shè)計(jì)主要是簡(jiǎn)單聊天程序的設(shè)計(jì),使用MSN或QQ,分析聊天程序的功能需求及工作原理。該聊天程序能夠支持多人聊天,聊天的內(nèi)容可以?xún)H僅支持文本信息,聊天程序包括服務(wù)器程序和客戶(hù)端程序。</p><p> 1.
3、1 課程設(shè)計(jì)目的</p><p> 該課程設(shè)計(jì)的目的主要是通過(guò)對(duì)簡(jiǎn)單聊天程序的設(shè)計(jì)及QQ原理的分析,了解聊天程序的功能需求及工作原理;熟悉TCP/IP協(xié)議以及套節(jié)字編程原理;熟悉Eclipse編程環(huán)境及Socket/ServerSocket編程方法。</p><p> 1.2 課程設(shè)計(jì)要求</p><p> ?。?)按要求編寫(xiě)課程設(shè)計(jì)報(bào)告書(shū),能正確闡述設(shè)計(jì)結(jié)果。
4、</p><p> ?。?)通過(guò)課程設(shè)計(jì)培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)和團(tuán)隊(duì)協(xié)作精神。</p><p> ?。?)學(xué)會(huì)文獻(xiàn)檢索的基本方法和綜合運(yùn)用文獻(xiàn)的能力。</p><p> (4)在老師的指導(dǎo)下,要求每個(gè)學(xué)生獨(dú)立完成課程設(shè)計(jì)的全部?jī)?nèi)容。</p><p> 1.3 課程設(shè)計(jì)平臺(tái)</p><p> 課程設(shè)
5、計(jì)中系統(tǒng)的開(kāi)發(fā)平臺(tái)為Eclipse,程序運(yùn)行平臺(tái)為Windows XP。</p><p> 2 需 求 分 析</p><p><b> 2.1功能需求分析</b></p><p> ?。?)用戶(hù)端之間的信息發(fā)送,本程序需要實(shí)現(xiàn)的最基本的功能。用戶(hù)在界面上可以將自己需要發(fā)送的信息填入相應(yīng)的對(duì)話框中,點(diǎn)擊發(fā)送按鈕后,可以將信息正常的發(fā)送給相
6、應(yīng)的其它用戶(hù),這個(gè)過(guò)程中的客戶(hù)端與客戶(hù)端之間使用點(diǎn)對(duì)點(diǎn)發(fā)送信息,預(yù)計(jì)利用TCP/IP協(xié)議中的UDP協(xié)議,在本程序中共需要3個(gè)端口,此功能預(yù)計(jì)使用3號(hào)端口。</p><p> (2)在線用戶(hù)主機(jī)IP列表的維護(hù)。在用戶(hù)發(fā)送信息之前,需要選擇相應(yīng)的目的地端IP,這也就需要客戶(hù)端擁有在線用戶(hù)主機(jī)的IP地址,這個(gè)在線主機(jī)列表的維護(hù)是需要客戶(hù)端定時(shí)自動(dòng)向服務(wù)器端發(fā)送信息,服務(wù)器端收集并維護(hù)在線用戶(hù)列表,再發(fā)送回客戶(hù)端。需要
7、在客戶(hù)端和服務(wù)器端都使用定時(shí)器來(lái)完成此功能。此功能預(yù)計(jì)使用1、2號(hào)端口。</p><p> (3)在C/S模式中,服務(wù)器與客戶(hù)端是相互依賴(lài)的。在客戶(hù)端啟用以后,需要查看服務(wù)器端是否在線,服務(wù)器在線才能正常使用客戶(hù)端,如果服務(wù)器不在線,則在檢測(cè)一定次數(shù)以后自動(dòng)退出客戶(hù)端程序。在使用過(guò)程中,客戶(hù)端在指定時(shí)間內(nèi)未向服務(wù)器端發(fā)送信息的,服務(wù)器認(rèn)為客戶(hù)端下線;客戶(hù)端在一定時(shí)間內(nèi)未收到服務(wù)器端信息的,認(rèn)為服務(wù)器已經(jīng)下線,則
8、提示用戶(hù)并建議退出,在用戶(hù)一定時(shí)間后沒(méi)有退出的則自動(dòng)關(guān)閉客戶(hù)端程序[1]。</p><p><b> 2.2數(shù)據(jù)需求分析</b></p><p> ?。?)客戶(hù)端之間聊天信息。在控件上顯示時(shí)格式化,更易于用戶(hù)的查看自己發(fā)送或接收到的信息。</p><p> ?。?)在線用戶(hù)聊天信息。服務(wù)器端存放在適當(dāng)?shù)目臻g中,在發(fā)送給客戶(hù)端時(shí),對(duì)信息列表進(jìn)行
9、格式化,便于客戶(hù)端提取信息。</p><p> ?。?)客戶(hù)端向服務(wù)器端發(fā)送的確認(rèn)在線信息。包括客戶(hù)端剛剛啟動(dòng)時(shí)的初始化信息和在使用過(guò)程中的確認(rèn)在線信息。</p><p> ?。?)其它程序內(nèi)部可能需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)體。</p><p><b> 2.3性能需求分析</b></p><p> ?。?)可靠性高,能在由于
10、系統(tǒng)問(wèn)題或其它原因產(chǎn)生錯(cuò)誤后,作出相對(duì)應(yīng)處理,比如網(wǎng)絡(luò)初始化失敗、服務(wù)器不在線等,可以提示用戶(hù)安全退出本程序,在出現(xiàn)不可知的錯(cuò)誤以后,可以盡量安全的退出程序。在程序的設(shè)計(jì)過(guò)程中,要求能盡可能多的設(shè)想到用戶(hù)使用過(guò)程中可能發(fā)生的事件,并能在判斷事件后做出相應(yīng)的處理,使程序具有較高的容錯(cuò)性能[2]。(2)宜操作性,程序簡(jiǎn)單易懂,容易上手使用。設(shè)計(jì)界面是,簡(jiǎn)化界面的復(fù)雜性,模擬QQ等現(xiàn)有即時(shí)通訊工具的界面,使用戶(hù)能很容易看懂并使用。</p
11、><p> ?。?)開(kāi)發(fā)文檔易理解,保證以后自己二次開(kāi)發(fā)或他人接手開(kāi)發(fā)時(shí),能夠清晰的理解整個(gè)系統(tǒng)的設(shè)計(jì)思路和實(shí)現(xiàn)細(xì)節(jié)。</p><p> ?。?)模塊化設(shè)計(jì)此軟件的功能,不同的模塊實(shí)現(xiàn)不同的功能,使得軟件易于以后的維護(hù)與擴(kuò)展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應(yīng)用。</p><p><b> 2.4運(yùn)行需求分析</b></
12、p><p><b> ?。?)用戶(hù)界面</b></p><p> 程序較小,啟動(dòng)速度快??稍诰W(wǎng)絡(luò)中使用,有注冊(cè)功能,需進(jìn)行用戶(hù)登錄。啟動(dòng)后的應(yīng)用界面要清爽,設(shè)計(jì)要簡(jiǎn)單明了,要具有較高的易用性。</p><p><b> ?。?)故障處理</b></p><p> 在遇到可預(yù)知的故障與情況時(shí),能提示用
13、戶(hù)并自動(dòng)退出;在遇到不可預(yù)知的故障時(shí)能安全退出。</p><p> 3 設(shè) 計(jì) 原 理</p><p> 3.1 聊天程序的工作原理</p><p> QQ聊天程序采用的是C/S通信模式,即客戶(hù)/服務(wù)模式,它把一個(gè)應(yīng)用劃分成功能不同的兩個(gè)部分,分別在不同的計(jì)算機(jī)上運(yùn)行,其中一個(gè)為服務(wù)端程序,用來(lái)響應(yīng)和提供固定的服務(wù),一個(gè)為客戶(hù)端程序,用來(lái)向服務(wù)端提出請(qǐng)求和要
14、求某種服務(wù)。在數(shù)量關(guān)系上,通常有一對(duì)一的(即一個(gè)服務(wù)端程序和一個(gè)客戶(hù)端程序之間通信),也有一對(duì)多的(即一個(gè)服務(wù)端程序和多個(gè)客戶(hù)端程序之間通信),也有多對(duì)多的(即多個(gè)服務(wù)端程序和多個(gè)客戶(hù)端程序之間通信)。所謂服務(wù)端程序、客戶(hù)端程序也是相對(duì)的概念,有時(shí)在一個(gè)程序中既有服務(wù)端又有客戶(hù)端的功能。QQ聊天程序分成了兩個(gè)程序,一個(gè)安裝在騰訊公司的服務(wù)器上,我們稱(chēng)之為服務(wù)端程序,一個(gè)安裝在QQ用戶(hù)的計(jì)算機(jī)上,我們稱(chēng)之為客戶(hù)端程序。在許多介紹網(wǎng)絡(luò)通信編
15、程的書(shū)籍中有關(guān)網(wǎng)絡(luò)聊天的例子,當(dāng)一個(gè)客戶(hù)要與另一個(gè)客戶(hù)聊天時(shí),第一個(gè)客戶(hù)先把聊天數(shù)據(jù)發(fā)送給服務(wù)器,然后服務(wù)器再把聊天數(shù)據(jù)轉(zhuǎn)發(fā)給第二個(gè)客戶(hù),服務(wù)器好像一個(gè)中轉(zhuǎn)站,這在客戶(hù)數(shù)量比較少時(shí),服務(wù)器還能承受,在客戶(hù)數(shù)量比較多時(shí),服務(wù)器肯定要癱瘓。何況客戶(hù)之間還要傳送文件、語(yǔ)音聊天、視頻聊天等等,為了減少服務(wù)器的壓力,各客戶(hù)端之間需要直接通信。</p><p> ?。?)在服務(wù)端和客戶(hù)端之間(一對(duì)多)</p>
16、<p> 用于客戶(hù)端程序登錄,驗(yàn)證用戶(hù)密碼,獲取其它在線好友信息等等。</p><p> (2)在客戶(hù)端和客戶(hù)端之間(多對(duì)多)</p><p> 用于在線好友間直接通信聊天。此時(shí)每個(gè)客戶(hù)端程序上既有實(shí)現(xiàn)服務(wù)端功能的部分,又有實(shí)現(xiàn)客戶(hù)端功能的部分,前者用于接收聊天數(shù)據(jù),后者用于發(fā)送聊天數(shù)據(jù)。</p><p> 在用C/S模式進(jìn)行通信時(shí),作為客戶(hù)端在請(qǐng)
17、求與服務(wù)端連接時(shí)需要知道服務(wù)端的IP地址,騰訊公司的服務(wù)器具有固定的公網(wǎng)地址,這沒(méi)有問(wèn)題。但是在客戶(hù)端和客戶(hù)端之間通信時(shí),每個(gè)用戶(hù)的IP地址都是ISP所給的臨時(shí)地址,無(wú)法固定,那么某個(gè)用戶(hù)要與另一個(gè)用戶(hù)連接時(shí),怎么知道對(duì)方的IP地址呢?當(dāng)一個(gè)用戶(hù)連接到Internet后,獲得了一個(gè)臨時(shí)的公網(wǎng)地址,當(dāng)?shù)卿浀絈Q時(shí),QQ服務(wù)端會(huì)獲得該上線用戶(hù)的IP地址,然后告知其他要與該上線用戶(hù)聊天的用戶(hù),其他用戶(hù)就可以連接該用戶(hù)與之直接通信了。</
18、p><p> 在Win32平臺(tái)上,對(duì)于眾多的基層網(wǎng)絡(luò)協(xié)議,Winsock是訪問(wèn)它們的首選接口。如果想從頭開(kāi)發(fā)一個(gè)網(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)的簡(jiǎn)寫(xiě),中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet最基本的協(xié)議、Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡(jiǎn)單地說(shuō),就是由網(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ū)動(dòng)程序)發(fā)來(lái)的數(shù)據(jù)包,并
20、把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來(lái)的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因?yàn)镮P并沒(méi)有做任何事情來(lái)確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒(méi)有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。</p><p> 高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時(shí),通常假設(shè)包中的源地址是有效的。也可以這樣說(shuō),IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ),這
21、些服務(wù)相信數(shù)據(jù)包是從一個(gè)有效的主機(jī)發(fā)送來(lái)的。IP確認(rèn)包含一個(gè)選項(xiàng),叫作IP source routing,可以用來(lái)指定一條源地址和目的地址之間的直接路徑。對(duì)于一些TCP和UDP的服務(wù)來(lái)說(shuō),使用了該選項(xiàng)的IP包好像是從路徑上的最后一個(gè)系統(tǒng)傳遞過(guò)來(lái)的,而不是來(lái)自于它的真實(shí)地點(diǎn)。這個(gè)選項(xiàng)是為了測(cè)試而存在的,說(shuō)明了它可以被用來(lái)欺騙系統(tǒng)來(lái)進(jìn)行平常是被禁止的連接。那么,許多依靠IP源地址做確認(rèn)的服務(wù)將產(chǎn)生問(wèn)題并且會(huì)被非法入侵[4]。</p&g
22、t;<p> 如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進(jìn)行錯(cuò)誤檢查,同時(shí)實(shí)現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號(hào)和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。</p><p> TCP將它的信息送到更高層的應(yīng)用程序,例如Telnet的服務(wù)程序和客戶(hù)程序。應(yīng)用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,
23、設(shè)備驅(qū)動(dòng)程序和物理介質(zhì),最后到接收方。</p><p> 面向連接的服務(wù)(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫(kù)),但使用UDP傳送有關(guān)單個(gè)主機(jī)的信息。</p><p> 3.3 套接字編程原理</p><p> 在TCP/IP網(wǎng)絡(luò)中兩個(gè)進(jìn)
24、程間的相互作用的主機(jī)模式是客戶(hù)機(jī)/服務(wù)器模式(Client/Server model)。該模式的建立基于以下兩點(diǎn):1、非對(duì)等作用;2、通信完全是異步的??蛻?hù)機(jī)/服務(wù)器模式在操作過(guò)程中采取的是主動(dòng)請(qǐng)示方式:</p><p> 首先服務(wù)器方要先啟動(dòng),并根據(jù)請(qǐng)示提供相應(yīng)服務(wù):(過(guò)程如下)</p><p> ?。?)打開(kāi)一通信通道并告知本地主機(jī),它愿意在某一個(gè)公認(rèn)地址上接收客戶(hù)請(qǐng)求。</p
25、><p> ?。?)等待客戶(hù)請(qǐng)求到達(dá)該端口。</p><p> ?。?)接收到重復(fù)服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答信號(hào)。</p><p> ?。?)返回第二步,等待另一客戶(hù)請(qǐng)求</p><p><b> ?。?)關(guān)閉服務(wù)器。</b></p><p><b> 客戶(hù)方:</b>&l
26、t;/p><p> ?。?)打開(kāi)一通信通道,并連接到服務(wù)器所在主機(jī)的特定端口。</p><p> ?。?)向服務(wù)器發(fā)送服務(wù)請(qǐng)求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請(qǐng)求……</p><p> ?。?)請(qǐng)求結(jié)束后關(guān)閉通信通道并終止。</p><p> 所謂的客戶(hù)客戶(hù)端/服務(wù)器。是一種能夠在基于網(wǎng)絡(luò)環(huán)境的分布處理過(guò)程中,使用基于連接的網(wǎng)絡(luò)通信模型。該通信模
27、型首先在客戶(hù)機(jī)和服務(wù)器之間定義一套通信協(xié)議,并創(chuàng)建一個(gè)Socket類(lèi),利用這個(gè)類(lèi)來(lái)建立一條可靠的鏈接;然后,客戶(hù)端/服務(wù)器再在這條連接上可靠地傳輸數(shù)據(jù)。客戶(hù)端發(fā)出請(qǐng)求,服務(wù)器發(fā)出請(qǐng)求,服務(wù)器監(jiān)聽(tīng)來(lái)自客戶(hù)機(jī)的請(qǐng)求,并為客戶(hù)端提供相應(yīng)服務(wù)。</p><p> 利用Socket類(lèi),我們可以輕松地實(shí)現(xiàn)網(wǎng)路客戶(hù)端程序的編寫(xiě),Socket類(lèi)的一些常用的方法匯總?cè)缦拢?lt;/p><p> getLoc
28、alAddress()</p><p> 讀取套接字對(duì)象的本地地址。</p><p> getLocalPort()</p><p> 讀取套接字所使用的本地端口號(hào)。</p><p> getlnputStream()</p><p><b> 得到一個(gè)輸入流。</b></p>
29、;<p> getOutputStream()</p><p><b> 得到一個(gè)輸出流。</b></p><p> 通常情況下,客戶(hù)端只要能夠順序地處理服務(wù)器程序的響應(yīng)就可以了,因此客戶(hù)端程序通常不用使用多線程。</p><p> 3.4 Eclipse開(kāi)發(fā)環(huán)境</p><p> Eclipse
30、最初是由IBM公司開(kāi)發(fā)的替代商業(yè)軟件Visual Age for Java的下一代IDE開(kāi)發(fā)環(huán)境,是著名的跨平臺(tái)的自由集成開(kāi)發(fā)環(huán)境。最初主要用來(lái)Java語(yǔ)言開(kāi)發(fā),但是目前亦有人通過(guò)插件使其作為其他計(jì)算機(jī)語(yǔ)言比如C++和Python的開(kāi)發(fā)工具。</p><p> Eclipse的本身只是一個(gè)框架平臺(tái),但是眾多插件的支持使得Eclipse擁有其他功能相對(duì)固定的IDE軟件很難具有的靈活性。許多軟件開(kāi)發(fā)商以Eclips
31、e為框架開(kāi)發(fā)自己的IDE。</p><p> Eclipse采用的技術(shù)是IBM公司開(kāi)發(fā)的(SWT),這是一種基于Java的窗口組件,類(lèi)似Java本身提供的AWT和Swing窗口組件;不過(guò)IBM聲稱(chēng)SWT比其他Java窗口組件更有效率。Eclipse的用戶(hù)界面還使用了GUI中間層JFace,從而簡(jiǎn)化了基于SWT的應(yīng)用程序的構(gòu)建。</p><p> Eclipse的插件機(jī)制是輕型軟件組件化
32、架構(gòu)。在富客戶(hù)機(jī)平臺(tái)上,Eclipse使用插件來(lái)提供所有的附加功能,例如支持Java以外的其他語(yǔ)言。 已有的分離的插件已經(jīng)能夠支持C/C++(CDT)、Perl、Ruby,Python、telnet和數(shù)據(jù)庫(kù)開(kāi)發(fā)。插件架構(gòu)能夠支持將任意的擴(kuò)展加入到現(xiàn)有環(huán)境中,例如配置管理,而決不僅僅限于支持各種編程語(yǔ)言。</p><p> Eclipse的設(shè)計(jì)思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式
33、附加于Eclipse核心之上。Eclipse基本內(nèi)核包括:圖形API (SWT/Jface), Java開(kāi)發(fā)環(huán)境插件(JDT),插件開(kāi)發(fā)環(huán)境(PDE)等[5]。</p><p><b> 4 設(shè) 計(jì) 步 驟</b></p><p> 4.1 聊天室的總體設(shè)計(jì)</p><p> 聊天室的總體設(shè)計(jì)過(guò)程比較簡(jiǎn)單主要是構(gòu)建設(shè)計(jì)框圖。,就是當(dāng)客戶(hù)端
34、發(fā)出信息時(shí),我們將數(shù)據(jù)寫(xiě)到socket,當(dāng)對(duì)方有數(shù)據(jù)到達(dá)時(shí),我們從socket讀出來(lái)并顯示給客戶(hù)。程序關(guān)鍵在于如何監(jiān)聽(tīng)到有信息到達(dá)的過(guò)程。應(yīng)用程序流程圖如下圖所示,開(kāi)始是先創(chuàng)建主窗口,然后初始化窗口,程序下面才開(kāi)始消息循環(huán)處理。如果沒(méi)有消息循環(huán)的活,直接結(jié)束掉這個(gè)程序。如果有循環(huán)的話,要判斷這個(gè)窗口消息的內(nèi)容是哪種類(lèi)型,然后再進(jìn)行選擇處理方式。然后依據(jù)不同的內(nèi)容選擇“創(chuàng)建控件”,還是要“判斷命令”,或是分別處理各種socket的消息。流
35、程圖如圖4-1所示</p><p> 圖4-1聊天室設(shè)計(jì)架構(gòu)圖</p><p> 4.2 聊天室的模塊</p><p> 聊天室主要包括三個(gè)模塊,服務(wù)器模塊、客戶(hù)端模塊、信息處理模塊。該聊天室可以支持多人聊天,只支持文本信息。</p><p><b> ?。?)服務(wù)器模塊</b></p><p&
36、gt; 其所包含的函數(shù)模塊如下圖所示</p><p> 圖4-2 服務(wù)器模塊圖</p><p><b> ?。?)客戶(hù)端模塊</b></p><p> 客戶(hù)端所包含的函數(shù)模塊如下圖所示</p><p> 圖4-3 客戶(hù)端模塊圖</p><p><b> (3)信息處理模塊<
37、;/b></p><p> 信息處理模塊包括注冊(cè)信息及登錄信息的處理模塊,其所包含的函數(shù)模塊如下圖所示</p><p> 圖4-4 信息處理模塊圖</p><p><b> 4.3 程序的調(diào)試</b></p><p> 聊天室的程序模塊如下圖所示</p><p> 圖4-5 聊天室
38、程序模塊圖</p><p> 程序運(yùn)行后,用戶(hù)注冊(cè)界面如下圖所示</p><p> 圖4-6 用戶(hù)注冊(cè)界面</p><p> 用戶(hù)登錄界面如下圖所示</p><p> 圖4-7 用戶(hù)登錄界面</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 問(wèn) 題 分 析</b></p><p> 首先是對(duì)QQ軟件的需求分析還有工作原理的熟悉,雖然平日用的已經(jīng)很熟練了,但原理方面的知識(shí)還是有點(diǎn)模糊,通過(guò)對(duì)資料
40、的學(xué)習(xí)及一些小程序的運(yùn)行,聊天方面的原理才漸漸清晰。</p><p> 由于之前沒(méi)有學(xué)過(guò)Java,所以對(duì)Eclipse編程環(huán)境幾乎是一無(wú)所知,在程序編譯過(guò)程中遇到的問(wèn)題比較多,主要是對(duì)那些錯(cuò)誤還有警告開(kāi)始都不知道什么意思,花了兩天的時(shí)間在程序的調(diào)試上面。另外就是一些概念性的知識(shí)欠缺,尤其是套接字編程原理,所以對(duì)程序的一些函數(shù)的功能用法有些模糊。</p><p> 其實(shí)遇到的種種問(wèn)題主要
41、是兩方面的原因。一個(gè)是基礎(chǔ)知識(shí)的掌握不夠牢固,概念的混淆,不能夠很快的用最佳的方式去解決遇到的問(wèn)題等等,都是由于知識(shí)的不熟練導(dǎo)致。另一個(gè)就是Java部分知識(shí)的缺乏,導(dǎo)入文件還有一些參數(shù)的選擇都要查詢(xún)一下資料,主要是第一次操作這方面的知識(shí)。針對(duì)這些問(wèn)題,主要從兩個(gè)方面著手處理應(yīng)該,一方面是多對(duì)所學(xué)過(guò)的知識(shí)強(qiáng)化溫習(xí),做到熟能生巧,溫故知新。另一方面就是準(zhǔn)備的不夠充分,之前應(yīng)該及早的對(duì)所需軟件進(jìn)行熟悉,在以后的實(shí)習(xí)過(guò)程中需要注意。</p
42、><p><b> 6 總 結(jié)</b></p><p> 網(wǎng)絡(luò)的課程設(shè)計(jì),之前沒(méi)有接觸過(guò)網(wǎng)絡(luò)編程的語(yǔ)言,所以感覺(jué)難度比較大,也因?yàn)槿绱耍谡屹Y料及向老師同學(xué)的請(qǐng)教中學(xué)到了很多的東西。</p><p> 這次的課程設(shè)計(jì)是簡(jiǎn)單聊天程序,在平日的生活學(xué)習(xí)中,可以說(shuō)QQ等即時(shí)通訊軟件已占據(jù)重要的位置,也深受大家的喜愛(ài),所以這個(gè)課程設(shè)計(jì)很有現(xiàn)實(shí)意義,做
43、起來(lái)也比較感興趣。在具體做的過(guò)程中,參考了網(wǎng)絡(luò)班同學(xué)還有學(xué)長(zhǎng)的一些程序,雖然這個(gè)聊天室的界面及功能比較簡(jiǎn)單,但從代碼的編寫(xiě)及結(jié)果的調(diào)試成功還是花了很多的心思。尤其是剛開(kāi)始用Eclipse軟件的時(shí)候,從完全陌生到慢慢的了解,這其中的過(guò)程對(duì)應(yīng)用方面知識(shí)的提高有很大的幫助。</p><p> 課程設(shè)計(jì)項(xiàng)目的雖然要求是獨(dú)立完成,但還是很多問(wèn)題的解決離不開(kāi)老師的指導(dǎo)及同學(xué)之間的探討,這些在做項(xiàng)目的時(shí)候都是必不可少的。學(xué)校
44、提供了設(shè)計(jì)的機(jī)房還有老師的悉心指導(dǎo),這些跟課程設(shè)計(jì)的順利完成都是密不可分的,在這里感謝大家?guī)?lái)的幫助。</p><p> 另外就是知識(shí)方面的問(wèn)題,計(jì)算機(jī)網(wǎng)絡(luò)和Java Socket有很多方面的知識(shí)還是很不熟悉,具體用到的時(shí)候就感覺(jué)生疏,或者還是缺乏設(shè)計(jì)方面的實(shí)踐。課程設(shè)計(jì)的機(jī)會(huì)不是很多,由于所學(xué)的知識(shí)包含了太多的方面,所以實(shí)踐方面還是遠(yuǎn)遠(yuǎn)不夠,希望在學(xué)校期間能夠多一些類(lèi)似的機(jī)會(huì)。</p><
45、p> 雖然課程設(shè)計(jì)順利的完成了,但由于水平有限,還是有很多的欠缺跟不足之處,希望老師給予指正。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]謝希仁. 計(jì)算機(jī)網(wǎng)絡(luò). 北京:電子工業(yè)出版社,2009</p><p> [2]Y.Daniel Liang. Java語(yǔ)言程序設(shè)計(jì). 北京:機(jī)械工業(yè)出版社,200
46、8</p><p> [3]賽奎春. JSP工程應(yīng)用與項(xiàng)目實(shí)踐. 北京:機(jī)械工業(yè)出版社,2005</p><p> [4]Ian F.Darwin. Java經(jīng)典實(shí)例. 北京:中國(guó)電力出版社,1999</p><p> [5]丁振凡. Java語(yǔ)言實(shí)用教程. 北京:北京郵電大學(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("用戶(hù)名已經(jīng)存在,請(qǐng)重新選擇
56、用戶(hù)名");</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 + "說(shuō):" + 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:客戶(hù)端程序清單</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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)--簡(jiǎn)單的網(wǎng)絡(luò)聊天程序
- 操作系統(tǒng)課程設(shè)計(jì)--簡(jiǎn)單的聊天程序
- 操作系統(tǒng)課程設(shè)計(jì)--簡(jiǎn)單的聊天程序
- 課程設(shè)計(jì)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)聊天程序
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- 軟件課程設(shè)計(jì)---簡(jiǎn)易網(wǎng)絡(luò)聊天系統(tǒng)
- tcpip網(wǎng)絡(luò)聊天課程設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告---利用java實(shí)現(xiàn)簡(jiǎn)單聊天室
- java課程設(shè)計(jì)之簡(jiǎn)單聊天室
- mfc聊天軟件課程設(shè)計(jì)---網(wǎng)絡(luò)聊天程序設(shè)計(jì)
- mfc聊天軟件課程設(shè)計(jì)---網(wǎng)絡(luò)聊天程序設(shè)計(jì)
- 聊天室課程設(shè)計(jì)---聊天程序的設(shè)計(jì)和實(shí)現(xiàn)
- 多人聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)說(shuō)明書(shū)
- 多人聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)說(shuō)明書(shū)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- 《基于android的簡(jiǎn)單聊天通信軟件設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)
- tcp課程設(shè)計(jì)--網(wǎng)絡(luò)聊天室
- java課程設(shè)計(jì)---即時(shí)聊天系統(tǒng)
評(píng)論
0/150
提交評(píng)論