2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  本科畢業(yè)論文(設計)</p><p>  題 目: 基于C/S飛鳥局域網聊天工具的設計與實現</p><p>  院 系: 計算機科學系 </p><p>  專 業(yè): 計算機科學與技術 </p><p>  姓 名:

2、 </p><p>  學 號: </p><p>  指導教師: </p><p>  教師職稱: </p><p>  填寫日期: 2012年 5月1 日</p><p

3、><b>  摘 要</b></p><p>  在網絡越來越發(fā)達的今天,人們對網絡的依賴越來越多,越來越離不開網絡,由此而產生的聊天工具越來越多,例如,國外的ICQ、國內騰訊公司開發(fā)的OICQ?;贘ava網絡編程的強大功能,本次畢業(yè)設計使用Java編寫一個聊天系統(tǒng)。</p><p>  本系統(tǒng)建立在JAVA平臺上,系統(tǒng)的設計使用了面向對象技術和面向對象的設

4、計原則。系統(tǒng)采用C/S結構,客戶端與客戶端以及客戶端與服務器端之間通過Socket傳送消息。使用JAVA語言編寫,開發(fā)工具采用Eclipse。服務器端設計與實現過程中,采用了多線程技術,可以在單個程序當中同時運行多個不同的線程,執(zhí)行不同的任務。大大增強了程序對服務器資源的利用。</p><p>  一般來說,聊天工具大多數由客戶端程序和服務器程序外加服務器端用于存放客戶數據的數據庫組成,本系統(tǒng)采用客戶機/服務器架

5、構模式通過Java提供的Socket類來連接客戶機和服務器并使客戶機和服務器之間相互通信,由于聊天是多點對多點的而Java提供的多線程功能用多線程可完成多點對多點的聊天,數據庫管理系統(tǒng)用SQL Server2005完成并通過JDBC-ODBC橋訪問數據庫。</p><p>  聊天系統(tǒng)完成后將可進行多人對多人的聊天,對好友進行添加、刪除,對新用戶的注冊,發(fā)送消息、接受消息等等功能</p><p

6、>  關鍵詞:多線程 ; JAVA ; Socket ; TCP/IP </p><p><b>  Abstract </b></p><p>  as the network become more and more developed, people become more and more lean to the network, and can not

7、 leave with out it. This caused the chat materials become more numerous, as the overseas ICQ system, the OICQ system that invented by Tencent Co., and so on. So we create a network chat medium just like the QQ. Java netw

8、ork programming based on the power, the use of Java designed to prepare graduates a chat system.</p><p>  In general, the majority of the chat tool for client and server program in addition to server-side st

9、orage of customer data for the database, the system uses a client / server architecture model the adoption of Java provided Socket class connect client and server and between the client and server communicate with each o

10、ther, as the chat is to provide point-to-multipoint and multi-threaded Java function to be completed by using multi-threaded chat and more point-to-multipoint, database management</p><p>  The system built o

11、n the JAVA platform, the system design using object-oriented technology and object-oriented design principles. System uses the C / S structure, client and client-side and server-side client and send messages through Sock

12、et. The use of JAVA language, development tools using Eclipse. Design and Implementation of server-side process, the use of multi-threading technology, which can process in a single run at the same time a number of diffe

13、rent threads, the implementation of differ</p><p>  Chat system will allow people to complete chat to more friends,and the system can add, delete somebody,can deal with new user registration, send messages,

14、receive messages and so on. </p><p>  Keywords : Multithreading ; JAVA ;Socket ; TCP/IP</p><p><b>  目 錄</b></p><p><b>  摘 要1</b></p><p>  

15、Abstract2</p><p><b>  第一章 前言5</b></p><p>  第一節(jié) 課題研究的意義5</p><p>  第二節(jié) 國內外聊天系統(tǒng)的研究現狀5</p><p>  第二節(jié) Java語言6</p><p>  一、Java的發(fā)展歷史6</p>

16、<p>  二、Java的特點6</p><p>  三、Java與Internet7</p><p>  第三節(jié) Socket編程8</p><p>  一、關于TCP/IP協(xié)議8</p><p>  二、服務器和客戶機9</p><p>  第四節(jié) 多線程編程9</p><

17、p>  第二章 需求分析12</p><p>  第一節(jié) 可行性分析12</p><p>  一、經濟可行性12</p><p>  二、技術可行性12</p><p>  三、運行可行性12</p><p>  第二節(jié) 系統(tǒng)功能需求12</p><p><b>  

18、一、服務器端12</b></p><p><b>  二、客戶端13</b></p><p>  第三節(jié) 系統(tǒng)性能需求13</p><p><b>  一、實用性13</b></p><p><b>  二、操作簡單13</b></p>&l

19、t;p><b>  三、技術先進13</b></p><p>  四、安裝使用簡便13</p><p><b>  五、實用性好13</b></p><p>  六、代碼可讀性好14</p><p>  第四節(jié) 系統(tǒng)運行需求14</p><p><b&

20、gt;  一、運行環(huán)境14</b></p><p><b>  二、必要環(huán)境14</b></p><p><b>  三、硬件環(huán)境14</b></p><p>  第五節(jié) 數據流圖14</p><p>  一、頂層數據流圖14</p><p>  二、一

