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