聊聊天系統(tǒng) 需求分析
《聊聊天系統(tǒng) 需求分析》由會(huì)員分享,可在線閱讀,更多相關(guān)《聊聊天系統(tǒng) 需求分析(36頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 目錄 系統(tǒng)分析與設(shè)計(jì) 0 2.1 需求分析 10 2.2系統(tǒng)總體框架 12 2.2.1總體設(shè)計(jì) 12 2.2.2功能模塊 13 2.3系統(tǒng)詳細(xì)設(shè)計(jì) 24 2.3.1多線程設(shè)計(jì) 24 2.3.2數(shù)據(jù)庫(kù)設(shè)計(jì) 25 2.3.3服務(wù)器的設(shè)計(jì) 25 2.3.4客戶(hù)端的設(shè)計(jì) 26 2.3.5消息通信的設(shè)計(jì) 26 緒論 1.1選題背景 1.1.1 即時(shí)消息系統(tǒng)的研究現(xiàn)狀 即時(shí)消息系統(tǒng)[1](Instant Messenger,IM)是一種在后 PC 時(shí)代興起的,以 Internet 網(wǎng)絡(luò)為基礎(chǔ)的,允許
2、交互雙方即時(shí)地傳送文字、語(yǔ)音、視頻等信息,能夠跟蹤網(wǎng)絡(luò)用戶(hù)在線狀態(tài)的網(wǎng)絡(luò)應(yīng)用軟件。即時(shí)消息系統(tǒng)產(chǎn)生有著深刻的社會(huì)原因:人們都有渴望社交,獲得社會(huì)尊重、實(shí)現(xiàn)自我的需求,這正是即時(shí)消息軟件風(fēng)行的原動(dòng)力,而物質(zhì)文明的日益發(fā)達(dá)所帶來(lái)副作用,又使得人們習(xí)慣與周?chē)娜吮3志嚯x,以致人們更愿意對(duì)陌生人敞開(kāi)心扉,在網(wǎng)絡(luò)中可以跨越年齡、身份、行業(yè)、地域的限制,達(dá)到人與人、人與信息之間的零距離交流。從這點(diǎn)上講,即時(shí)消息系統(tǒng)的出現(xiàn)改變了人們的溝通方式和交友文化,大大拓展了個(gè)人生活交流的空間。 國(guó)內(nèi)最為流行的即時(shí)消息軟件是 OICQ(簡(jiǎn)稱(chēng) QQ) 。它以良好的中文界面和不斷增強(qiáng)的功能形成了一定的 QQ 網(wǎng)絡(luò)文化。該
3、軟件是由騰訊公司于 1999 年 2 月自主開(kāi)發(fā)的基于Internet的即時(shí)消息系統(tǒng)。騰訊QQ 目前已成為中國(guó)最主要的即時(shí)消息服務(wù)網(wǎng)絡(luò)軟件。作為一種即時(shí)消息工具,QQ 支持顯示好友在線、即時(shí)傳送文字、語(yǔ)音和文件等功能。 QQ 還與無(wú)線尋呼、GSM 短信息、IP 電話(huà)網(wǎng)互聯(lián),為用戶(hù)提供互聯(lián)網(wǎng)短信及信息增值服務(wù)。騰訊 QQ 開(kāi)發(fā)和拓展統(tǒng)一、高速、豐富的互聯(lián)網(wǎng)應(yīng)用平臺(tái)、在線廣告業(yè)務(wù)、移動(dòng)通信業(yè)務(wù)、ISP及IP電話(huà)合作業(yè)務(wù)、企業(yè)商用即時(shí)消息服務(wù)、在線客戶(hù)支持及在線呼叫業(yè)務(wù)。 1.1.2 即時(shí)消息系統(tǒng)的發(fā)展趨勢(shì) 21世紀(jì)將是網(wǎng)絡(luò)化、信息化的世紀(jì),信息的融合已經(jīng)成為社會(huì)發(fā)展的主流方向[2]。即時(shí)消
4、息系統(tǒng)將不斷與信息交流領(lǐng)域的系統(tǒng)相互集成和滲透,擴(kuò)展其自己的功能和應(yīng)用范圍,滿(mǎn)足未來(lái)話(huà)音,數(shù)據(jù)和視頻的多媒體應(yīng)用需要,使即時(shí)消息以更豐富的接入方法,更高的服務(wù)質(zhì)量,更友好的面貌呈現(xiàn)在世人的面前。 從功能角度來(lái)看,即時(shí)消息系統(tǒng)向支持全媒體方向發(fā)展,隨著多媒體技術(shù)在網(wǎng)絡(luò)應(yīng)用中的發(fā)展,即時(shí)消息系統(tǒng)承載的媒體,不再局限于原來(lái)的文字、語(yǔ)音和文件的信息交換,信息載體擴(kuò)展到圖形、圖像和流媒體等多媒體業(yè)務(wù)上。目前ICQ 和 QQ預(yù)設(shè)了部分簡(jiǎn)單的表情圖像, 通過(guò)傳輸圖像代碼來(lái)傳遞表情圖像,可以被視為即時(shí)消息開(kāi)發(fā)商開(kāi)發(fā)支持圖形、圖像為載體的即時(shí)消息軟件的開(kāi)端。 從應(yīng)用范圍角度來(lái)看,即時(shí)消息系統(tǒng)集中在 In
5、ternet 個(gè)人用戶(hù)之間的信息交流應(yīng)用,隨著網(wǎng)絡(luò)技術(shù)應(yīng)用的發(fā)展,即時(shí)消息系統(tǒng)應(yīng)用范圍向園區(qū)化、集團(tuán)化拓展,應(yīng)用領(lǐng)域突破個(gè)人,而用于遠(yuǎn)程教學(xué)、遠(yuǎn)程醫(yī)療、遠(yuǎn)程演示、網(wǎng)絡(luò)會(huì)議等領(lǐng)域。 1.1.3論文研究的主要內(nèi)容 本論文的主要工作是利用編程技術(shù)建立一基于 J2SE 的即時(shí)消息系統(tǒng),主要實(shí)現(xiàn)網(wǎng)絡(luò)即時(shí)聊天功能。在建立這個(gè)系統(tǒng)的過(guò)程中,我將會(huì)研究JAVA語(yǔ)言,多線程編程、網(wǎng)絡(luò)編程以及數(shù)據(jù)據(jù)等方面的知識(shí)。 在我的論文中,我將會(huì)研究即時(shí)消息的發(fā)展,并針對(duì)不同即時(shí)消息工具之間不能互通的弊端,介紹即時(shí)消息系統(tǒng)中的應(yīng)用。為了更好地實(shí)現(xiàn)系統(tǒng),我們還要研究J2SE 技術(shù)。在論文中介紹了 J2SE 的體系結(jié)構(gòu)、
6、系統(tǒng)設(shè)計(jì)以及 J2SE 的開(kāi)發(fā)環(huán)境。熟悉了開(kāi)發(fā)平臺(tái),我們還要了解 基于TCP/IP 的 Socket 網(wǎng)絡(luò)連接的基礎(chǔ)知識(shí),包括網(wǎng)絡(luò)通信系統(tǒng)架構(gòu)及 Socket 通信在該系統(tǒng)中的應(yīng)用等內(nèi)容。在論文中將著重介紹網(wǎng)絡(luò)即時(shí)消息系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),包括界面及各個(gè)功能模塊的設(shè)計(jì),給出了相應(yīng)的流程圖并對(duì)其功能做了詳細(xì)描述,最終實(shí)現(xiàn)了客戶(hù)端之間的即時(shí)聊天通信功能。最后是結(jié)尾部分,對(duì)本文做了總結(jié)并針對(duì)該系統(tǒng)提出了一些不足和今后需要改進(jìn)的地方。 1.2 技術(shù)背景 1.2.1 C/S 模型 在網(wǎng)絡(luò)連接模式中,除對(duì)等網(wǎng)外,還有另一種形式的網(wǎng)絡(luò),即客戶(hù)機(jī)/服務(wù)器網(wǎng)[3],Client/Server。在客戶(hù)機(jī)
7、/服務(wù)器網(wǎng)絡(luò)中,服務(wù)器是網(wǎng)絡(luò)的核心,而客戶(hù)機(jī)是網(wǎng)絡(luò)的基礎(chǔ),客戶(hù)機(jī)依靠服務(wù)器獲得所需要的網(wǎng)絡(luò)資源,而服務(wù)器為客戶(hù)機(jī)提供網(wǎng)絡(luò)必須的資源。 這里客戶(hù)和服務(wù)器都是指通信中所涉及的兩個(gè)應(yīng)用進(jìn)程(軟件)。使用計(jì)算機(jī)的人是計(jì)算機(jī)的“用戶(hù)”(user)而不是“客戶(hù)”(client)。但在許多國(guó)外文獻(xiàn)中,也經(jīng)常把運(yùn)行客戶(hù)程序的機(jī)器稱(chēng)為client(這種情況下也可把client譯為“客戶(hù)機(jī)”),把運(yùn)行服務(wù)器程序的機(jī)器稱(chēng)為server。所以有時(shí)要根據(jù)上下文判斷client與server是指軟件還是硬件。 它是軟件系統(tǒng)體系結(jié)構(gòu),通過(guò)它可以充分利用兩端硬件環(huán)境的優(yōu)勢(shì),將任務(wù)合理分配到 Client端和Server端
8、來(lái)實(shí)現(xiàn),降低了系統(tǒng)的通訊開(kāi)銷(xiāo)。目前大多數(shù)應(yīng)用軟件系統(tǒng)都是Client/Server形式的兩層結(jié)構(gòu),由于現(xiàn)在的軟件應(yīng)用系統(tǒng)正在向分布式的Web應(yīng)用發(fā)展,Web和Client/Server 應(yīng)用都可以進(jìn)行同樣的業(yè)務(wù)處理,應(yīng)用不同的模塊共享邏輯組件;因此,內(nèi)部的和外部的用戶(hù)都可以訪問(wèn)新的和現(xiàn)有的應(yīng)用系統(tǒng),通過(guò)現(xiàn)有應(yīng)用系統(tǒng)中的邏輯可以擴(kuò)展出新的應(yīng)用系統(tǒng)。這也就是目前應(yīng)用系統(tǒng)的發(fā)展方向。 1.2.2 TCP/IP 協(xié)議 1. IP 網(wǎng)際協(xié)議IP是TCP/IP的心臟,也是網(wǎng)絡(luò)層中最重要的協(xié)議[4]。 IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動(dòng)程序)發(fā)來(lái)的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---
9、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ī)的地址(目的地址)。 高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時(shí),通常假設(shè)包中的源地址是有效的。也可以這樣說(shuō),IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ),這些服務(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包好像是從路徑上的最后
10、一個(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ì)被非法入侵。 2. TCP 如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包[5],那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進(jìn)行錯(cuò)誤檢查,同時(shí)實(shí)現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號(hào)和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。 TCP將它的信息送到更高層的應(yīng)用程序,例如Telnet的服務(wù)程序和客戶(hù)程序。應(yīng)用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設(shè)備驅(qū)動(dòng)程序
11、和物理介質(zhì),最后到接收方。 面向連接的服務(wù)(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫(kù)),但使用UDP傳送有關(guān)單個(gè)主機(jī)的信息。 3. UDP UDP與TCP位于同一層,但它不管數(shù)據(jù)包的順序、錯(cuò)誤或重發(fā)。因此,UDP不被應(yīng)用于那些使用虛電路的面向連接的服務(wù),UDP主要用于那些面向查詢(xún)---應(yīng)答的服務(wù),例如NFS。相對(duì)于FTP或Telnet,這些服務(wù)需要交換的信息量較小。使用UDP的服務(wù)包括NTP(網(wǎng)絡(luò)時(shí)間協(xié)議)和DNS(DNS也使用TCP)。 欺騙UDP包比欺騙TCP包
12、更容易,因?yàn)閁DP沒(méi)有建立初始化連接(也可以稱(chēng)為握手)(因?yàn)樵趦蓚€(gè)系統(tǒng)間沒(méi)有虛電路),也就是說(shuō),與UDP相關(guān)的服務(wù)面臨著更大的危險(xiǎn)。 4. TCP與UDP的端口結(jié)構(gòu) TCP和UDP服務(wù)通常有一個(gè)客戶(hù)/服務(wù)器的關(guān)系,例如,一個(gè)Telnet服務(wù)進(jìn)程開(kāi)始在系統(tǒng)上處于空閑狀態(tài),等待著連接。用戶(hù)使用Telnet客戶(hù)程序與服務(wù)進(jìn)程建立一個(gè)連接??蛻?hù)程序向服務(wù)進(jìn)程寫(xiě)入信息,服務(wù)進(jìn)程讀出信息并發(fā)出響應(yīng),客戶(hù)程序讀出響應(yīng)并向用戶(hù)報(bào)告。因而,這個(gè)連接是雙工的,可以用來(lái)進(jìn)行讀寫(xiě)。 兩個(gè)系統(tǒng)間的多重Telnet連接是如何相互確認(rèn)并協(xié)調(diào)一致呢?TCP或UDP連接唯一地使用每個(gè)信息中的如下四項(xiàng)進(jìn)行確認(rèn): l
13、 源IP地址: 發(fā)送包的IP地址; l 目的IP地址: 接收包的IP地址; l 源端口: 源系統(tǒng)上的連接的端口; l 目的端口: 目的系統(tǒng)上的連接的端口。 端口是一個(gè)軟件結(jié)構(gòu),被客戶(hù)程序或服務(wù)進(jìn)程用來(lái)發(fā)送和接收信息。一個(gè)端口對(duì)應(yīng)一個(gè)16比特的數(shù)。服務(wù)進(jìn)程通常使用一個(gè)固定的端口,例如,SMTP使用25、Xwindows使用6000。這些端口號(hào)是‘廣為人知’的,因?yàn)樵诮⑴c特定的主機(jī)或服務(wù)的連接時(shí),需要這些地址和目的地址進(jìn)行通訊 1.2.3編程技術(shù) 1.JAVA語(yǔ)言 Java[6]是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱(chēng)Ja
14、va語(yǔ)言)和Java平臺(tái)的總稱(chēng)。用Java實(shí)現(xiàn)的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺(tái)、動(dòng)態(tài)的Web、Internet計(jì)算。從此,Java被廣泛接受并推動(dòng)了Web的迅速發(fā)展,常用的瀏覽器現(xiàn)在均支持Java applet。另一方面,Java技術(shù)也不斷更新。 Java語(yǔ)言的優(yōu)良特性使得Java應(yīng)用具有無(wú)比的健壯性和可靠性,這也減少了應(yīng)用系統(tǒng)的維護(hù)費(fèi)用。Java對(duì)對(duì)象技術(shù)的全面支持和Java平臺(tái)內(nèi)嵌的API[7]能縮短應(yīng)用系統(tǒng)的開(kāi)發(fā)時(shí)間并降低成本。Java的編譯一次,到處可運(yùn)行的特性使得它能夠提供一個(gè)隨處可用的開(kāi)放結(jié)構(gòu)和在多平臺(tái)之間傳遞信息的低成本方式。特
15、別是Java企業(yè)應(yīng)用編程接口(Java Enterprise APIs)為企業(yè)計(jì)算及電子商務(wù)應(yīng)用系統(tǒng)提供了有關(guān)技術(shù)和豐富的類(lèi)庫(kù)。 2. Winsock Windows下網(wǎng)絡(luò)編程的規(guī)范-Windows Sockets是Windows下得到廣泛應(yīng)用的、開(kāi)放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口。 通信的基礎(chǔ)是套接口(Socket),一個(gè)套接口是通訊的一端。在這一端上你可以找到與其對(duì)應(yīng)的一個(gè)名字。一個(gè)正在被使用的套接口都有它的類(lèi)型和與其相關(guān)的進(jìn)程。套接口存在于通訊域中。通訊域是為了處理一般的線程通過(guò)套接口通訊而引進(jìn)的一種抽象概念。 在一次網(wǎng)絡(luò)通信/連接中有以下幾個(gè)參數(shù)需要被設(shè)置:本地IP地址 - 本
16、地端口號(hào) - 對(duì)方端口號(hào) - 對(duì)方IP地址。左邊兩部分稱(chēng)為一個(gè)半關(guān)聯(lián),當(dāng)與右邊兩部分建立連接后就稱(chēng)為一個(gè)全關(guān)聯(lián)。在這個(gè)全關(guān)聯(lián)的套接口上可以雙向的交換數(shù)據(jù)。如果是使用無(wú)連接的通信則只需要建立一個(gè)半關(guān)聯(lián),在發(fā)送和接收時(shí)指明另一半的參數(shù)就可以了,所以可以說(shuō)無(wú)連接的通信是將數(shù)據(jù)發(fā)送到另一臺(tái)主機(jī)的指定端口。此外不論是有連接還是無(wú)連接的通信都不需要雙方的端口號(hào)相同。Socket 接口是訪問(wèn) Internet 使用得最廣泛的方法。 3.多線程編程 多線程[8]是為了使得多個(gè)線程并行的工作以完成多項(xiàng)任務(wù),以提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候被實(shí)現(xiàn)的。 使用線程的好處有以下幾點(diǎn):
17、 使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理 用戶(hù)界面可以更加吸引人,這樣比如用戶(hù)點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來(lái)顯示處理的進(jìn)度 程序的運(yùn)行速度可能加快 在一些等待的任務(wù)實(shí)現(xiàn)上如用戶(hù)輸入、文件讀寫(xiě)和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下我們可以釋放一些珍貴的資源如內(nèi)存占用等等。 多線程在JAVA里面的應(yīng)用也是很廣泛。Java對(duì)多線程的支持是非常強(qiáng)大的,他屏蔽掉了許多的技術(shù)細(xì)節(jié),讓我們可以輕松的開(kāi)發(fā)多線程的應(yīng)用程序。 1.2.4開(kāi)發(fā)平臺(tái) 1. J2SE平臺(tái) Java2平臺(tái)包括:標(biāo)準(zhǔn)版(J2SE)、企業(yè)版(J2EE)和微縮版(J
18、2ME)三個(gè)版本。J2SE,J2ME和J2EE,這也就是SunONE(Open NetEnvironment)體系。J2SE就是Java2的標(biāo)準(zhǔn)版,主要用于桌面應(yīng)用軟件的編程;J2ME主要應(yīng)用于嵌入是系統(tǒng)開(kāi)發(fā),如手機(jī)和PDA的編程;J2EE是Java2的企業(yè)版,主要用于分布式的網(wǎng)絡(luò)程序的開(kāi)發(fā),如電子商務(wù)網(wǎng)站和ERP系統(tǒng)。 Standard Edition(標(biāo)準(zhǔn)版) J2SE 包含那些構(gòu)成Java語(yǔ)言核心的類(lèi)。比如:數(shù)據(jù)庫(kù)連接、接口定義、輸入/輸出、網(wǎng)絡(luò)編程定位在客戶(hù)端,主要用于桌面應(yīng)用軟件的編程。J2SE 包含那些構(gòu)成Java語(yǔ)言核心的類(lèi)。 比如:數(shù)據(jù)庫(kù)連接、接口定義、輸入/輸出、網(wǎng)絡(luò)編程
19、 2. MYSQL數(shù)據(jù)庫(kù) MYSQL [9]的特性MYSQL 的特性包括: Internet 集成。 SQL Server 2000 數(shù)據(jù)庫(kù)引擎提供完整的 XML 支持。它還具有構(gòu)成最大的 Web 站點(diǎn)的數(shù)據(jù)存儲(chǔ)組件所需的可伸縮性、可用性和安全功能。MYSQL 程序設(shè)計(jì)模型與 Windows DNA 構(gòu)架集成,用以開(kāi)發(fā) Web 應(yīng)用程序,并且 MYSQL 支持 English Query 和 Microsoft 搜索服務(wù)等功能,在 Web 應(yīng)用程序中包含了用戶(hù)友好的查詢(xún)和強(qiáng)大的搜索功能。 可伸縮性和可用性。 同一個(gè)數(shù)據(jù)庫(kù)引擎可以在不同的平臺(tái)上使用,從運(yùn)行 Microsoft Windo
20、ws 98 的便攜式電腦,到運(yùn)行 MYSQL 數(shù)據(jù)中心版的大型多處理器服務(wù)器。MYSQL 企業(yè)版支持聯(lián)合服務(wù)器、索引視圖和大型內(nèi)存支持等功能,使其得以升級(jí)到最大 Web 站點(diǎn)所需的性能級(jí)別。 企業(yè)級(jí)數(shù)據(jù)庫(kù)功能。 MYSQL 關(guān)系數(shù)據(jù)庫(kù)引擎支持當(dāng)今苛刻的數(shù)據(jù)處理環(huán)境所需的功能。數(shù)據(jù)庫(kù)引擎充分保護(hù)數(shù)據(jù)完整性,同時(shí)將管理上千個(gè)并發(fā)修改數(shù)據(jù)庫(kù)的用戶(hù)的開(kāi)銷(xiāo)減到最小。MYSQL 分布式查詢(xún)使您得以引用來(lái)自不同數(shù)據(jù)源的數(shù)據(jù),就好象這些數(shù)據(jù)是 MYSQL 數(shù)據(jù)庫(kù)的一部分,同時(shí)分布式事務(wù)支持充分保護(hù)任何分布式數(shù)據(jù)更新的完整性。復(fù)制同樣使您得以維護(hù)多個(gè)數(shù)據(jù)復(fù)本,同時(shí)確保單獨(dú)的數(shù)據(jù)復(fù)本保持同步。可將一組數(shù)據(jù)復(fù)制到
21、多個(gè)移動(dòng)的脫接用戶(hù),使這些用戶(hù)自主地工作,然后將他們所做的修改合并回發(fā)布服務(wù)器。 易于安裝、部署和使用。 MYSQL 中包括一系列管理和開(kāi)發(fā)工具,這些工具可改進(jìn)在多個(gè)站點(diǎn)上安裝、部署、管理和使用 SQL Server 的過(guò)程。MYSQL 還支持基于標(biāo)準(zhǔn)的、與 Windows DNA 集成的程序設(shè)計(jì)模型,使 MYSQL 數(shù)據(jù)庫(kù)和數(shù)據(jù)倉(cāng)庫(kù)的使用成為生成強(qiáng)大的可伸縮系統(tǒng)的無(wú)縫部分。這些功能使您得以快速交付 MYSQL 應(yīng)用程序,使客戶(hù)只需最少的安裝和管理開(kāi)銷(xiāo)即可實(shí)現(xiàn)這些應(yīng)用程序。 系統(tǒng)分析與設(shè)計(jì) 2.1 需求分析
22、 此次開(kāi)發(fā)的網(wǎng)絡(luò)聊天工具可作為個(gè)人的交流工具使用,通信的安全性不是很高,但要求信息的響應(yīng)速度要較快,讓用戶(hù)充分享受到網(wǎng)絡(luò)即時(shí)消息的方便和快捷。本聊天工具由服務(wù)器端程序和客戶(hù)端程序兩部分組成,整體采用JAVA平臺(tái)開(kāi)發(fā),并使用MYSQL管理數(shù)據(jù)庫(kù)數(shù)據(jù)。服務(wù)器是可以監(jiān)聽(tīng)和查看用戶(hù)的基本操作;客戶(hù)端程序面向?qū)嶋H用戶(hù),它有必要的界面的按鈕,向用戶(hù)提供網(wǎng)絡(luò)即時(shí)消息的功能: 本聊天需包含如下基本功能: 1.客戶(hù)端: (1)新用戶(hù)注冊(cè); (2)用戶(hù)登錄驗(yàn)證; (3)獲取好友列表并顯示好友狀態(tài)(在線/不在線); (4)添加用戶(hù)好友; (5)刪除用戶(hù)好友; (6)用戶(hù)與好友聊天(可查看聊天記錄
23、); (7)接收系統(tǒng)信息。 2.服務(wù)端: (1)啟動(dòng)和關(guān)閉后臺(tái)服務(wù)器; (2)查看客戶(hù)端登錄的相關(guān)信息(客戶(hù)端登陸時(shí)間/登陸IP); (3) 向所有在線用戶(hù)發(fā)送系統(tǒng)消息。 2.2系統(tǒng)總體框架 2.2.1總體設(shè)計(jì) 網(wǎng)絡(luò)即時(shí)通訊系統(tǒng)采用客戶(hù)機(jī)/服務(wù)器(C/S)的模式來(lái)設(shè)計(jì),是一個(gè)3層的C/S結(jié)構(gòu):數(shù)據(jù)庫(kù)服務(wù)器->應(yīng)用程序服務(wù)器端->應(yīng)用程序客戶(hù)端。系統(tǒng)采用C/S結(jié)構(gòu),可以將任務(wù)合理分配到客戶(hù)機(jī)端和服務(wù)器端,從而降低了系統(tǒng)的通信開(kāi)銷(xiāo),如圖3.1所示: 圖3.1 C/S體系結(jié)構(gòu) 1. 客戶(hù)層 客戶(hù)層也叫應(yīng)用層,是應(yīng)用程序的用戶(hù)接口部分。給聊天工具設(shè)計(jì)一個(gè)客戶(hù)層具
24、有很多優(yōu)點(diǎn),這是因?yàn)榭蛻?hù)層擔(dān)負(fù)著用戶(hù)與應(yīng)用間的對(duì)話(huà)功能。它用于檢查用戶(hù)的輸入數(shù)據(jù),顯示應(yīng)用的輸出數(shù)據(jù)。為了使用戶(hù)能直觀地進(jìn)行操作,客戶(hù)層需要合作圖形用戶(hù)接口。若聊天用戶(hù)變更,系統(tǒng)只需要改寫(xiě)顯示控制和數(shù)據(jù)檢查程序即可,而不影響其他兩層。數(shù)據(jù)檢查的內(nèi)容限于數(shù)據(jù)的形式和值的范圍,不包括有關(guān)業(yè)務(wù)本身的處理邏輯。 2.服務(wù)層 服務(wù)層也叫功能層,相當(dāng)于應(yīng)用的本體,它是將具體的業(yè)務(wù)處理邏輯編入程序中。例如,用戶(hù)需要檢索數(shù)據(jù),系統(tǒng)設(shè)法將有關(guān)檢索要求的信息一次性地傳送給功能層;而用戶(hù)登錄后,聊天登錄信息是由功能層處理過(guò)的檢索結(jié)果數(shù)據(jù),它也是一次性傳送給表示層的。在應(yīng)用設(shè)計(jì)中,必須避免表示層和功能層之間進(jìn)行多
25、次的數(shù)據(jù)交換,這就需要盡可能進(jìn)行一次性的業(yè)務(wù)處理,達(dá)到優(yōu)化整體設(shè)計(jì)的目的。 3. 數(shù)據(jù)層 據(jù)層就是DBMS,本系統(tǒng)使用了Microsoft公司的SQL Server 2000數(shù)據(jù)庫(kù)服務(wù)器來(lái)管理數(shù)據(jù)。MYSQL能迅速執(zhí)行大量數(shù)據(jù)的更新和檢索。因此,從功能層傳送到數(shù)據(jù)層的“要求”一般都使用SQL語(yǔ)言。 2.2.2功能模塊 聊天工具按如下過(guò)程完成通信: l 客戶(hù)向服務(wù)器注冊(cè),告知服務(wù)器它在監(jiān)聽(tīng)某主題; l 客戶(hù)注冊(cè)之后,向服務(wù)器發(fā)送消息; l 服務(wù)器再把消息發(fā)送給所有監(jiān)聽(tīng)些主題的客戶(hù)。 聊天工具由服務(wù)器端和客戶(hù)端組成,要分析清楚兩方面所要完成的任務(wù),對(duì)設(shè)計(jì)來(lái)說(shuō),等于完成了一半。根據(jù)聊
26、天的通信步驟,系統(tǒng)的功能模塊如圖3.2所示: 即時(shí)消息系統(tǒng) 服務(wù)器端 客戶(hù)端 后臺(tái)操作 建立連接. 監(jiān)聽(tīng)客戶(hù)請(qǐng)求 用戶(hù)登錄消息 用戶(hù)管理 好友管理 聊天功能 用戶(hù)登錄 用戶(hù)注冊(cè) 查找好友 添加好友 刪除好友 發(fā)送消息 接收消息 聊天記錄 數(shù)據(jù)庫(kù)操作 發(fā)送系統(tǒng)消息 消息管理 圖3.2 功能模塊 1.服務(wù)器端 服務(wù)器完成5大功能:建立連接、監(jiān)聽(tīng)客戶(hù)請(qǐng)求、操作數(shù)據(jù)庫(kù)、查看用戶(hù)登錄消息和發(fā)送系統(tǒng)消息這5大功能的具體含義如下: l 建立連接:系統(tǒng)啟動(dòng)時(shí)建立一個(gè)S
27、erverSocket連接,綁定本地計(jì)算機(jī)的一個(gè)端口,不斷偵聽(tīng)是否有客戶(hù)端連接或者斷開(kāi)連接。 l 監(jiān)聽(tīng)客戶(hù)請(qǐng)求:服務(wù)器端是一個(gè)信息的樞紐,所有客戶(hù)端的信息都要傳到服務(wù)器端,再由服務(wù)器根據(jù)要求分發(fā)出去,客戶(hù)端在向服務(wù)器發(fā)送各種請(qǐng)求,如:上線、隱身、獲取我的好友、查找好友等等。 l 數(shù)據(jù)庫(kù)操作:當(dāng)客戶(hù)機(jī)向服務(wù)器發(fā)送請(qǐng)求時(shí),服務(wù)器需要通過(guò)數(shù)據(jù)庫(kù)管理軟件對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行增、刪和查詢(xún)。如錄入用戶(hù)信息、修改用戶(hù)信息、查找好友數(shù)據(jù)庫(kù)的資料以及添加好友數(shù)據(jù)到數(shù)據(jù)庫(kù)等。 l 用戶(hù)登錄消息:在服務(wù)器端的界面上,我們可以看到用戶(hù)的登錄消息,包括IP地址、端口號(hào),登錄時(shí)間等。 l 發(fā)送系統(tǒng)消息:在客戶(hù)端管理
28、界面上,可以輸入消息,并發(fā)送給所有的在線用戶(hù)。 2.客戶(hù)端 客戶(hù)端完成3大功能:用戶(hù)管理、好友管理和聊天功能,這些功能的含義如下: l 用戶(hù)管理:此功能又包括2個(gè)子功能,用戶(hù)登錄和用戶(hù)注冊(cè)。客戶(hù)端與服務(wù)器端建立通信通道,向服務(wù)器發(fā)送新建用戶(hù)的信息,接收來(lái)自服務(wù)器聽(tīng)信息進(jìn)行注冊(cè)。注冊(cè)完畢后,可以通過(guò)系統(tǒng)的登錄界面,輸入賬號(hào)和密碼,然后發(fā)送到服務(wù)器進(jìn)行驗(yàn)證。如果驗(yàn)證通過(guò),則打開(kāi)程序的主界面。 l 好友管理:此功能又包括3個(gè)子功能,查找好友、添加好友和刪除好友。在程序的主界面,提供查找好友的功能。查找好友時(shí),客戶(hù)端向服務(wù)器發(fā)送查找好友請(qǐng)求,服務(wù)器端返回在線用戶(hù)的信息,此時(shí)我們可以通過(guò)此來(lái)進(jìn)行
29、添加好友,并跟好友通過(guò)通信連接。 l 聊天功能:客戶(hù)端在與好友端建立通信連接后,便可以與好友進(jìn)行聊天,聊天時(shí)發(fā)送的是文本信息,好友端在接收到聊天消息后,會(huì)提示收到消息,并由好友端自主打開(kāi)消息接收界面。所有的聊天消息都會(huì)被保存起來(lái),可以查看與每個(gè)好友的聊天記錄。聊天記錄包括內(nèi)容和時(shí)間。 2.3系統(tǒng)詳細(xì)設(shè)計(jì) 2.3.1多線程設(shè)計(jì) 1.服務(wù)器端的多線程 服務(wù)器需要和多個(gè)客戶(hù)端同時(shí)進(jìn)行通信,這就是服務(wù)器端的多線程。一旦服務(wù)器發(fā)現(xiàn)一個(gè)新的客戶(hù)端與之建立了連接,就馬上新建一個(gè)線程與客戶(hù)端進(jìn)行通信。用多線程的好處在于可以同時(shí)處理多個(gè)通信連接,不會(huì)出于由于數(shù)據(jù)排隊(duì)而發(fā)生的延遲或者丟失,可以很
30、好利用系統(tǒng)的性能。 服務(wù)器為每個(gè)連接著的客戶(hù)建立一個(gè)線程,為了同時(shí)響應(yīng)多個(gè)客戶(hù)端,需設(shè)計(jì)一個(gè)主線程來(lái)啟動(dòng)服務(wù)器端的多線程。主線程與進(jìn)程結(jié)構(gòu)類(lèi)似,它在獲得新連接時(shí)生成一個(gè)線程來(lái)處理這個(gè)這個(gè)連接。線程調(diào)度速度快,占用資源少,可共享進(jìn)程空間中的數(shù)據(jù),因此服務(wù)器的響應(yīng)速度較快,且I/O吞吐量較大。在程序的代碼里面,服務(wù)器端的多線程類(lèi)定義為: Class ServerThread extends Thread{//略}; 2.客戶(hù)端的多線程 客戶(hù)端能夠完成信息的接收和發(fā)送操作,這與服務(wù)器的多線程概念不同,可以采用循環(huán)等待的方法來(lái)實(shí)現(xiàn)客戶(hù)端。利用循環(huán)等待的方式,客戶(hù)端首先接收用戶(hù)輸入的內(nèi)容并將它們
31、發(fā)送到服務(wù)器端,然后接收來(lái)自服務(wù)器端的信息,將其返回給客戶(hù)端的用戶(hù)。在程序的代碼里面,客戶(hù)端的多線程定義為: class MainWin extends JFrame implements Runnable{//略}; 2.3.2數(shù)據(jù)庫(kù)設(shè)計(jì) 數(shù)據(jù)庫(kù)表主要用來(lái)存放用戶(hù)的注冊(cè)信息和用戶(hù)的好友資料,可利用兩張數(shù)據(jù)表用來(lái)存放用戶(hù)信息和用戶(hù)好友資料。在MYSQL 上新建名為javaicq的數(shù)據(jù)庫(kù),并建立兩張數(shù)據(jù)庫(kù)表:用戶(hù)的基本信息表(表名icq)和用戶(hù)好友數(shù)據(jù)庫(kù)表(表名friend). 1.icq表 icq表存放用戶(hù)信息,信息。利用MYSQL 2000建立數(shù)據(jù)表,如表3.1所示: 表3.1
32、 用戶(hù)信息表 字段 數(shù)據(jù)類(lèi)型 說(shuō)明 Ip int 用戶(hù)Ip Id char 用戶(hù)的賬號(hào) name char 用戶(hù)的昵稱(chēng) Ip bit 用戶(hù)ip 2.frind 表 friend 表的設(shè)計(jì)比較簡(jiǎn)單,本系統(tǒng)設(shè)計(jì)了用戶(hù)的號(hào)碼和好友的號(hào)碼兩個(gè)字段。利用SQL Server 2000建立如下數(shù)據(jù)表: 表 3.2 好友信息表 字段 數(shù)據(jù)類(lèi)型 說(shuō)明 ip char 用戶(hù)Ip id char 好友的賬號(hào) 2.3.3服務(wù)器的設(shè)計(jì) 1.主服務(wù)器類(lèi)的設(shè)計(jì) 主服務(wù)器實(shí)現(xiàn)了服務(wù)器的多線程,服務(wù)器端有一個(gè)進(jìn)程(或多個(gè)進(jìn)程)在指定的端口等待客戶(hù)的連接信息。一
33、時(shí)連接成功,就可以按設(shè)計(jì)的數(shù)據(jù)交換方法和格式進(jìn)行數(shù)據(jù)傳輸??蛻?hù)端只在需要的時(shí)候向服務(wù)端發(fā)出連接請(qǐng)求。主服務(wù)器類(lèi)調(diào)用ServerThread類(lèi),而每個(gè)ServerThread實(shí)體就是一個(gè)單獨(dú)的線程,即對(duì)應(yīng)于客戶(hù)端連接請(qǐng)求響應(yīng)的線程。它的執(zhí)行過(guò)程如下: l 使用ServerSocket s=new ServerSocket(8000)語(yǔ)句 綁定8000端口創(chuàng)建套接口 l 使用Socket=s.accept()來(lái)監(jiān)聽(tīng)用戶(hù)的請(qǐng)求 l 使用new ServerThread(socket)語(yǔ)句創(chuàng)建新的線程。 2.ServerThread類(lèi)的設(shè)計(jì) 客戶(hù)端發(fā)送連接請(qǐng)求的時(shí)候,服務(wù)器端創(chuàng)建一個(gè)Se
34、rverThread(socket)線程。ServerThread類(lèi)的函數(shù)執(zhí)行過(guò)程可描述如下: l 執(zhí)行ServerThreadz(Socket s)線程構(gòu)造函數(shù) l 執(zhí)行socket=s取得傳遞參數(shù); l BufferedReader(new InputStreamReader(socket.getInputStream()))創(chuàng)建輸入流; l 使用PrintWriter(new BufferedWriter( new OutputStreamWriter( socket.getOoutputStream)))創(chuàng)建輸出流; l 使用start()函數(shù)啟動(dòng)線程; l 最后使用run
35、()線程監(jiān)聽(tīng)函數(shù)。 3.登錄驗(yàn)證 (1)登錄線程 如果客戶(hù)端輸入的字符串“l(fā)ogin”,表示需要登錄,那么服務(wù)器在接收到該信息后連接數(shù)據(jù)庫(kù),準(zhǔn)備從數(shù)據(jù)庫(kù)選擇昵稱(chēng)和密碼。服務(wù)器接收到客戶(hù)端發(fā)送過(guò)來(lái)的號(hào)碼和密碼信息后,設(shè)定數(shù)據(jù)庫(kù)查尋條件,并執(zhí)行數(shù)據(jù)庫(kù)查尋,通過(guò)比較輸入的用戶(hù)名和密碼和數(shù)據(jù)庫(kù)信息來(lái)確定用戶(hù)的登錄是否成功,如果成功就,發(fā)送“ok”給客戶(hù)端,通知其進(jìn)入聊天主界面.反之發(fā)送“false”,提示用戶(hù)登錄失敗,如圖3.3所示: 客戶(hù)端 服務(wù)器端 Socket 讀取數(shù)據(jù)庫(kù),并驗(yàn)證賬號(hào)與密碼 發(fā)送:“l(fā)ogin” 接收:賬號(hào)和密碼 接收:“l(fā)ogi
36、n” 監(jiān)聽(tīng)用戶(hù)請(qǐng)求 發(fā)送:賬號(hào)和密碼 ServeSocket 接收:“ok” 發(fā)送:“ok” 打開(kāi)程序主界面 把IP地址和在線狀態(tài)錄入數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù) 結(jié)束 通知好友 圖3.3 登錄流程 (2)通知好友 通知好友也是在ServerThread類(lèi)的run()函數(shù)里面,當(dāng)某一用戶(hù)成功登錄后,發(fā)送“getwhoaddme”到服務(wù)器端,服務(wù)器端查找數(shù)據(jù)庫(kù)中的“friend”數(shù)據(jù)表,并把用戶(hù)的所有好友消息及在線狀態(tài)發(fā)送回客戶(hù)端,客戶(hù)端通過(guò)這些好友的消息,向在線的好友發(fā)送上線通知。 4.新建用戶(hù) 用戶(hù)新建過(guò)程也在線程監(jiān)聽(tīng)函
37、數(shù)run()中。當(dāng)服務(wù)器端收到客戶(hù)端發(fā)送的“new”請(qǐng)求時(shí),服務(wù)器端開(kāi)始進(jìn)行新建用戶(hù)操作。新建用戶(hù)的過(guò)程是這樣的:首先要使用權(quán)Class.forName方法加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi),該類(lèi)的描述是sun.jdbc.odbc.JdbcOdbcDriver;然后使用DriverManager.getConnection方法連接數(shù)據(jù),數(shù)據(jù)庫(kù)名為jdbc:odbc:javaicq;最后服務(wù)器接收客戶(hù)端用戶(hù)發(fā)送的昵稱(chēng)、密碼、用戶(hù)E-mail,個(gè)人資料、籍貫和頭像等信息,執(zhí)行數(shù)據(jù)庫(kù)添加操作完成用戶(hù)的創(chuàng)建。服務(wù)器為新建的用戶(hù)指定唯一的注冊(cè)號(hào)碼,將以即時(shí)消息的方法發(fā)送給用戶(hù)。 5.好友處理 (1)查找好友 當(dāng)客戶(hù)
38、端向服務(wù)器查找好友的請(qǐng)求后,服務(wù)器立即響應(yīng)并調(diào)Class.forName方法加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)sun.jdbc.odbc.JdbcOdbcDriver,然后調(diào)用方法DriverManager.getConnection完成數(shù)據(jù)庫(kù)的連接,得到用戶(hù)好友查詢(xún)的結(jié)果。查詢(xún)結(jié)果包括:好友的昵稱(chēng)、性別、性別、籍貫、個(gè)人資料等信息。服務(wù)器對(duì)數(shù)據(jù)庫(kù)聽(tīng)查詢(xún)結(jié)果進(jìn)行篩選,只向客戶(hù)端的用戶(hù)返回好友的注冊(cè)號(hào)碼、頭像信息號(hào)以及是否在線信息??蛻?hù)端接收到查詢(xún)結(jié)果后,利用相應(yīng)的函數(shù)將其顯示出來(lái)。 (2)添加好友 讀取資料功能是在查找好友功能基礎(chǔ)上建立的。用戶(hù)得到好友列表后,可根據(jù)需要讀取好友的詳細(xì)資料,也可讀取用戶(hù)自己的
39、詳細(xì)資料。服務(wù)器使用Vector矢量保存客戶(hù)端用戶(hù)的好友號(hào)碼,并返回好友的昵稱(chēng)、號(hào)碼、IP地址、狀態(tài)、頭像和個(gè)人資料等信息。 (3)添加好友 服務(wù)器響應(yīng)客戶(hù)端用戶(hù)的請(qǐng)求后,首先連接數(shù)據(jù)庫(kù),并根據(jù)接收的用戶(hù)號(hào)碼及好友號(hào)碼向好友表添加記錄。服務(wù)器使用r6保存查詢(xún)結(jié)果。若r6為1,則表明添加好友成功,服務(wù)器將給客戶(hù)端發(fā)出“ok addfriend”的消息;否則添加好友失敗,服務(wù)器將給客戶(hù)端發(fā)出“falseaddfriend”的消息。 (4)添加好友應(yīng)答 如果服務(wù)器收到其它用戶(hù)添加我為好友的請(qǐng)求后,連接數(shù)據(jù)庫(kù),根據(jù)接收用戶(hù)號(hào)碼及好友號(hào)碼向好友表添加記錄。若添加成功,則向用戶(hù)傳遞好友的基本信息,
40、比如昵稱(chēng)。服務(wù)器利用r5保存處理結(jié)果,并向客戶(hù)端輸出結(jié)果。 (5)刪除好友 當(dāng)服務(wù)器接受到客戶(hù)端刪除好友請(qǐng)求后,它連接數(shù)據(jù)庫(kù),并根據(jù)接收的用戶(hù)號(hào)碼及好友號(hào)碼表記錄刪除。服務(wù)器利用r7保存刪除結(jié)果,若r7為1,則刪除成功,服務(wù)器給客戶(hù)端發(fā)出“ok delfriend”的消息;否則刪除好友失敗,服務(wù)器給客戶(hù)端發(fā)出“false delfriend”的消息。 接收好友處理請(qǐng)求 addnewfriend delfriend Addfriend friend find 查找好友 讀取好友資料 添加好友 添加好友應(yīng)答 刪除
41、好友 Yes No Yes Yes Yes Yes No No No 返回 圖3.4 處理好友請(qǐng)求 6.退出下線 用戶(hù)在線時(shí),數(shù)據(jù)庫(kù)表的IP地址字段為此時(shí)用戶(hù)計(jì)算機(jī)的真實(shí)IP地址;狀態(tài)字段為1。若用戶(hù)退出下線,客戶(hù)端向服務(wù)器端發(fā)送“l(fā)ogout”,服務(wù)器接收到下線請(qǐng)求時(shí),需完成修改IP字段和狀態(tài)字段。服務(wù)器首先利用Class.forName方法加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)sun.jdbc.odbc.JdbcOdbcDriver;然后通過(guò)方法DriverManager.getConnection連接數(shù)據(jù)庫(kù)存;最后根據(jù)用戶(hù)號(hào)碼,將其狀態(tài)
42、字段設(shè)為0,IP地址字段設(shè)為空。 2.3.4客戶(hù)端的設(shè)計(jì) 客戶(hù)通過(guò)Socket與服務(wù)器建立連接。服務(wù)器與客戶(hù)都通過(guò)構(gòu)造BufferedReader、PrintWriter來(lái)建立輸入/輸出流,雙方通過(guò)該輸入/輸出流來(lái)相互傳遞信息。一旦收到客戶(hù)方的連接請(qǐng)求,服務(wù)器利用accept()函數(shù)返回一個(gè)新建的Socket對(duì)象,隨后客戶(hù)端向服務(wù)器發(fā)送消息,諸如注冊(cè)、登錄和查找好友等請(qǐng)求,服務(wù)器收到請(qǐng)求后,針對(duì)不同的消息處理請(qǐng)求。在這一過(guò)程中,服務(wù)器端與客戶(hù)端采用UDP協(xié)議通信。雖然UDP協(xié)議不可靠,但對(duì)于聊天工具而言,其可靠性并不太重要。 1.用戶(hù)注冊(cè) 當(dāng)服務(wù)器收到用戶(hù)的注冊(cè)請(qǐng)求后,開(kāi)始接收客戶(hù)傳遞
43、的消息,諸如客戶(hù)的昵稱(chēng)、性別、籍貫、頭像和個(gè)人資料等信息。接收完畢后,服務(wù)器便通過(guò)JdbcOdbc與后臺(tái)數(shù)據(jù)庫(kù)連接,向數(shù)據(jù)庫(kù)添加記錄。 若新用戶(hù)注冊(cè),則向客戶(hù)返回號(hào)碼,并在數(shù)據(jù)庫(kù)中注冊(cè)用戶(hù)的IP地址,設(shè)定Status值告知用戶(hù)在線??蛻?hù)收到服務(wù)器返回的消息后,打開(kāi)主程序窗口,同時(shí)創(chuàng)建UDP以便在用戶(hù)之間建立聯(lián)系。注冊(cè)通信過(guò)程如圖3.5所示: Socket 接收完畢 發(fā)送:“new” 發(fā)送完畢 接收:注冊(cè)信息 接收:“new” 監(jiān)聽(tīng)用戶(hù)請(qǐng)求 發(fā)送:注冊(cè)信息 ServeSocket 接收:賬號(hào) 輸出:賬號(hào) 打開(kāi)登錄界面
44、 結(jié)束 數(shù)據(jù)庫(kù) 操作 客戶(hù)端正 服務(wù)器端 圖3.5 注冊(cè)流程 2.用戶(hù)登錄 用戶(hù)在客戶(hù)端程序中輸入用戶(hù)號(hào)碼與密碼,與服務(wù)器建立連接,向服務(wù)器發(fā)送登錄請(qǐng)求。服務(wù)器收到該請(qǐng)求后,通過(guò)JdbcOdbc讀取數(shù)據(jù)庫(kù),與用戶(hù)輸入的消息做比較:若用戶(hù)輸入的信息與數(shù)據(jù)庫(kù)信息相同,則服務(wù)器向客戶(hù)返回成功消息,將其Status字段設(shè)為1,并注冊(cè)用戶(hù)當(dāng)前的IP地址;否則服務(wù)器向客戶(hù)返回失敗消息??蛻?hù)端收到服務(wù)器的成功確認(rèn)后,打開(kāi)聊天主窗口;否則彈出失敗信息??蛻?hù)端事件驅(qū)動(dòng)與服務(wù)器端的事件監(jiān)聽(tīng)相對(duì)應(yīng)。 3.服務(wù)器連接 服務(wù)器連接是在ConnectServer()函數(shù)中實(shí)現(xiàn)
45、的。本函數(shù)用到了具有連接性、有序性特點(diǎn)的流,根據(jù)服務(wù)器的IP地址和端口來(lái)完成客戶(hù)端與服務(wù)器的連接。IP地址是網(wǎng)絡(luò)中唯一地址的標(biāo)識(shí)。服務(wù)器連接過(guò)程分服務(wù)器端與客戶(hù)端兩部分,執(zhí)行流程如下: (1)服務(wù)器程序流程 l 程序初始化; l 填寫(xiě)本機(jī)地址信息; l 綁定并監(jiān)聽(tīng)一個(gè)固定的端口; l 收到Client的連接后建立一個(gè)Socket連接; l 產(chǎn)生一個(gè)新的進(jìn)程與Client進(jìn)行通信和信息處理; l 子通信結(jié)束后中斷與Client的連接。 (2)客戶(hù)端程序流程: l 程序初始化; l 填寫(xiě)服務(wù)器地址消息; l 連接服務(wù)器; l 與服務(wù)器通信和信息處理; l 通信結(jié)束后斷開(kāi)連
46、接。 4.主程序設(shè)計(jì) 用戶(hù)完成登錄后, 客戶(hù)端與服務(wù)器端建立連接。連接建立成功后,客戶(hù)向服務(wù)器請(qǐng)求讀取好友名單;服務(wù)器收到該請(qǐng)求,開(kāi)始讀取數(shù)據(jù)庫(kù)中的friend表并得到好友的號(hào)碼,再通過(guò)jcq表讀取好友資料,向客戶(hù)端發(fā)送這些信息;客戶(hù)收到服務(wù)器消息后,在主窗口顯示好友??蛻?hù)端還建立矢量來(lái)存儲(chǔ)好友的昵稱(chēng)、號(hào)碼,頭像編號(hào)和IP地址等信息。 5.好友管理 (1)查找好友 好友查找可利用FindFriend2 類(lèi)完成,F(xiàn)indFriend2類(lèi)繼承自JFrame類(lèi)。FindFriend2中定義的界面控件包括:好友的昵稱(chēng)、性別、住址、Jicq號(hào)碼、IP地址、在線狀態(tài)、頭像、電子郵件和個(gè)人留言等信
47、息。 查找好友所需的網(wǎng)絡(luò)變量定義如下: Socket socket: 連接socket BufferedReader in;讀入緩沖區(qū) PrintWriter out;輸入緩沖區(qū) int myid;用戶(hù)的號(hào)碼 String serverhost:發(fā)送端的主機(jī)地址 int servport:服務(wù)端的主機(jī)地址 DatagramPacket sendPacket:存儲(chǔ)發(fā)送信息的發(fā)送數(shù)據(jù)報(bào) DatagramSocket sendSocket:存儲(chǔ)接收信息的接收數(shù)據(jù)報(bào) int sendPort:發(fā)送的端口號(hào) (2)添加好友 用戶(hù)添加好友是聊天工具的基本功能之一。添加好友的基本步驟
48、如下: 用戶(hù)A登錄后,向服務(wù)器發(fā)送查找請(qǐng)求,服務(wù)器響應(yīng)并讀取數(shù)據(jù)庫(kù)表icq,將結(jié)果返回給用戶(hù); 用戶(hù)在收到查詢(xún)結(jié)果后選擇用戶(hù)B,向服務(wù)器發(fā)送添加好友請(qǐng)求,服務(wù)器收到請(qǐng)求響應(yīng),更新數(shù)據(jù)表frriend,并從icq表中讀取好友基本信息,將信息返回給用戶(hù)A; 用戶(hù)A的客戶(hù)端主窗口顯示用戶(hù)B,并通過(guò)UDP通知用戶(hù)B; 用戶(hù)B收到服務(wù)器的確認(rèn)消息,可決定是否添加用戶(hù)A為好友。 (3)刪除好友 用戶(hù)可以刪除好友列表中指定的好友,客戶(hù)端確認(rèn)用戶(hù)操作后向服務(wù)器發(fā)送刪除請(qǐng)求,服務(wù)器收到該請(qǐng)求,連接數(shù)據(jù)庫(kù)表friend并刪除用戶(hù)及該好友的記錄。若刪除成功,則向客戶(hù)端返回成功消息,通知用戶(hù)。 2.3.
49、5消息通信的設(shè)計(jì) 消息的發(fā)送主要是通過(guò)數(shù)據(jù)報(bào)服務(wù)來(lái)實(shí)現(xiàn)的。JAVA實(shí)現(xiàn)數(shù)據(jù)報(bào)通信的過(guò)程除面向連接的Socket外,還有無(wú)連接的數(shù)據(jù)報(bào)Socket。數(shù)據(jù)報(bào)是網(wǎng)絡(luò)層數(shù)據(jù)單元在介質(zhì)上傳輸信息的邏輯分組格式,它是是一種在網(wǎng)絡(luò)中傳播的、獨(dú)立的自身包含地址信息的消息,它能否到過(guò)目的地,到過(guò)的時(shí)間,到過(guò)內(nèi)容是否變化是不能準(zhǔn)確知道的。數(shù)據(jù)報(bào)的通信雙方不需要建立連接,對(duì)于像聊天通信這些不需要很高質(zhì)量的應(yīng)用程序來(lái)說(shuō),數(shù)據(jù)報(bào)通信是一個(gè)非常好的選擇。 1、使用數(shù)據(jù)報(bào) 在java的包中有兩個(gè)類(lèi)DatagramSocket和DatagramPacket,它們?yōu)閼?yīng)用程序采用數(shù)據(jù)報(bào)通信方式進(jìn)行網(wǎng)絡(luò)通信提供了支持。其定義
50、定義如下: DatagramPacket sendPacket,receivePacket; DatagramSocket sendSocket,receiveSocket; int udpPORT=5001; int sendPort=5000; sendSocket=new DatagramSocket(); receiveSocket=new DatagramSocket(udpPORT); 2、發(fā)送消息 用戶(hù)通過(guò)好友列表中好友的IP地址,利用UDP協(xié)議與其他用戶(hù)進(jìn)行信息交流。消息發(fā)送之前先創(chuàng)建一個(gè)數(shù)據(jù)報(bào)文包,用來(lái)實(shí)現(xiàn)無(wú)連接的包傳送服務(wù)。每個(gè)數(shù)據(jù)報(bào)文包是用Datagra
51、mPacket類(lèi)來(lái)創(chuàng)建的,DatagramPacket對(duì)象封裝了數(shù)據(jù)報(bào)包數(shù)據(jù)、包長(zhǎng)度、目標(biāo)地址和目標(biāo)端口。若客戶(hù)端發(fā)送數(shù)據(jù)包,則構(gòu)造函數(shù)創(chuàng)建DatagramPacket對(duì)象,將需要發(fā)送的數(shù)據(jù)和包文目的地址信息放入對(duì)象之中。 在發(fā)送的過(guò)程中利用構(gòu)造函數(shù)DatagramPacket(byte bufferedarray[],int length,InetAddressaddress,int port)構(gòu)造一個(gè)包長(zhǎng)度為length的包,它是將數(shù)據(jù)傳送到指定端口號(hào)上的數(shù)據(jù)包,參數(shù)length必須小于等于bufferedarry.length.消息發(fā)送是通過(guò)調(diào)用DatagramPacket對(duì)象中有se
52、nd方法實(shí)現(xiàn)的,它需要以DatagramPacket對(duì)象為參數(shù),將剛才封裝進(jìn)DatagramPacket對(duì)象中的數(shù)據(jù)組成數(shù)據(jù)報(bào)發(fā)出。 發(fā)送數(shù)據(jù)報(bào)文包的部分代碼如下: sendPacket=newDatagramPacket(data,data.length,InetAddress.getByName(theip.trim()),sendPort); sendSocket.send(sendPacket);} /*data為數(shù)據(jù)報(bào)文包,data.length為數(shù)據(jù)報(bào)文包的長(zhǎng)度InetAddress.getByName(theip.trim()為獲取接收者的IP地址; sendPort為
53、數(shù)據(jù)報(bào)文包接收者的接收端口。*/ 發(fā)送消息流程如下圖所示: 從輸入消息對(duì)話(huà)框讀取信息 獲取好友的IP地址 在線不? 發(fā)送消息 結(jié)束 是 否 保存聊天記錄 圖3.6 發(fā)送消息 3.監(jiān)聽(tīng)好友的消息 為了監(jiān)聽(tīng)好友的消息,系統(tǒng)首先定義一個(gè)數(shù)組,該數(shù)組用于接收用戶(hù)消息中的數(shù)據(jù);然后創(chuàng)建數(shù)據(jù)報(bào),使用receiveSocket.recerive(receivePacket)函數(shù)等待并接收數(shù)據(jù)報(bào),取得數(shù)據(jù)報(bào)中的數(shù)據(jù)。 接收數(shù)據(jù)報(bào)文包的部分代碼如下: receivePacket=new DatagramPacket(array,array.
54、length); receiveSocket.receive(receivePacket); byte[] data=receivePacket.getData(); String infofromip= receivePacket.getAddress().getHostAddress(). toString().trim(); received=new String(data,0,data.length); /*其中receivePacket用來(lái)接收其它客戶(hù)端發(fā)送過(guò)來(lái)的數(shù)據(jù)報(bào)文包;data用來(lái)儲(chǔ)存數(shù)據(jù)報(bào)文包的數(shù)據(jù);infofromip用來(lái)獲取數(shù)據(jù)報(bào)文包的發(fā)送地址;receive
55、d用于儲(chǔ)存二進(jìn)制類(lèi)型數(shù)據(jù)轉(zhuǎn)換為字符串類(lèi)型后數(shù)據(jù)。*/ 監(jiān)聽(tīng)好友消息的流程如圖3.7所示: 接收數(shù)據(jù)報(bào)信息 addnewfriend system oneaddyou offline oneline 好友上線 好友下線 添加好友應(yīng)答 添加好友應(yīng)答 接收系統(tǒng)消息 Yes No Yes Yes Yes Yes No No No 查找對(duì)應(yīng)好友及其登記IP IP存在 接收好友消息 接收陌生人消息 else 圖3.7
56、監(jiān)聽(tīng)好友消息 (1)當(dāng)接收好友消息時(shí),主程序彈出一個(gè)對(duì)話(huà)框,由用戶(hù)自行選擇接收信息與否,用戶(hù)可根據(jù)消息提示,打開(kāi)相應(yīng)好友的接收消息對(duì)話(huà)框來(lái)接收消息。 l DatagramPacket類(lèi)提供了4個(gè)函數(shù)來(lái)獲得消息: l Public bye[] getDate(): 返回一個(gè)字節(jié)數(shù)組,包含收到或要發(fā)送的數(shù)據(jù)報(bào)中的數(shù)據(jù); l Public int getLength(): 返回發(fā)送或收到的數(shù)據(jù)的長(zhǎng)度; l Public InetAddress getAddress(); 返回一個(gè)發(fā)送或接收此數(shù)據(jù)報(bào)報(bào)文的機(jī)器的IP地址; l Public int getPort(): 返回發(fā)送或接收數(shù)據(jù)報(bào)的遠(yuǎn)程主機(jī)的端口號(hào)。 接收消息的流程圖3.8所示: 監(jiān)聽(tīng)到好友發(fā)送過(guò)來(lái)的消息 打開(kāi)接收消息對(duì)話(huà)框,接收消息。 接收不? 保存聊天記錄 結(jié)束 是 否 圖3.8 接收消息 (2)上線和隱身 當(dāng)用戶(hù)想處于非聊天狀態(tài)的時(shí)候,可以切換至隱身狀態(tài)。這時(shí)候,用戶(hù)的客戶(hù)端會(huì)查找所有在線的好友,并發(fā)制作數(shù)據(jù)包,發(fā)送“隱身”要求給所有好友的客戶(hù)端。在好友的程序界面上,用戶(hù)的頭像由彩色變成黑白。此時(shí),所有好友都無(wú)法發(fā)送消息給此用戶(hù)。當(dāng)用戶(hù)想點(diǎn)擊程序界面的“上線”按鈕時(shí),既可通知所有的好友此用戶(hù)上線了。
- 溫馨提示:
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. 裝配圖網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 關(guān)于魯迅作品的幾點(diǎn)思考講解
- 神經(jīng)外科學(xué)專(zhuān)題知識(shí)講座
- 針刺鎮(zhèn)痛專(zhuān)題知識(shí)講座
- 大學(xué)論文答辯ppt通用模板課件
- 吳玉生漂亮快速的字體-行楷字學(xué)習(xí)
- 提升中學(xué)生化學(xué)閱讀素養(yǎng)的對(duì)策研究課件
- 高中地理ppt課件宇宙環(huán)境3
- 第3章學(xué)校管理理念課件
- 體育保健學(xué)(第五章按摩)課件
- 三年級(jí)下冊(cè)語(yǔ)文ppt課件-習(xí)作:這樣想象真有趣-8-人教部編版
- 糖尿病的康復(fù)【ppt課件】
- 七年級(jí)政治上冊(cè) 我上中學(xué)了 課件3(粵教版七年級(jí)上)
- 人教版二年級(jí)下冊(cè)數(shù)學(xué)ppt課件2.1.2-按指定的份數(shù)平均分
- 嬰幼兒語(yǔ)言潛能開(kāi)發(fā)及教養(yǎng)策略課件
- 外用抗生素的合理使用CME培訓(xùn)課件