21、層數據流圖15</p><p>  三、二層數據流圖16</p><p>  第六節(jié) 系統(tǒng)數據關系圖16</p><p>  一、系統(tǒng)E-R圖16</p><p>  二、數據庫關系圖18</p><p>  第三章 概要設計19</p><p>  第一節(jié) 系統(tǒng)實現原理19<

22、;/p><p>  第二節(jié) 系統(tǒng)實現層次圖20</p><p>  第三節(jié) 各模塊詳細功能20</p><p>  一、服務器端結構20</p><p>  二、客戶端結構21</p><p>  第四章 詳細設計22</p><p>  第一節(jié) 系統(tǒng)流程圖22</p>&

23、lt;p>  一、系統(tǒng)總體流程圖22</p><p>  二、系統(tǒng)客戶端流程圖23</p><p>  第二節(jié) 編寫服務器端程序24</p><p><b>  一、問題陳述24</b></p><p><b>  二、解決方案24</b></p><p> 

24、 第三節(jié) 客戶端程序編寫34</p><p>  第四節(jié) 用戶登錄36</p><p>  一、收集用戶登錄信息36</p><p>  第五節(jié) 聊天室37</p><p>  一、用戶發(fā)送信息38</p><p>  第七節(jié) 退出聊天系統(tǒng)40</p><p>  第八節(jié) 出現異常信

25、息41</p><p>  第五章 總 結42</p><p><b>  致謝43</b></p><p><b>  參考文獻44</b></p><p><b>  第一章 前言</b></p><p>  第一節(jié) 課題研究的意義<

26、/p><p>  研究該課題,具有重大意義,這對于今后研究網絡與通信融合具有指導作用。雖然目前的聊天軟件已經具備強大多種的功能,并且支持廣域網的聊天,但是他們仍然存在各種各樣的問題,如安全問題。雖然該課題僅僅包含了即時通訊軟件的簡單的功能,但對于后續(xù)的研究與開發(fā),有一定的輔助作用。</p><p>  第二節(jié) 國內外聊天系統(tǒng)的研究現狀</p><p>  隨著移動互聯(lián)網

27、的發(fā)展,互聯(lián)網即時通信也在向移動化擴張。目前,微軟、AOL、Yahoo、UcSTAR等重要即時通信提供商都提供通過手機接入互聯(lián)網即時通信的業(yè)務,用戶可以通過手機與其他已經安裝了相應客戶端軟件的手機或電腦收發(fā)消息。 </p><p>  即時聊天軟件最早的創(chuàng)始人是三個以色列青年,是他們在1996年做出來的,取名叫ICQ。1998年當ICQ注冊用戶數達到1200萬時,被AOL看中,以2.87億美元的天價買走。目前IC

28、Q有1億多用戶,主要市場在美洲和歐洲,已成為世界上最大的即時通信系統(tǒng)。 </p><p>  現在國內的即時通信工具按照使用對象分為兩類:一類是個人IM,如:QQ,百度hi,網易泡泡,盛大圈圈,淘寶旺旺等等。QQ的前身OICQ在1999年2月第一次推出,目前幾乎接近壟斷中國在線即時通訊軟件市場。百度Hi具備文字消息、音視頻通話、文件傳輸等功能,您可通過它找到志同道合的朋友,并隨時與好友聯(lián)絡感情;另一類是企業(yè)用IM

29、,簡稱EIM,如:E話通,UC,EC企業(yè)即時通信軟件,UcSTAR、商務通等。 </p><p>  即時通信最初是由AOL、微軟、雅虎、騰訊等獨立于電信運營商的即時通信服務商提供的。但隨著其功能日益豐富、應用日益廣泛,特別是即時通信增強軟件的某些功能如IP電話等,已經在分流和替代傳統(tǒng)的電信業(yè)務,使得電信運營商不得不采取措施應對這種挑戰(zhàn)。2006年6月,中國移動已經推出了自己的即時通信工具——Fetion,中國聯(lián)

30、通也將推出即時通訊工具“超信”,但由于進入市場較晚,其用戶規(guī)模和品牌知名度還比不上原有的即時通信服務提供商。</p><p>  第二節(jié) Java語言</p><p>  一、Java的發(fā)展歷史</p><p>  Java的發(fā)展歷史,可以追朔到1990年。當時Sun Microsystem公司為了發(fā)展消費類電子產品進行了一個名為Green的項目計劃。這個計劃的負責

31、任是James Gosling。起初他用具有面向對象特征的C++語言編寫嵌入式軟件,可以放在面包機或PDA(Personal Digital Assistant,個人數字主力)等小型電子消費這杯里,以使設備變得更為“聰明”,更具備人工只能。但后來發(fā)現C++并不適合這類任務;因為C++常會使系統(tǒng)失效。尤其在內存管理方面,c++采用直接地址訪問方式。需要程序員記錄并管理內存資源。這造成程序員編程的極大負擔,并可能產生多個Bugs。面包機上的

32、程序錯誤可能使面包機燒壞甚至爆炸。</p><p>  為了解決此類問題,Gosling決定開發(fā)一種新的語言,并取名為Oak。它采用了大部分與C++類似的語法對可能具備危險性的功能加以改進,例如將內存管理改為由語言自己進行管理,以減少程序員的負擔及可能發(fā)生的錯誤。Oak是一種可移置的語言,它是一種平臺獨立的語言,能夠在各種芯片上執(zhí)行,可以降低設備的研發(fā)成本。</p><p><b&g

33、t;  二、Java的特點</b></p><p>  Java是一種簡單、安全、適用、面向對象、可移置、高性能、多線程的語言。</p><p><b>  簡單性</b></p><p>  Java語言簡單高效,基本Java系統(tǒng)(編譯器和解釋器)所占空間不足250KB由于Java最初是為了對家用電器進行集成控制而設計的,因而具備

34、簡單明了的特征。</p><p><b>  面向對象</b></p><p>  面向對象技術是現代工業(yè)的一次革新,提高了軟件的模塊化程度和重復適用率,縮短了軟件開發(fā)時間,減低了卡發(fā)成本。在Java之前雖然已經有面向對象的程序設計語言問問世,但有些如C++并不是完全的面向對象,而是面向過程和面向對象的混合體。Java則是完全面向對象的程序設計語言。</p>

35、;<p><b>  安全性</b></p><p>  Java是可以用在網路及分布環(huán)境下的網路程序設計語言。在網路環(huán)境下,語言的安全性變得更為重要。Java提供了許多安全機制來保證其適用上的安全性。</p><p><b>  平臺獨立</b></p><p>  平臺獨立指程序不受操作平臺的限制,可以應

36、用在各種平臺上。Java源程序經過編譯后生成字節(jié)碼文件,而字節(jié)碼與具體的計算機無關。只要計算機安裝了能解釋執(zhí)行字節(jié)碼的Java虛擬機JVM,就可以執(zhí)行字節(jié)碼文件,從而實現Java的平臺獨立性。</p><p><b>  多線程</b></p><p>  Java具備內建的多線程功能,可以將一個程序的不同程序段設置為不同的線程,使各線程并發(fā)、獨立執(zhí)行,提高系統(tǒng)的運行

37、效率。</p><p><b>  6.網絡功能</b></p><p>  Java能從全球網絡資源獲取所需信息,如數據文件、影響文件、聲音文件等,并對所得信息進行處理,所以說Java是一種網絡語言。</p><p><b>  7.執(zhí)行效率</b></p><p>  Java的字節(jié)碼需要經過J

38、ava虛擬機JVM解釋成機器碼才能執(zhí)行,所以速度上較慢。但是隨著JVM技術的進步,使得其執(zhí)行速度直逼C與C++。</p><p>  三、Java與Internet</p><p>  Java語言取得成功的領域之一就是網絡,(其他語言)數頁代碼---->(Java)一條語句  TCP/IP(傳輸控制協(xié)議/網間協(xié)議)是internet的主要協(xié)議,定義了計算機和外

39、設進行通信所使用的規(guī)則(應用層,傳輸層,網絡層,鏈路層),大多數基于internet的應用程序被看作TCP/IP協(xié)議的上一層, 如 : ftp、http、smtp、pop3、 telnet、nntp等。  IP地址:TCP/IP網絡中的每臺計算機都有唯一的地址--IP地址。</p><p>  在Java中,有一個用來存儲internet地址的類叫InterAddress。</p>

40、;<p>  Java提供的網絡功能有三大類: URL, Socket, Datagram。</p><p>  1、URL是三大功能中最高級的一種,通過URL Java程序可以直接送出或讀入網絡上的數據.</p><p>  2、Socket是傳統(tǒng)網絡程序最常用的方式,可以想象為兩個不同的程序通過網絡的通信信道.</p><p>  3、Datagr

41、am是更低級的網絡傳輸方式,它把數據的目的紀錄在數據包中,然后直接放在網絡上</p><p>  第三節(jié) Socket編程</p><p>  一、關于TCP/IP協(xié)議</p><p>  TCP協(xié)議是網絡通信的基石,對此,Java專門提供了Socket的類庫,在其中抽象出TCP協(xié)議通信的常用方法:</p><p>  TCP協(xié)議與三次握手:

42、</p><p>  在講述TCP協(xié)議流程前,先來聲明兩個重要的概念:</p><p>  (1)客戶端,首先發(fā)送TCP請求的是客戶端,客戶端一般是服務(比如數據查詢服務)的請求者。</p><p> ?。?)服務器,在接收到客戶端的請求后(確保同客戶端的通信信道建立)服務器會向客戶端提供服務。服務器一般是服務的執(zhí)行者,會向客戶端返回服務執(zhí)行的結果。</p&g

43、t;<p>  為了實現客戶端同服務器端的通信,客戶端首先發(fā)送一個“SYN”數據包。如果服務器收到SYN標記,它將發(fā)回一個“SYN+ACK”數據包。接著,客戶端為了表示收到了這個SYN+ACK信息,會向服務器發(fā)送一個最終確認信息(ACK包)。這種SYN,SYN+ACK,ACK的步驟被稱為TCP連接建立時的“三次握手”,在這之后,連接就建立起來了,這個連接將一直保持活動狀態(tài),直到超時或者任何一方發(fā)出一個FIN(結束)信號。這

44、種通信模式也叫客戶端/服務器(C/S)模式。</p><p>  主機A 主機B</p><p>  圖1.1 三次握手協(xié)議</p><p>  由此可見,通過客戶端和服務器的“三次握手”,雙方可以建立暢通的通信信道,在此信道上雙方互相傳輸數據。</p><p><b>  二、服務器和客戶機

45、</b></p><p>  網絡最基本的目的就是讓兩臺機器連接到一起,并相互“交談”或者“溝通”。一旦兩臺機器都發(fā)現了對方,就可以展開一次令人愉快的雙向對話。但它們怎樣才能“發(fā)現”對方呢?這就像在游樂園里那樣:一臺機器不得不停留在一個地方,偵聽其他機器說:“嘿,你在哪里呢?” “停留在一個地方”的機器叫做“服務器”(Server);到處“找人”的機器則叫做“客戶機”(Client)或者“客戶

46、”。它們之間的區(qū)別只有在客戶機試圖同服務器連接的時候才顯得非常明顯。一旦連通,就變成了一種雙向通信,誰來扮演服務器或者客戶機便顯得不那么重要了。 所以服務器的主要任務是偵聽建立連接的請求,這是由我們創(chuàng)建的特定服務器對象完成的。而客戶機的任務是試著與一臺服務器建立連接,這是由我們創(chuàng)建的特定客戶機對象完成的。一旦連接建好,那么無論在服務器端還是客戶機端,連接只是魔術般地變成了一個IO數據流對象。從這時開始,我們可以象讀寫一個普通的文

47、件那樣對待連接。所以一旦建好連接,我們只需使用自己熟悉的IO命令即可。這正是Java聯(lián)網最方便的一個地方。</p><p>  圖1.2 服務器和客戶機的連接</p><p><b>  第四節(jié) 多線程編程</b></p><p>  多線程編成是網絡編成的基礎,幾乎所有的網絡編程都將涉及到多個線程的數據傳輸,并且還要實現界面和數據處理互不影響

48、。多線程編成雖說是基礎,但是卻是一個難點,因為線程同步的確比我們想象的復雜得多。要理解多線程編成就必須從以下幾個方面理解:一、操作系統(tǒng)多任務概念;二、線程和進程的聯(lián)系與區(qū)別;三、如何創(chuàng)建并管理銷毀一個線程;四、何謂線程同步,怎樣同步。</p><p>  什么是多任務概念?用通俗易懂的話就是幾個運行的任務“同時”進行,比如Windows就是典型的多任務操作系統(tǒng),我們可以同時進行聽歌,打游戲,聊QQ,在基于這種理念

49、的系統(tǒng)感覺就像所有的程序在同時運行一樣。但實際上在單CPU的機子上,這些程序并不是同時在運行(即便是在多CPU的電腦上,也不可能所有程序同時運行),所有的程序都以某種調度算法,按照優(yōu)先級,依次獲取CPU時間,每當一個程序獲得CPU時間后,它就會得到運行,而當運行一段時間后,操作系統(tǒng)會將其暫停,再接換新的線程來運行。由于電腦的速度很快,這種非并發(fā)的模式卻可以達到類似并發(fā)的效果。實際上,正如前面所說,操作系統(tǒng)并非是給某一程序分配時間片,準確

50、的說是給這個程序里的某一線程分配了時間片。因此,在多任務操作系統(tǒng)中(若有線程的話),線程將是運行的最小單位。</p><p>  在windows系統(tǒng)中,進程和線程是最為重要的兩個概念,因為整個系統(tǒng)就是基于進程和線程的。那么進程和線程有什么區(qū)別和聯(lián)系呢?進程實際就是一個運行的程序,該程序有自己的堆??臻g,有自己的線程(至少有一個主線程),并且可以創(chuàng)建其它進程或線程。有一個概念容易搞錯,就是進程是否能獲得CPU時間

51、片?實際上,進程是無法獲取CPU時間片,只有該進程里的線程才能,所以說,真正執(zhí)行代碼的是線程,而進程只能管理線程,管理內存等。</p><p><b>  第二章 需求分析</b></p><p><b>  第一節(jié) 可行性分析</b></p><p><b>  一、經濟可行性</b></p&

52、gt;<p>  由于本系統(tǒng)的主要背景是畢業(yè)課程設計,不注重直接的經濟效益和其后的發(fā)展方向,只在注重自身水平和能力的提高,對自身的經濟要求也不高,只要有一臺能運行Java軟件的電腦便可,所以不用考慮到經濟問題。</p><p><b>  二、技術可行性</b></p><p>  本系統(tǒng)的開發(fā)利用Microsoft SQL Server2005作為本系

53、統(tǒng)的數據庫,它是一個支持多用戶的新型數據庫,適用于大中規(guī)模的數據量需求。學校校園網的建設也為新系統(tǒng)服務器/客戶端的結構提供了硬件的支持。使用Java作為系統(tǒng)開發(fā)的開發(fā)環(huán)境,它提供完善的指令控制語句、類與對象的支持及豐富的數據類型,給開發(fā)高性能系統(tǒng)提供的保障為開發(fā)滿足客戶要求的系統(tǒng),保證了代碼的模塊化要求,而代碼模塊化的提高,非常有利于以后對新系統(tǒng)的擴展與修改。</p><p><b>  三、運行可行性

54、</b></p><p>  本系統(tǒng)為一個小型的局域網聊天系統(tǒng),所耗費的資源非常的小,現在一般的電腦無論是硬件還是軟件都能夠滿足條件,因此,本系統(tǒng)在運行上是可行的。</p><p>  綜上所述,本系統(tǒng)的設計與開發(fā)在技術上和硬件設備上的條件都是滿足的,因此,它在技術上是可行的。</p><p>  第二節(jié) 系統(tǒng)功能需求</p><p&

55、gt;  本系統(tǒng)主要通過客戶端,服務器端來體現聊天系統(tǒng)的基本功能。</p><p><b>  一、服務器端</b></p><p><b>  1.處理用戶注冊</b></p><p><b>  2.處理用戶登錄</b></p><p>  3.處理用戶發(fā)送信息,服務器監(jiān)控

56、聊天內容,服務器過濾非法內容</p><p>  4.處理用戶得到信息</p><p><b>  5.處理用戶退出。</b></p><p>  6. 保存服務器日志。</p><p>  7.保存用戶聊天信息。</p><p><b>  二、客戶端</b></p&

57、gt;<p>  1.用戶注冊界面及結果</p><p>  2.用戶登錄界面及結果</p><p>  3.用戶發(fā)送信息界面及結果</p><p>  4.用戶得到信息界面及結果</p><p>  5.用戶退出界面及結果</p><p>  第三節(jié) 系統(tǒng)性能需求</p><p>

58、;<b>  一、實用性</b></p><p>  為局域網聊天提供方便,有效進行作業(yè)管理。</p><p><b>  二、操作簡單</b></p><p>  本系統(tǒng)應該適用于不同水平的使用者,包括事業(yè)單位和企業(yè)單位,同時系統(tǒng)不應太復雜和煩瑣,因此要求系統(tǒng)的操作盡可能簡單易行。</p><p>

59、;<b>  三、技術先進</b></p><p>  產品的系統(tǒng)設計和開發(fā)應緊跟著整個計算機發(fā)展潮流,采用當時最先進的設計思想,利用最新的開發(fā)技術和開發(fā)工具。使系統(tǒng)能夠無論在功能設計上,還是在技術實現上,都處于同行業(yè)的領先地位。</p><p><b>  四、安裝使用簡便</b></p><p>  服務器端的安裝簡潔

60、明了,客戶機無需再裝任何軟件就可以直接注冊登陸聊天。</p><p><b>  五、實用性好</b></p><p>  應該能廣泛應用于不同類型的企事業(yè)單位。系統(tǒng)采用模塊化設計,用戶可以根據自己的實際情況自行組合,使系統(tǒng)在不同的硬件環(huán)境下都能得以應用。</p><p><b>  六、代碼可讀性好 </b></p

61、><p>  文中的代碼將盡可能簡潔,易懂。</p><p>  第四節(jié) 系統(tǒng)運行需求</p><p><b>  一、運行環(huán)境</b></p><p>  Windows 9x、xp</p><p><b>  二、必要環(huán)境</b></p><p> 

62、 JDK 1.5 以上</p><p><b>  三、硬件環(huán)境</b></p><p>  CPU 400MHz以上,內存64MB以上</p><p><b>  第五節(jié) 數據流圖</b></p><p><b>  一、頂層數據流圖</b></p><p

63、>  圖2.1 頂層數據流圖</p><p><b>  二、一層數據流圖</b></p><p><b>  . </b></p><p>  圖2.2 一層數據流圖</p><p><b>  三、二層數據流圖</b></p><p>  圖2

64、.3 系統(tǒng)二層數據流圖</p><p>  第六節(jié) 系統(tǒng)數據關系圖</p><p><b>  一、系統(tǒng)E-R圖</b></p><p>  E-R圖的圖形表示的意義:</p><p>  圖2.4 用戶E-R圖</p><p>  圖2.5 好友分組E-R圖</p><p&g

65、t;  圖2.6 好友關系 E-R圖</p><p><b>  1</b></p><p><b>  N</b></p><p><b>  N</b></p><p><b>  M</b></p><p>  圖2.7 總體

66、E-R圖</p><p><b>  二、數據庫關系圖</b></p><p>  圖2.8 數據庫關系圖</p><p><b>  第三章 概要設計</b></p><p>  第一節(jié) 系統(tǒng)實現原理</p><p>  聊天系統(tǒng)的設計跟普通網站設計有著許多不同的地方,普通

67、網站設計所考慮的因素,例如,普通網站需要對布局進入大量美化以及動畫設計等等,而聊天室只要提供滿足訪客雙方直接實時聊天即可。因此,在設計聊天系統(tǒng)的過程中,必須要考慮好以下幾個設計要點:</p><p>  在Internet上的聊天程序一般都是以服務器提供服務端連接響應,使用者通過客戶端程序登錄到服務器,就可以與登錄在同一服務器上的用戶交談,這是一個面向連接的通信過程。因此,程序要在TCP/IP環(huán)境下,實現服務器端

68、和客戶端兩部分程序。</p><p>  圖3.1 系統(tǒng)實現原理</p><p>  第二節(jié) 系統(tǒng)實現層次圖</p><p>  圖3.2 系統(tǒng)實現層次圖</p><p>  第三節(jié) 各模塊詳細功能</p><p><b>  一、服務器端結構</b></p><p>  

69、圖3.3 服務器端結構圖</p><p>  Serve_view.java 為服務器端程序界面,負責為服務器的啟動提供界面服務。</p><p>  ServerStart.java 為服務器端啟動界面,負責監(jiān)聽服務器的狀態(tài),在線人數,最多在線人數,服務器名稱,訪問協(xié)議,服務器IP,服務器端口以及用戶信息的管理,日志的保存。</p><p>  ServerMo

70、del.java 是連接服務器和客戶端的橋梁,主要負責將客戶端的信息傳送給服務器,并將服務器端的信息反饋給客戶端,即所謂的“三次握手”。也是Socket編程的重要部分。</p><p><b>  二、客戶端結構</b></p><p>  圖3.4 客戶端結構圖</p><p>  QQ_Client.java 為客戶端程序啟動類,負責客戶

71、端的啟動和退出。</p><p>  QQ_Window.java 為客戶端程序登錄界面,負責用戶帳號信息的驗證與反饋。</p><p>  RegistView.java 為客戶端程序注冊界面,負責用戶帳號信息的注冊驗證與反饋。</p><p>  QQChat.java 為客戶端程序聊天室主界面,負責接收、發(fā)送聊天內容與服務器端的</p><

72、p>  QQ_Listener 為監(jiān)聽類,負責監(jiān)聽聊天室界面的操作,當用戶退出時返回給服務器信息。</p><p>  第四章 詳細設計與實現</p><p><b>  第一節(jié) 系統(tǒng)流程圖</b></p><p><b>  一、系統(tǒng)總體流程圖</b></p><p>  圖4.1 系統(tǒng)總體

73、流程圖</p><p>  二、系統(tǒng)客戶端流程圖</p><p>  圖4.2 客戶端流程圖</p><p>  第二節(jié) 編寫服務器端程序</p><p><b>  一、問題陳述</b></p><p>  1. 接受用戶注冊信息并保存在一個基于文件的對象型數據庫。</p><

74、;p>  2. 能夠允許注冊過的用戶登錄聊天界面并可以聊天。</p><p>  3. 能夠接受私聊信息并發(fā)送給特定的用戶。</p><p>  4. 服務器運行在自定義的端口上.</p><p>  5. 服務器監(jiān)控用戶列表和用戶聊天信息(除私聊外)。</p><p><b>  6. 發(fā)送通知。</b><

75、/p><p>  7. 服務器保存日志。</p><p><b>  二、解決方案 </b></p><p><b>  1.后臺數據庫設計</b></p><p>  基于服務器跨平臺運行的構想,服務器的后臺數據庫使用了SQL Server2005。</p><p> ?。?)

76、tb_user 表:</p><p>  此表主要包含了用戶帳戶基本信息。</p><p> ?。?)tb_friend表</p><p>  (3)tb_group表</p><p>  聊天系統(tǒng)采用用戶名作為用戶帳號,并給每個用戶生成一個唯一ID來做系統(tǒng)內部的用戶標識。</p><p><b>  2.用

77、戶注冊</b></p><p>  (1)去數據庫讀數據</p><p>  首先去數據庫查詢所需注冊賬號是否存在,如果存在則注冊失敗并返回客服端信息,如果不存在則注冊成功并返回信息。</p><p>  (2)客戶端請求注冊</p><p>  客戶端通過Register.java請求注冊,填寫注冊信息,并驗證密碼是否符合規(guī)定,

78、是否兩次輸入一致,如不一致會提示重新輸入,最后將請求信息發(fā)送給服務器端。</p><p><b>  // 注冊</b></p><p>  jb1.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent e) {<

79、;/p><p><b>  // 創(chuàng)建網絡連接</b></p><p><b>  try {</b></p><p>  Socket socket = new Socket(QQ.IP, 10086);</p><p>  oop = new ObjectOutputStream(socket.ge

80、tOutputStream());</p><p>  oip = new ObjectInputStream(socket.getInputStream());</p><p>  } catch (Exception e1) {</p><p>  e1.printStackTrace();</p><p><b>  }<

81、;/b></p><p>  Message m = new Message("regist");</p><p>  User mine = new User();</p><p>  mine.setUser_num(jt1.getText().trim());</p><p>  mine.setUser_pa

82、ssword(jt2.getText());</p><p>  mine.setUser_name(jt3.getText());</p><p>  mine.setUser_sign(jta.getText());</p><p>  mine.setImg_path(imgPath);</p><p>  m.setU(mine);&

83、lt;/p><p><b>  try {</b></p><p>  oop.writeObject(m);</p><p>  oop.flush();</p><p>  Message toQQmenu = (Message) oip.readObject();</p><p>  JOpti

84、onPane.showMessageDialog(RegistView.this, toQQmenu</p><p>  .getMessage());</p><p><b>  new QQ();</b></p><p>  RegistView.this.dispose();</p><p>  } catch (

85、Exception e2) {</p><p>  e2.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  });</b></p><p><b>

86、  (3)服務器端響應</b></p><p>  服務器端得到注冊請求會將對象輸入流轉化為文件輸出流,并反饋給客戶端??蛻舳说玫阶孕畔⒑髸谇芭_填寫注冊信息,然后創(chuàng)建文件輸出流,再用對象輸出流包裝后寫入本地文件將其持久化。最后關閉對象輸出流和文件輸入流。</p><p><b>  // 注冊</b></p><p>  pub

87、lic boolean regist(Message m) {</p><p>  Message m1 = m;</p><p><b>  try{</b></p><p>  if ((m1.getU().getUser_num()) == null</p><p>  && ""

88、;.equals(m1.getU().getUser_num())) {</p><p>  m1.setMessage("QQ號不能為空!");</p><p>  oop.writeObject(m1);</p><p>  oop.flush();</p><p>  return false;</p>

89、<p>  } else if ((m1.getU().getUser_password()) == null</p><p>  && "".equals(m1.getU().getUser_password())) {</p><p>  m1.setMessage("密碼不能為空!");</p><

90、;p>  oop.writeObject(m1);</p><p>  oop.flush();</p><p>  return false;</p><p><b>  }</b></p><p>  }catch(Exception ee){</p><p>  ee.printSta

91、ckTrace();</p><p><b>  }</b></p><p>  Connection conn = DBtool.getConnection();</p><p><b>  try {</b></p><p>  PreparedStatement ps2 = conn.prep

92、areStatement("select user_num from tb_user where user_num = ? ");</p><p>  ps2.setString(1, m.getU().getUser_num());</p><p>  ResultSet r2 = ps2.executeQuery();</p><p>  i

93、f(r2!=null){</p><p>  while(r2.next()){</p><p>  if(r2.getString("user_num").equals(m.getU().getUser_num())){</p><p>  m1.setMessage("該賬號已被注冊!");</p><

94、p>  oop.writeObject(m1);</p><p>  oop.flush();</p><p>  DBtool.closeResultSet(r2);</p><p>  DBtool.closePrapaer(ps2);</p><p>  DBtool.closeConnection(conn);</p>

95、;<p>  return false;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  PreparedStatement ps1 = conn.prepareState

96、ment("insert into tb_user values (?,?,?,?,?);");</p><p>  ps1.setString(1, m1.getU().getUser_num());</p><p>  ps1.setString(2, m1.getU().getUser_name());</p><p>  ps1.setS

97、tring(3, m1.getU().getUser_password());</p><p>  ps1.setString(4, m1.getU().getUser_sign());</p><p>  ps1.setString(5, m1.getU().getImg_path());</p><p>  ps1.execute();</p>&

98、lt;p>  m1.setMessage("注冊成功!");</p><p>  oop.writeObject(m1);</p><p>  oop.flush();</p><p>  DBtool.closePrapaer(ps1);</p><p>  DBtool.closeConnection(conn)

99、;</p><p>  } catch (SQLException e) {</p><p>  e.printStackTrace();</p><p>  } catch (IOException e) {</p><p>  e.printStackTrace();</p><p><b>  }<

100、;/b></p><p>  return true;</p><p><b>  }</b></p><p>  public boolean regist2(Message m){</p><p>  Connection conn=DBtool.getConnection();</p><

101、p>  PreparedStatement pstmt = null;</p><p><b>  try {</b></p><p>  pstmt = conn.prepareStatement("update tb_user set user_nam=? ,img_path=? ,user_sign=? where user_num=?"

102、;);</p><p>  pstmt.setString(1, m.getU().getUser_name());</p><p>  pstmt.setString(2, m.getU().getImg_path());</p><p>  pstmt.setString(3, m.getU().getUser_sign());</p><p

103、>  pstmt.setString(4, m.getU().getUser_num());</p><p>  pstmt.execute();</p><p>  oop.writeObject(m);</p><p>  oop.flush();</p><p>  } catch (Exception e) {</p>

104、;<p>  e.printStackTrace();</p><p><b>  }finally{</b></p><p>  DBtool.closePrapaer(pstmt);</p><p>  DBtool.closeConnection(conn);</p><p><b>  }

105、</b></p><p>  return true;</p><p><b>  }</b></p><p>  (4)給客戶端返回信息</p><p>  將用戶注冊成功或失敗的信息用打印流包裝Socket以后,輸出給客戶端注冊結果的詳細信息。</p><p>  (5)關閉Soc

106、ket連接</p><p>  當以上的程序都正常運行后,需要關閉Socket連接,否則將會浪費服務器與客戶端之間的資源。</p><p><b>  3.用戶登陸</b></p><p>  (1)去數據庫讀用戶數據</p><p> ?。?)驗證用戶名是否存在</p><p>  在對象數據庫

107、中查找是否有與登錄用戶的用戶名相同的記錄,如果有繼續(xù)驗證,否則退出驗證處理,返回“沒有此用戶”錯誤</p><p>  用戶登陸程序模塊如下:</p><p><b>  4.用戶退出</b></p><p><b> ?。?)接收退出信息</b></p><p>  當用戶退出時,客戶端將會用基于

108、Socket的對象輸出流發(fā)送給服務器退出對象。</p><p> ?。?)在線列表中刪除用戶</p><p>  用戶退出后應該把用戶從在線列表中刪除,否則用戶退出用戶還在在線列表中,么 該用戶下次將會無法登錄。</p><p><b> ?。?)更新在線列表</b></p><p>  用

109、戶退出后將服務器端監(jiān)控界面的用戶列表更新。否則用戶數據將會不同步。</p><p><b>  用戶退出模塊程序:</b></p><p>  5.接收用戶聊天信息</p><p> ?。?)接收用戶聊天信息</p><p>  當用戶發(fā)送聊天信息時,服務端將會收到客戶端用Socket傳輸過來的聊天信息對象,然后將其強制

110、轉換為Chat對象。</p><p> ?。?)接收服務器端的系統(tǒng)消息</p><p>  當有其他用戶登陸時,系統(tǒng)會給在線的所有用戶發(fā)送用戶登陸信息,并且通過服務器可以給各用戶發(fā)送系統(tǒng)消息。系統(tǒng)消息發(fā)出后,如再有登錄者也可以接收到系統(tǒng)消息。</p><p><b> ?。?)返回給客戶端</b></p><p>  當

111、以上信息都封裝成功后,打開與客戶端連接的Socket的輸出流,然后再用ObjectOutputStream對象輸出流包裝后輸出給客戶端。</p><p>  第三節(jié) 客戶端程序編寫</p><p>  程序將通過RegistView.java用戶注冊界面收集用戶的用戶名、密碼、呢稱、個性簽名。</p><p><b>  圖4.3 注冊界面</b&g

112、t;</p><p>  客戶端用戶注冊信息模塊程序:</p><p><b>  第四節(jié) 用戶登錄</b></p><p>  一、收集用戶登錄信息</p><p>  程序將通過QQ.java用戶登錄界面收集用戶的用戶名、密碼,如圖</p><p><b>  圖4.4 登錄界面&l

113、t;/b></p><p><b>  第五節(jié) 聊天室</b></p><p>  當用戶登錄成功后,用戶的登錄界面將會隱藏,然后創(chuàng)建用戶聊天室窗口,在界面的標題欄將會顯示當前登錄用戶的用戶名。</p><p>  位于界面下方的就是一些用于聊天的功能控件和聊天內容個性化配置控件。包括聊天對象,聊天語氣,聊天內容,聊天字體,風格,大小,顏

114、色…….</p><p><b>  一、用戶發(fā)送信息</b></p><p>  用戶需要發(fā)送信息時,在聊天內容里寫下要發(fā)送的信息,然后點擊發(fā)送就可以發(fā)送到其他客戶端,可以選擇聊天表情,聊天信息通過服務器發(fā)送到其他客戶端。如圖:</p><p><b>  圖4.5 聊天界面</b></p><p&g

115、t;  // 定義jb1發(fā)送按鈕事件</p><p>  jb1.addActionListener(new ActionListener() {</p><p><b>  @Override</b></p><p>  public void actionPerformed(ActionEvent e) {</p><p

116、>  if (jta2.getText() == null || "".equals(jta2.getText())) {</p><p>  jta2.setText("發(fā)送內容不能為空!");</p><p><b>  } else {</b></p><p>  picVector = ne

117、w Vector<Icon>();</p><p>  mesVector = new Vector<Object>();</p><p>  Message m = new Message("chat");</p><p>  for (int i = 0; i < jta2.getStyledDocument()

118、</p><p>  .getRootElements()[0].getElement(0)</p><p>  .getElementCount(); i++) {</p><p>  Icon icon = StyleConstants.getIcon(jta2</p><p>  .getStyledDocument().getRoot

119、Elements()[0]</p><p>  .getElement(0).getElement(i).getAttributes());</p><p>  if (icon != null) {</p><p>  picVector.add(icon);</p><p><b>  }</b></p>

120、<p><b>  }</b></p><p>  int k = 0;</p><p>  for (int i = 0; i < jta2.getStyledDocument().getLength(); i++) {</p><p>  if (jta2.getStyledDocument().getCharacter

121、Element(i)</p><p>  .getName().equals("icon")) {</p><p>  mesVector.add(picVector.get(k));</p><p><b>  k++;</b></p><p><b>  } else {</b&g

122、t;</p><p><b>  try {</b></p><p>  mesVector.add(jta2.getStyledDocument().getText(i, 1));</p><p>  } catch (BadLocationException e1) {</p><p>  e1.printStack

123、Trace();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  m.setMesVector(mesVector);</p><p>  m.setPicVec

124、tor(picVector);</p><p>  m.setFriend_num(utofriend.getUser_num());</p><p>  m.setMy_num(mine.getUser_num());</p><p>  m.setArr(zt.getFontAttrib().getAttrSet());</p><p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論