下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、封面作者:PanHongliang僅供個(gè)人學(xué)習(xí)基于Socket的網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì)摘要近年來(lái)隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,特別是 Internet 技術(shù)的發(fā)展,已經(jīng)深刻的改變到了人們生活的方方面面。這時(shí)過(guò)去的種種陳舊的通訊方式,都已經(jīng)不 能滿足現(xiàn)代生活的需要。人們希望能夠用更低廉的價(jià)格,更加方便快捷的方 式,來(lái)實(shí)現(xiàn)即時(shí)通訊。這時(shí)開(kāi)發(fā)一套基于 Internet 技術(shù)的網(wǎng)絡(luò)聊天系統(tǒng)變得尤為 重要。本人以基于 Java 語(yǔ)言開(kāi)發(fā)的網(wǎng)絡(luò)聊天系統(tǒng)為實(shí)踐基礎(chǔ),詳細(xì)的介紹了聊天 系統(tǒng)的功能設(shè)計(jì)和界面邏輯結(jié)構(gòu)。最終實(shí)現(xiàn)了一個(gè)可以實(shí)現(xiàn)私聊、群聊、傳送 文件的網(wǎng)絡(luò)聊天系統(tǒng)。本次設(shè)計(jì)主要以 Socket 網(wǎng)絡(luò)通訊作
2、為基礎(chǔ),并以 Object 作為通訊載體,同時(shí)運(yùn)用了一定的通訊協(xié)議知識(shí)開(kāi)發(fā)完成。在界面方面,采用 的是 Java 中的 Swing 技術(shù)來(lái)實(shí)現(xiàn)。為了實(shí)現(xiàn)多用戶的連接,在服務(wù)器端將采用 多線程的技術(shù)來(lái)實(shí)現(xiàn)。關(guān)鍵詞:JavaSocke 通訊協(xié)議 Swing 多線程Socket-based web chat system development and designAbstractRecent years, with the rapid development of computer technology, especiallyInternet technology, has profound ch
3、ange to all aspects of peoples lives. At this time allthe old past, means of communication, have been unable to meet the needs of modernlife. People want to use more low cost, more convenient and efficient way to achievereal-time communications. Then develop a network based on Internet technology, c
4、hatsystem becomes particularly important.I developed Java-based chat system based on practice, detailed description of thechat function of the system design and interface, logical structure. Ultimately can achievea whisper, group chat, send files online chat system. This design mostly Socket network
5、communication as the basis, and with Object as the communication carrier, while the useof a certain protocol to complete the knowledge development. In the interface, the use ofthe Java in the Swing technologies. To achieve multi-user connection, the server will usethe technology to implement multith
6、reading.Keywords: JavaSocket Communication protocol Swing Multithreading目錄一. 緒論 51.1 課題背景 51.2 課題研究?jī)?nèi)容及意義 51.3 系統(tǒng)相關(guān)技術(shù)介紹 61.3.1 Java 語(yǔ)言概述 61.3.2 TCP/IP 協(xié)議 71.3.3 Socke 編程 101.3.4 Swi ng 簡(jiǎn)介 111.3.5 多線程技術(shù)介紹 12. 系統(tǒng)需求分析 162.1 需求分析 162.2 可行性分析 17(1)社會(huì)可行性 17(2)用戶可行性 17(3)技術(shù)可行性 17(4)經(jīng)濟(jì)可行性 182.3 系統(tǒng)開(kāi)發(fā)環(huán)境 18. 系統(tǒng)
7、總體設(shè)計(jì) 183.1 客戶端與服務(wù)器的通信 183.2 客戶端與客戶端的通信 193.3 系統(tǒng)的架構(gòu)模式 191. . 系統(tǒng)功能模塊設(shè)計(jì) 202.1服務(wù)器端的設(shè)計(jì) 203.1服務(wù)器等待連接線程設(shè)計(jì) 203.2服務(wù)器處理客戶端信息線程設(shè)計(jì)2.2客戶端設(shè)計(jì) 284.1.2 客戶端登錄模塊設(shè)計(jì) 284.1.3 新用戶注冊(cè)模塊設(shè)計(jì) 294.1.4 客戶端主界面模塊設(shè)計(jì) 294.1.5 點(diǎn)對(duì)點(diǎn)通信模塊設(shè)計(jì) 294.1.6 一對(duì)多通信模塊設(shè)計(jì) 294.1.7 點(diǎn)對(duì)點(diǎn)文件傳輸模塊設(shè)計(jì) 302. . 系統(tǒng)測(cè)試 303. . 結(jié)束語(yǔ) 314. . 參考文獻(xiàn) 3120.緒論1課題背景Internet 是目前世界上
8、最大的計(jì)算機(jī)互聯(lián)網(wǎng)絡(luò),它遍布全球,并將世界各 地不同規(guī)模和大小的網(wǎng)絡(luò)連接成為一個(gè)整體。目前基于 Internet 的應(yīng)用已經(jīng)非 常多了,例如網(wǎng)上收發(fā)郵件、網(wǎng)上購(gòu)物、網(wǎng)上看電影等等。這些應(yīng)用無(wú)不在改 變?nèi)藗兊纳顐鹘y(tǒng)生活方式。目前人們進(jìn)行信息交流的方式非常多,例如電報(bào)、電話、電子郵件等通訊 手段。但是這些都存在不便利或者費(fèi)用方面的問(wèn)題,例如電子郵件,雖然費(fèi)用 不高,甚至可以免費(fèi)使用,但是無(wú)法實(shí)現(xiàn)即時(shí)通訊,只能作為一種輔助交流的 通訊手段。這時(shí)開(kāi)發(fā)一套網(wǎng)絡(luò)聊天系統(tǒng)變得尤為重要,通過(guò)該系統(tǒng)不但能夠?qū)?現(xiàn)點(diǎn)對(duì)點(diǎn)的交流,還能夠?qū)崿F(xiàn)多人同時(shí)聊天,并且可以相互傳遞文件資料。最 主要的是,它的費(fèi)用非常低廉,信
9、息處理速度快,這樣人們才能在這個(gè)活動(dòng)的 社會(huì)中加強(qiáng)聯(lián)系,從而創(chuàng)建出更多的財(cái)富和價(jià)值。2課題研究?jī)?nèi)容及意義目前已有的一些網(wǎng)絡(luò)聊天系統(tǒng)已經(jīng)非常多了,例如騰訊的QQ 網(wǎng)易的泡泡等等。這些網(wǎng)絡(luò)聊天系統(tǒng)已經(jīng)非常成熟了,不過(guò)它們都要求用戶必須連接互聯(lián) 網(wǎng)才能夠進(jìn)行通信。目前有很多公司,由于保密公司并不會(huì)讓員工連入互聯(lián) 網(wǎng),所以這些軟件都將無(wú)法使用。這是就需要開(kāi)發(fā)一款能夠在公司局域網(wǎng)中使 用的聊天系統(tǒng),并實(shí)現(xiàn)公司內(nèi)部員工的通訊和交流。該系統(tǒng)分為服務(wù)器端和客戶端兩個(gè)不同的程序,其中服務(wù)器端需要運(yùn)行在 公司的服務(wù)器上,而客戶端需要部署到公司員工的機(jī)器上。這樣員工只需要打 開(kāi)客戶端并登錄到服務(wù)器,就可以與局域網(wǎng)上
10、的其他員工彼此之間發(fā)送信息, 并傳送資料了。本課題主要研究的是基于 Socket 的聊天軟件,此聊天軟件分為服務(wù)器程序 和客戶端程序,本課題的目標(biāo)是能實(shí)現(xiàn)用戶在客戶端與服務(wù)器端傳遞信息。主 要研究開(kāi)發(fā)內(nèi)容是:熟悉系統(tǒng)開(kāi)發(fā)平臺(tái),探索在此開(kāi)發(fā)平臺(tái)下,利用 Socket 編 程技術(shù)、多線程開(kāi)發(fā)技術(shù)、TCP/IP 協(xié)議等進(jìn)行聊天軟件的實(shí)際開(kāi)發(fā)。具體要實(shí) 現(xiàn)的目標(biāo)如下: (1) 實(shí)現(xiàn)用戶的注冊(cè)、登陸、修改信息等功能 (2) 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn) 的通信,即私聊 (3) 實(shí)現(xiàn)一對(duì)多的通信,即群聊 (4)實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的文件傳 輸。3系統(tǒng)相關(guān)技術(shù)介紹1.3.1 Java 語(yǔ)言概述Java 語(yǔ)言是目前流行的一種網(wǎng)絡(luò)編程語(yǔ)言
11、,它的面向?qū)ο?、跨平臺(tái)和分布 應(yīng)用等特點(diǎn)給編程人員帶來(lái)一種嶄新的計(jì)算概念,使WWWfc 最初的單純提供靜態(tài)信息發(fā)展到現(xiàn)在的提供各種各樣的動(dòng)態(tài)服務(wù)。 Java 不僅能夠編寫嵌入網(wǎng)頁(yè)中 具有聲音和動(dòng)畫(huà)功能的小應(yīng)用程序,而且還能夠應(yīng)用于獨(dú)立的大中型應(yīng)用程 序,其強(qiáng)大的網(wǎng)絡(luò)功能可以把整個(gè) Internet 作為一個(gè)統(tǒng)一的運(yùn)行平臺(tái),極大地 拓展了傳統(tǒng)單機(jī)或Client/Server 模式應(yīng)用程序的外延和內(nèi)涵。從 1995 年正式 問(wèn)世以來(lái), Java 逐步從一種單純的高級(jí)編程語(yǔ)言發(fā)展為一種重要的 Internet 開(kāi)發(fā)平臺(tái),并進(jìn)而引發(fā)帶動(dòng)了 Java 產(chǎn)業(yè)的發(fā)展和壯大,成為當(dāng)今計(jì)算機(jī)業(yè)界不 可忽視的力量
12、和重要的發(fā)展潮流與方向。Java 語(yǔ)言的起源最早 Java 語(yǔ)言的出現(xiàn)是源于獨(dú)立開(kāi)發(fā)平臺(tái)語(yǔ)言的需要,當(dāng)時(shí)人們希望能編 寫出嵌入到各種家用電器等設(shè)備的芯片上、且易于維護(hù)的程序。它的出現(xiàn)是為 了彌補(bǔ)當(dāng)時(shí)的編程語(yǔ)言,例如C、C+等只能對(duì)特定的 CPU 芯片進(jìn)行編譯的缺陷。 Java 的設(shè)計(jì)者們就大膽設(shè)想讓更換芯片的電器還是能夠正確運(yùn)行,無(wú)需重 新編譯芯片,因此 Sun 公司于 1990 年成立了由 James Gosling 領(lǐng)導(dǎo)的開(kāi)發(fā)小 組,開(kāi)始致力于開(kāi)發(fā)一種可移植的、 跨平臺(tái)的語(yǔ)言, 該語(yǔ)言能生成正確運(yùn)行于 各種操作系統(tǒng)、 各種 CPU芯片上的代碼。經(jīng)過(guò)他們的精心鉆研和努力,便促成 了 Java
13、 語(yǔ)言的誕生。Java 語(yǔ)言的發(fā)展前景在 2005 年的 Java One 開(kāi)發(fā)者大會(huì)上, James Gosling 做了題為“ Java 技 術(shù)下一個(gè) 10 年貢獻(xiàn)”的演講, James Gosling 認(rèn)為, Java 技術(shù)提高了計(jì)算的 “流動(dòng)性”,就如同貨幣的發(fā)明提高了商品的流動(dòng)性一樣。無(wú)所不在的網(wǎng)絡(luò)豐 富了每個(gè)人的信息量,就如同可以兌換的貨幣產(chǎn)生了財(cái)富一樣。由于從前的網(wǎng) 絡(luò)速度是很慢的,所以計(jì)算被束縛在特定的計(jì)算機(jī)上,而這種情況將一去不復(fù) 返了。目前,全球 Java 開(kāi)發(fā)人員已經(jīng)超過(guò) 450 萬(wàn),因此 Java 社區(qū)是一個(gè)充滿活 力和創(chuàng)新精神的團(tuán)隊(duì),這正是 Java 更加繁榮的保障。
14、為了保持 Java 的增長(zhǎng)和 推進(jìn) Java 社區(qū)的參與,Sun 在 Java One 開(kāi)發(fā)者大會(huì)上宣布開(kāi)放 Java 核心源代 碼,以鼓勵(lì)更多的人參與到社團(tuán)活動(dòng)中來(lái),這是Sun 為推進(jìn)社團(tuán)發(fā)展和維護(hù)Java 技術(shù)兼容性而邁出的重要一步,同時(shí)也是Java 技術(shù)在創(chuàng)新和社會(huì)進(jìn)步上繼續(xù)發(fā)揮重要作用的標(biāo)志。隨著 Java 的開(kāi)源,在未來(lái)的十年里,Java 的應(yīng)用范圍將變得更廣。數(shù)字 媒體將是Java 的下一個(gè)目標(biāo),同時(shí),Java 將教育和健康作為未來(lái) Java 發(fā)展過(guò) 程中的兩大重點(diǎn)應(yīng)用領(lǐng)域。(3)Java 的語(yǔ)法Java 是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,其基本語(yǔ)法和C 語(yǔ)言大致相同。從一定角度上講,C
15、語(yǔ)言加上面向?qū)ο蠊δ芫褪荂+。那么 Java 與 C+有什么區(qū)別呢?簡(jiǎn)要地說(shuō),Java 改進(jìn)了 C+的些缺點(diǎn),并增加了一些新的功能,從而變 得比 C+更加簡(jiǎn)單、易學(xué),編寫出來(lái)的程序也更具健壯性。下面就對(duì)它們進(jìn)行 一個(gè)簡(jiǎn)單的比較。Java 去掉了 C 語(yǔ)言的指針。如指針使用得當(dāng),對(duì)增強(qiáng)程序的功能有很大 幫助,一旦使用不當(dāng),經(jīng)常會(huì)導(dǎo)致死機(jī)。Java 沒(méi)有了 C 語(yǔ)言中的預(yù)處理器。如#ifdef、#define、常量聲明等都 不使用了,當(dāng)然也少了 #inelude 命令,從而也沒(méi)有頭文件(.h 文件)。和 C+ 相比,Java 不支持多繼承的概念,目的是為了避免對(duì)象和對(duì)象之間的關(guān)系復(fù)雜 化。Java
16、 增加了垃圾回收機(jī)制、異常處理和新的限定詞等功能。這些幾乎全 部都是基于整個(gè)系統(tǒng)和程序本身安全性的考慮。不論在何種平臺(tái)上,Java 基本數(shù)據(jù)類型的大小是不變的。1.3.2TCP/IP 協(xié)議TCP/IP 是 Transmission Control Protocol/Internet Protocol 中文譯名為傳輸控制協(xié)議 / 互聯(lián)網(wǎng)絡(luò)協(xié)議,該協(xié)議是 Internet 最基本的協(xié)議, 簡(jiǎn)單地說(shuō),就是由底層的 IP 協(xié)議和 TCP 協(xié)議組成的。TCP/IP 協(xié)議的開(kāi)發(fā)工作 始于 70 年代,是用于互聯(lián)網(wǎng)的第一套協(xié)議。(1) TCP/IP 參考模型TCP/IP 協(xié)議的開(kāi)發(fā)研制人員將 Interne
17、t 分為五個(gè)層次,以便于理解,它 也稱為互聯(lián)網(wǎng)分層模型或互聯(lián)網(wǎng)分層參考模型,如下所示:物理層:對(duì)應(yīng)于網(wǎng)絡(luò)的基本硬件,這也是 Internet 物理構(gòu)成,即我們可以 看得見(jiàn)的硬設(shè)備,如 PC 機(jī)、互連網(wǎng)服務(wù)器、網(wǎng)絡(luò)設(shè)備等,必須對(duì)這些硬設(shè)備的 電氣特性作一個(gè)規(guī)范,使這些設(shè)備都能夠互相連接幷兼容使用。網(wǎng)絡(luò)接口層:它定義了將資料組成正確幀的規(guī)程和在網(wǎng)絡(luò)中傳輸幀的規(guī) 程,幀是指的簡(jiǎn)寫,一串資料,它是資料在網(wǎng)絡(luò)中傳輸?shù)膯挝??;ヂ?lián)網(wǎng)層:本層定義了互聯(lián)網(wǎng)中傳輸?shù)摹靶畔备袷?,以及從一個(gè)用戶 通過(guò)一個(gè)或多個(gè)路由器到最終目標(biāo)的 信息包轉(zhuǎn)發(fā)機(jī)制。傳輸層: 為兩個(gè)用戶進(jìn)程之間建立、 管理和拆除可靠而又有效的端到端連
18、 接。應(yīng)用層:它定義了應(yīng)用程序使用互聯(lián)網(wǎng)的規(guī)程。(2) 網(wǎng)間協(xié)議 IPInternet 上使用的一個(gè)關(guān)鍵的底層協(xié)議是網(wǎng)際協(xié)議,通常稱 IP 協(xié)議。我 們利用一個(gè)共同遵守的通信協(xié)議,從而使 Internet 成為一個(gè)允許連接不同類 型的計(jì)算機(jī)和不同操作系統(tǒng)的網(wǎng)絡(luò)。 要使兩臺(tái)計(jì)算機(jī)彼此之間進(jìn)行通信, 必須 使兩臺(tái)計(jì)算機(jī)使用同一種 語(yǔ)言 。通信協(xié)議正像兩臺(tái)計(jì)算機(jī)交換信息所使用的 共同語(yǔ)言,它規(guī)定了通信雙方在通信中所應(yīng)共同遵守的約定。計(jì)算機(jī)的通信協(xié)議精確地定義了計(jì)算機(jī)在彼此通信過(guò)程的所有細(xì)節(jié)。例 如,每臺(tái)計(jì)算機(jī)發(fā)送的信息格式和含義,在什么情況下應(yīng)發(fā)送規(guī)定的特殊信 息,以及接收方的計(jì)算機(jī)應(yīng)做出哪些應(yīng)答等
19、等。網(wǎng)際協(xié)議 IP 協(xié)議提供了能適應(yīng)各種各樣網(wǎng)絡(luò)硬件的靈活性,對(duì)底層網(wǎng)絡(luò)硬 件幾乎沒(méi)有任何要求,任何一個(gè)網(wǎng)絡(luò)只要可以從一個(gè)地點(diǎn)向另一個(gè)地點(diǎn)傳送二 進(jìn)制數(shù)據(jù),就可以使用 IP 協(xié)議加入 Internet 了。如果希望能在 Internet 上進(jìn)行交流和通信,則每臺(tái)連上 Internet 的計(jì) 算機(jī)都必須遵守 IP 協(xié)議。為此使用 Internet 的每臺(tái)計(jì)算機(jī)都必須運(yùn)行 IP 軟 件,以便時(shí)刻準(zhǔn)備發(fā)送或接收信息。IP 協(xié)議對(duì)于網(wǎng)絡(luò)通信有著重要的意義:網(wǎng)絡(luò)中的計(jì)算機(jī)通過(guò)安裝 IP 軟 件,使許許多多的局域網(wǎng)絡(luò)構(gòu)成了一個(gè)龐大而又嚴(yán)密的通信系統(tǒng)。從而使 Internet 看起來(lái)好象是真實(shí)存在的,但實(shí)際
20、上它是一種幷不存在的虛擬網(wǎng)絡(luò), 只不過(guò)是利用 IP 協(xié)議把全世界上所有愿意接入 Internet 的計(jì)算機(jī)局域網(wǎng)絡(luò)連 接起來(lái),使得它們彼此之間都能夠通信。(3)傳輸控制協(xié)議 TCP盡管計(jì)算機(jī)通過(guò)安裝 IP 軟件,從而保證了計(jì)算機(jī)之間可以發(fā)送和接收資 料,但 IP協(xié)議還不能解決資料分組在傳輸過(guò)程中可能出現(xiàn)的問(wèn)題。因此,若要 解決可能出現(xiàn)的問(wèn)題,連上 Internet 的計(jì)算機(jī)還需要安裝 TCP 協(xié)議來(lái)提供可 靠的幷且無(wú)差錯(cuò)的通信服務(wù)。TCP 協(xié)議被稱作一種端對(duì)端協(xié)議。這是因?yàn)樗鼮閮膳_(tái)計(jì)算機(jī)之間的連接起 了重要作用:當(dāng)一臺(tái)計(jì)算機(jī)需要與另一臺(tái)遠(yuǎn)程計(jì)算機(jī)連接時(shí),TCP 協(xié)議會(huì)讓它們建立一個(gè)連接、發(fā)送和
21、接收資料以及終止連接。傳輸控制協(xié)議 TCP 協(xié)議利用重發(fā)技術(shù)和擁塞控制機(jī)制,向應(yīng)用程序提供可 靠的通信連接,使它能夠自動(dòng)適應(yīng)網(wǎng)上的各種變化。即使在 Internet 暫時(shí)出 現(xiàn)堵塞的情況下,TCP也能夠保證通信的可靠。眾所周知, Internet 是一個(gè)龐大的國(guó)際性網(wǎng)絡(luò),網(wǎng)絡(luò)上的擁擠和空閑時(shí) 間總是交替不定的,加上傳送的距離也遠(yuǎn)近不同,所以傳輸資料所用時(shí)間也會(huì) 變化不定。TCP 協(xié)議具有自動(dòng)調(diào)整超時(shí)值的功能,能很好地適應(yīng) In ternet 上各種各樣的變化,確保傳輸數(shù)值的正確。因此,從上面我們可以了解到: IP 協(xié)議只保證計(jì)算機(jī)能發(fā)送和接收分組資 料,而TCP 協(xié)議則可提供一個(gè)可靠的、可流控
22、的、全雙工的信息流傳輸服務(wù)。綜上所述,雖然 IP 和 TCP 這兩個(gè)協(xié)議的功能不盡相同,也可以分開(kāi)單獨(dú)使 用,但它們是在同一時(shí)期作為一個(gè)協(xié)議來(lái)設(shè)計(jì)的,幷且在功能上也是互補(bǔ)的。 只有兩者的結(jié)合,才能保證 Internet 在復(fù)雜的環(huán)境下正常運(yùn)行。凡是要連接 到 Internet 的計(jì)算機(jī),都必須同時(shí)安裝和使用這兩個(gè)協(xié)議,因此在實(shí)際中常 把這兩個(gè)協(xié)議統(tǒng)稱作 TCP/IP 協(xié)議。1.3.3Socket 編程Socket 接口是訪問(wèn) Internet 使用得最廣泛的方法。 如果你有一臺(tái)剛配 好 TCP/IP 協(xié)議的主機(jī),其 IP 地址是 01 , 此時(shí)在另一臺(tái)主機(jī)或 同 一
23、臺(tái) 主 機(jī) 上 執(zhí)行 ftp 01 , 顯 然 無(wú) 法 建 立 連 接 。 因 01 這臺(tái)主機(jī)沒(méi)有運(yùn)行 FTP 服務(wù)軟件。同樣,在另一臺(tái)或同一臺(tái)主機(jī)上運(yùn)行瀏覽軟件 如 Netscape ,輸入 ,也無(wú)法建立連接?,F(xiàn)在,如果 在這臺(tái)主機(jī)上運(yùn)行一個(gè) FTP 服務(wù)軟件(該軟件將打開(kāi)一個(gè) Socket , 并將其綁 定到 21 端口) ,再在這臺(tái)主機(jī)上運(yùn)行一個(gè)Web 服務(wù)軟件(該軟件將打開(kāi)另一個(gè) Socket ,并將其綁定到 80 端口)。這樣,在另一臺(tái)主機(jī)或同一臺(tái)主機(jī)上執(zhí) 行 ftp01, FTP 客戶軟件將通過(guò) 21 端
24、口來(lái)呼叫主機(jī)上由 FTP 服務(wù)軟件提供的 Socket ,與其建立連接并對(duì)話。而在 netscape 中輸入 時(shí),將 通過(guò) 80端口來(lái)呼叫主機(jī)上由 Web 服務(wù)軟件提供的 Socket,與其建 立連接并對(duì) 話。在 Internet 上有很多這樣的主機(jī),這些主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同 時(shí)提供幾種服務(wù)。每種服務(wù)都打開(kāi)一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。 Socket 正如其英文原意那樣,象一個(gè)多孔插座。一臺(tái) 主機(jī)猶如布滿各種插座的房間, 每個(gè)插座有一個(gè)編號(hào), 有的插座提供 220 伏交 流電,有的提供 110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭 插到
25、不同編號(hào)的插座,就可以得到不同的服務(wù)。在 Java 中所謂 Socket 通常也稱作 套接字 ,用于描述 IP 地址和端口,是 一個(gè)通信鏈的句柄。應(yīng)用程序通常通過(guò) 套接字向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò) 請(qǐng)求。 以J2SDK-1.3 為例, Socket 和 ServerSocket 類庫(kù)位于 包 中。 ServerSocket 用于服務(wù)器端, Socket 是建立網(wǎng)絡(luò)連接時(shí)使用的。在連接成 功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè) Socket 實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì) 話。對(duì)于一個(gè)網(wǎng)絡(luò)連接來(lái)說(shuō),套接字是平等的,并沒(méi)有差別,不因?yàn)樵诜?wù)器 端或在客戶端而產(chǎn)生不同級(jí)別。不管是 Socket 還是 Se
26、rverSocket 它們的工作 都是通過(guò) SocketImpl 類及其子類完成的。重要的 Socket API :.Socket 繼承于 java.lang.Object ,有八個(gè) 構(gòu)造器,其方法并不多,下面介紹使用最頻繁的三個(gè)方法,其它方法可以參見(jiàn)JDK-1.3 文檔Accept 方法用于產(chǎn)生 阻塞,直到接受到一個(gè)連接,并且返回一個(gè)客戶端 的 Socket對(duì)象實(shí)例。 阻塞是一個(gè)術(shù)語(yǔ),它使程序運(yùn)行暫時(shí) 停留在這個(gè)地 方,直到一個(gè)會(huì)話產(chǎn)生,然后程序繼續(xù);通常 阻塞 是由循環(huán)產(chǎn)生的。getInputStream 方法獲得網(wǎng)絡(luò)連接輸入,同時(shí)返回一個(gè) InputStream 對(duì)象 實(shí)例。getOut
27、putStream 方 法 連 接 的 另 一 端 將 得 到 輸 入 , 同 時(shí) 返 回 一 個(gè)OutputStream 對(duì)象實(shí)例。 注意:其中 getInputStream 和 getOutputStream 方 法均可能會(huì)產(chǎn)生一個(gè) IOException ,它必須被捕獲,因?yàn)樗鼈兎祷氐牧鲗?duì)象, 通常都會(huì)被另一個(gè)流對(duì)象使用。服務(wù)器,使用 ServerSocket 監(jiān)聽(tīng)指定的端口,端口可以隨意指定(由于 1024 以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以 建議使用大于 1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在 完成會(huì)話后,關(guān)閉連接??蛻舳耍褂?S
28、ocket 對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求, 一旦連接成功,打開(kāi)會(huì)話;會(huì)話完成后,關(guān)閉 Socket ??蛻舳瞬恍枰付ù蜷_(kāi) 的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè) 1024 以上的端口。Socket 接口是 TCP/IP 網(wǎng)絡(luò)的 API,Socket 接口定義了許多函數(shù)或例程, 程序員可以用它們來(lái)開(kāi)發(fā) TCP/IP 網(wǎng)絡(luò)上的應(yīng)用程序。要學(xué) Internet 上的 TCP/IP 網(wǎng)絡(luò)編程,必須理解 Socket 接口。 Socket 接口設(shè)計(jì)者最先是將接口放 在 Unix 操作系統(tǒng)里面的。如果了解 Unix 系統(tǒng)的輸入和輸出的話,就很容易了 解 Socket 了。網(wǎng)絡(luò)的 Socket
29、 數(shù)據(jù)傳輸是一種特殊的 I/O , Socket 也是一種文 件描述符。 Socket 也具有一個(gè)類似于打開(kāi)文件的函數(shù)調(diào)用 Socket() ,該函數(shù)返 回一個(gè)整型的 Socket 描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^(guò)該 Socket 實(shí)現(xiàn)的。1.3.4Swing 簡(jiǎn)介Swing 是一個(gè)用于開(kāi)發(fā) Java 應(yīng)用程序用戶界面的開(kāi)發(fā)工具包。它以抽象窗 口工具包(AWT 為基礎(chǔ)使跨平臺(tái)應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格。 Swing 開(kāi)發(fā)人員只用很少的代碼就可以利用 Swing 豐富、靈活的功能和模塊化組件來(lái)創(chuàng)建優(yōu)雅的用戶界面Swing 的產(chǎn)生主要原因就是 AWT 不能滿足圖形化用戶界面
30、發(fā)展的需要。AWT 設(shè)計(jì)的初衷是支持開(kāi)發(fā)小應(yīng)用程序的簡(jiǎn)單用戶界面。例如AWT 缺少剪貼板、打印支持、鍵盤導(dǎo)航等特性,而且原來(lái)的AWT 甚至不包括彈出式菜單或滾動(dòng)窗格等基本元素。此外 AWT 還存在著嚴(yán)重的缺陷,人們使 AWT 適應(yīng)基于繼承的、具有很大伸 縮性的事件模型,基于同位體的體系結(jié)構(gòu)也成為其致命的弱點(diǎn)。隨著發(fā)展的需要, Swing 出現(xiàn)了, Swing 組件幾乎都是輕量組件,與重量組 件相比,沒(méi)有本地的對(duì)等組件,不像重量組件要在它們自己的本地不透明窗體 中繪制,輕量組件在它們的重量組件的窗口中繪制。這一講我們講一下基本的 Swing 組件使用方法和使用 Swing 組件創(chuàng)建用戶 界面的初
31、步方法。Swing 是由 100%純 Java 實(shí)現(xiàn)的, Swing 組件是用 Java 實(shí)現(xiàn)的輕量級(jí)( light-weight )組件,沒(méi)有本地代碼,不依賴操作系統(tǒng)的支持,這是它與 AWT 組件的最大區(qū)別。由于 AWT 組件通過(guò)與具體平臺(tái)相關(guān)的對(duì)等類(Peer )實(shí) 現(xiàn),因此 Swing 比 AWT組件具有更強(qiáng)的實(shí)用性。Swing 在不同的平臺(tái)上表現(xiàn)一 致,并且有能力提供本地窗口系統(tǒng)不支持的其它特性。Swing 采用了一種 MVC 的設(shè)計(jì)范式, 即模型-視圖-控制(Model-View- Controller ),其中模型用來(lái)保存內(nèi)容,視圖用來(lái)顯示內(nèi)容,控制器用來(lái)控制 用戶輸入。Swing
32、 外觀感覺(jué)采用可插入的外觀感覺(jué)(Pluggable Look and Feel,PL&F) 在 AWT 組件中,由于控制組件外觀的對(duì)等類與具體平臺(tái)相關(guān),使得AWT 組件總是只有與本機(jī)相關(guān)的外觀。 Swing 使得程序在一個(gè)平臺(tái)上運(yùn)行時(shí)能夠有不同的 外觀。用戶可以選擇自己習(xí)慣的外觀。1.3.5 多線程技術(shù)介紹多線程是這樣一種機(jī)制,它允許在程序中并發(fā)執(zhí)行多個(gè)指令流,每個(gè)指令 流都稱為一個(gè)線程,彼此間互相獨(dú)立。線程又稱為輕量級(jí)進(jìn)程,它和進(jìn)程一樣擁有獨(dú)立的執(zhí)行控制,由操作系統(tǒng) 負(fù)責(zé)調(diào)度,區(qū)別在于線程沒(méi)有獨(dú)立的存儲(chǔ)空間,而是和所屬進(jìn)程中的其它線程 共享一個(gè)存儲(chǔ)空間,這使得線程間的通信遠(yuǎn)較進(jìn)程簡(jiǎn)單
33、。多個(gè)線程的執(zhí)行是并發(fā)的,也就是在邏輯上“同時(shí)”,而不管是否是物理 上的“同時(shí)”。如果系統(tǒng)只有一個(gè) CPU 那么真正的“同時(shí)”是不可能的,但 是由于 CPU 的速度非??欤脩舾杏X(jué)不到其中的區(qū)別,因此我們也不用關(guān)心 它,只需要設(shè)想各個(gè)線程是同時(shí)執(zhí)行即可。多線程和傳統(tǒng)的單線程在程序設(shè)計(jì)上最大的區(qū)別在于,由于各個(gè)線程的控 制流彼此獨(dú)立,使得各個(gè)線程之間的代碼是亂序執(zhí)行的,由此帶來(lái)的線程調(diào) 度,同步等問(wèn)題。在 Java 中實(shí)現(xiàn)多線程。 我們不妨設(shè)想,為了創(chuàng)建一個(gè)新的線程,我們需要做些什么?很顯然,我 們必須指明這個(gè)線程所要執(zhí)行的代碼,而這就是在 Java 中實(shí)現(xiàn)多線程我們所需 要做的一切!真是神奇!
34、 Java 是如何做到這一點(diǎn)的?通過(guò)類!作為一個(gè)完全面向?qū)ο蟮?語(yǔ)言,Java 提供了類 java.lang.Thread 來(lái)方便多線程編程,這個(gè)類提供了大 量的方法來(lái)方便我們控制自己的各個(gè)線程,我們以后的討論都將圍繞這個(gè)類進(jìn) 行。那么如何提供給 Java 我們要線程執(zhí)行的代碼呢?讓我們來(lái)看一看 Thread 類。Thread 類最重要的方法是 run() ,它為 Thread 類的方法 start() 所調(diào)用, 提供我們的線程所要執(zhí)行的代碼。為了指定我們自己的代碼,只需要覆蓋它!方法一:繼承 Thread 類,覆蓋方法 run() ,我們?cè)趧?chuàng)建的 Thread 類的 子類中重寫 run()
35、, 加入線程所要執(zhí)行的代碼即可。下面是一個(gè)例子: public class MyThreadextends Thread int count= 1, number 。public MyThread(int num)number = num。System.out.println ( 創(chuàng)建線程 + number) 。public void run() while(true) System.out.println( 線程 + number + : 計(jì)數(shù) + count) 。 if(+count= 6) return 。public static void main(String args)for(i
36、nt i = 0 。 i 5 。 i+) new MyThread(i+1).start()。這種方法簡(jiǎn)單明了,符合大家的習(xí)慣,但是,它也有一個(gè)很大的缺點(diǎn),那 就是如果我們的類已經(jīng)從一個(gè)類繼承(如小程序必須繼承自 Applet 類),則 無(wú)法再繼承 Thread 類,這時(shí)如果我們又不想建立一個(gè)新的類,應(yīng)該怎么辦 呢?我們不妨來(lái)探索一種新的方法:我們不創(chuàng)建 Thread 類的子類,而是直接使 用它,那么我們只能將我們的方法作為參數(shù)傳遞給 Thread 類的實(shí)例,有點(diǎn)類 似回調(diào)函數(shù)。但是 Java 沒(méi)有指針,我們只能傳遞一個(gè)包含這個(gè)方法的類的實(shí) 例。那么如何限制這個(gè)類必須包含這一方法呢?當(dāng)然是使用
37、接口!(雖然抽象 類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避 免繼承帶來(lái)的限制嗎?)Java 提供了接口 java.lang.Runnable 來(lái)支持這種方法。方法二:實(shí)現(xiàn) Runnable 接口Runnable 接口只有一個(gè)方法 run() ,我們聲明自己的類實(shí)現(xiàn) Runnable 接口 并提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務(wù)。但 是 Runnable 接口并沒(méi)有任何對(duì)線程的支持,我們還必須創(chuàng)建 Thread 類的實(shí) 例,這一點(diǎn)通過(guò) Thread 類的構(gòu)造函數(shù) public Thread(Runnable target) 。來(lái) 實(shí)現(xiàn)。下面是
38、一個(gè)例子:public class MyThread implements Runnable int count= 1, number 。public MyThread(int num)number = num。System.out.println( 創(chuàng)建線程 + number) 。public void run()while(true)System.out.println (線程 + number + : 計(jì)數(shù) + count) 。if(+count= 6) return 。public static void main(String args)for(int i = 0 。 i 5 。 i
39、+)new Thread(new MyThread(i+1).start() 。嚴(yán)格地說(shuō),創(chuàng)建 Thread 子類的實(shí)例也是可行的,但是必須注意的是,該子 類必須沒(méi)有覆蓋 Thread 類的 run 方法,否則該線程執(zhí)行的將是子類的 run 方法,而不是我們用以實(shí)現(xiàn) Runnable 接口的類的 run 方法,對(duì)此大家不妨實(shí) 驗(yàn)一下。使用 Runnable 接口來(lái)實(shí)現(xiàn)多線程使得我們能夠在一個(gè)類中包容所有的代 碼,有利于封裝,它的缺點(diǎn)在于,我們只能使用一套代碼,若想創(chuàng)建多個(gè)線程 并使各個(gè)線程執(zhí)行不同的代碼,則仍必須額外創(chuàng)建類,如果這樣的話,在大多 數(shù)情況下也許還不如直接用多個(gè)類分別繼承 Thre
40、ad 來(lái)得緊湊。線程的四種狀態(tài)新?tīng)顟B(tài):線程已被創(chuàng)建但尚未執(zhí)行( start() 尚未被調(diào)用)??蓤?zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU 時(shí)間隨時(shí)可能被分配給該線程,從而使得它執(zhí)行。死亡狀態(tài):正常情況下 run() 返回使得線程死亡。調(diào)用 stop() 或 destroy() 亦有同樣效果,但是不被推薦,前者會(huì)產(chǎn)生異常,后者是強(qiáng)制終 止,不會(huì)釋放鎖。阻塞狀態(tài):線程不會(huì)被分配 CPU 時(shí)間,無(wú)法執(zhí)行。線程的優(yōu)先級(jí) 線程的優(yōu)先級(jí)代表該線程的重要程度,當(dāng)有多個(gè)線程同時(shí)處于可執(zhí)行狀態(tài) 并等待獲得 CPU 時(shí)間時(shí),線程調(diào)度系統(tǒng)根據(jù)各個(gè)線程的優(yōu)先級(jí)來(lái)決定給誰(shuí)分配 CPU 時(shí)間,優(yōu)先級(jí)高的線程有更
41、大的機(jī)會(huì)獲得CPU 時(shí)間,優(yōu)先級(jí)低的線程也不是沒(méi)有機(jī)會(huì),只是機(jī)會(huì)要小一些罷了。你可以調(diào)用 Thread 類的方法 getPriority() 和 setPriority() 來(lái)存取線 程的優(yōu)先級(jí),線程的優(yōu)先級(jí)界于 1(MIN_PRI0RITY 和 10(MAX_PRIORITY 之間, 缺省是5(NORM_PRIORITY。)線程的同步 由于同一進(jìn)程的多個(gè)線程共享同一片存儲(chǔ)空間,在帶來(lái)方便的同時(shí),也帶 來(lái)了訪問(wèn)沖突這個(gè)嚴(yán)重的問(wèn)題。 Java 語(yǔ)言提供了專門機(jī)制以解決這種沖突,有 效避免了同一個(gè)數(shù)據(jù)對(duì)象被多個(gè)線程同時(shí)訪問(wèn)。由于我們可以通過(guò) private 關(guān)鍵字來(lái)保證數(shù)據(jù)對(duì)象只能被方法訪問(wèn),所以
42、 我們只需針對(duì)方法提出一套機(jī)制,這套機(jī)制就是 synchronized 關(guān)鍵字,它包 括兩種用法:synchronized 方法和 synchronized 塊。二.系統(tǒng)需求分析需求分析為了開(kāi)發(fā)出符合要求的網(wǎng)絡(luò)聊天程序,首先必須知道使用者的需求。對(duì)需 求的深入理解是開(kāi)發(fā)工作獲得成功的前提條件,它對(duì)目標(biāo)工程提出完整、準(zhǔn) 確、清晰、具體的要求。首先,服務(wù)器需要同時(shí)連接很多個(gè)用戶,并能提供給 這些連接用戶所需要的任務(wù)處理請(qǐng)求,這就要求服務(wù)器能同時(shí)處理多個(gè) Socket 連接。服務(wù)器模型一般分為循環(huán)服務(wù)器和并發(fā)服務(wù)器,循環(huán)服務(wù)器一次只能處 理一個(gè)連接,也就是說(shuō)同一時(shí)間只能由一個(gè)用戶連接到服務(wù)器進(jìn)行消息
43、處理, 這種情況是不被允許的。因此我們將采用多線程方式的并發(fā)服務(wù)器來(lái)設(shè)計(jì)服務(wù) 器端,這樣將能從很大程度上提高服務(wù)器的運(yùn)行效率。其次,客戶端只需要連 接到服務(wù)器便可以進(jìn)行任務(wù)的處理工作,因此客戶端的主要性能要求為圖形界 面運(yùn)行的穩(wěn)定性和對(duì)出錯(cuò)信息的及時(shí)反映。當(dāng)一個(gè)窗體出現(xiàn)問(wèn)題時(shí)能夠及時(shí)的 處理,讓主程序不受影響。再者,所有的應(yīng)用程序在運(yùn)行過(guò)程中都會(huì)出現(xiàn)出錯(cuò) 的情況,這種錯(cuò)誤可能來(lái)自于程序本身,也可能是用戶操作的失誤所造成的。 當(dāng)有錯(cuò)誤發(fā)生時(shí),我們應(yīng)該有一個(gè)很好的機(jī)制來(lái)保障錯(cuò)誤能夠及時(shí)地被排除。當(dāng)應(yīng)用程序出現(xiàn)了錯(cuò)誤的時(shí)候我們就需要程序能提供給我們出錯(cuò)的信息,這樣 用戶就能夠很快的找出具體的出錯(cuò)原因
44、,以便尋找合理的途徑去解決它。2.2可行性分析可行性分析(Feasibility Analysis)也稱為可行性研究,是在系統(tǒng)調(diào)查的基礎(chǔ) 上,針對(duì)新系統(tǒng)的開(kāi)發(fā)是否具備必要性和可能性,對(duì)新系統(tǒng)的開(kāi)發(fā)從技術(shù)、經(jīng) 濟(jì)、社會(huì)的方面進(jìn)行分析和研究,以避免投資失誤,保證新系統(tǒng)的開(kāi)發(fā)成功。 可行性研究的目的就是用最小的代價(jià)在盡可能短的時(shí)間內(nèi)確定問(wèn)題是否能夠解 決。2.3.1 社會(huì)可行性隨著計(jì)算機(jī)的發(fā)展與普及,以及互聯(lián)網(wǎng)技術(shù)的擴(kuò)展,很多的公司和企業(yè)都提 供了局域網(wǎng)信息服務(wù)。而網(wǎng)絡(luò)聊天系統(tǒng)只要公司的電腦連入局域網(wǎng)就能夠訪 問(wèn),無(wú)須任何的其他昂貴設(shè)備,大大的節(jié)省了公司的資金。2.3.2 用戶可行性本系統(tǒng)服務(wù)的對(duì)象
45、是各大公司的技術(shù)人員,使用人員主要是掌握計(jì)算機(jī)基 本操作技能的知識(shí)分子。加之,當(dāng)前類似的系統(tǒng)操作簡(jiǎn)單,使用者能夠很快上 手。因此,在系統(tǒng)的使用方面不會(huì)存在問(wèn)題。2.3.3 技術(shù)可行性本次工程所使用的開(kāi)發(fā)語(yǔ)言是Java, Java 語(yǔ)言以其跨平臺(tái)的特性一致都被業(yè)界認(rèn)為是編程的最佳選擇,經(jīng)過(guò)多年的發(fā)展Java 虛擬機(jī)已經(jīng)升值 1.7 版本,在性能上有了很大提高,在 API 函數(shù)方面有了很多擴(kuò)充和冗余的精簡(jiǎn)。同時(shí), 基于 Java語(yǔ)言的設(shè)計(jì)模式的發(fā)展為軟件的設(shè)計(jì)提供了大量的可供選擇的解決方 案,保證了系統(tǒng)軟件的實(shí)現(xiàn)效率和運(yùn)行過(guò)程中的邏輯健壯性。圖2.1 C/S架構(gòu)示意圖本次工程系統(tǒng)架構(gòu)是 C/S 架
46、構(gòu)。如圖 2.1,因?yàn)?C/S 以它的靈活性,通用 性,易操作性等特點(diǎn)在用戶呈現(xiàn)方面一致是比較好的選擇。目前,由于這種架 構(gòu)在系統(tǒng)構(gòu)架方面的廣泛采用,已經(jīng)在系統(tǒng)構(gòu)架上積累了大量的經(jīng)驗(yàn)。所以本 系統(tǒng)在技術(shù)上是可行的。2.3.4 經(jīng)濟(jì)可行性從經(jīng)濟(jì)可行性的角度出發(fā),系統(tǒng)在開(kāi)發(fā)的過(guò)程中,主要應(yīng)該考慮如何節(jié)約 開(kāi)發(fā)成本,縮短開(kāi)發(fā)周期,以最小的投入獲得最大的回報(bào)。為了保證軟件產(chǎn)品 的質(zhì)量,系統(tǒng)的開(kāi)發(fā)周期應(yīng)該控制在 1 個(gè)月左右,并且要保證充足的調(diào)研時(shí)間 和測(cè)試周期。整個(gè)網(wǎng)絡(luò)聊天系統(tǒng)在開(kāi)發(fā)過(guò)程中僅僅需要 1 到 2 名具有一定開(kāi)發(fā)經(jīng)驗(yàn)的程 序員。所用的軟件主要是 Eclipse,該軟件目前是開(kāi)源和免費(fèi)的。在
47、硬件方面只 需要一臺(tái)交換機(jī)和專門用于編程和數(shù)據(jù)庫(kù)服務(wù)的 1 到 2 臺(tái)電腦,這些在目前市 場(chǎng)上價(jià)格是可以接受的。因此在經(jīng)濟(jì)方面是可行的。2.3系統(tǒng)開(kāi)發(fā)環(huán)境軟件環(huán)境方面, 本系統(tǒng)的采用的開(kāi)發(fā)技術(shù)主要是 Java, 界面技術(shù)上采用的 是 Swing,并通過(guò) Socket 和多線程技術(shù)來(lái)實(shí)現(xiàn)。系統(tǒng)開(kāi)發(fā)工具是采用的 Eclipse 集成開(kāi)發(fā)環(huán)境。在硬件環(huán)境方面,本系統(tǒng)的實(shí)現(xiàn)需要一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器和一臺(tái)服務(wù)器以及 若干的終端電腦。以保證在系統(tǒng)完成之后有一個(gè)模擬環(huán)境,進(jìn)行必要的測(cè)試。三.系統(tǒng)總體設(shè)計(jì)客戶端與服務(wù)器的通信客戶端和服務(wù)器是基于 TCP/IP 協(xié)議建立連接,并完成數(shù)據(jù)傳輸?shù)模淞鞒?圖如下圖所示。
48、圖3.1客戶端和服務(wù)器創(chuàng)建流程圖在 Java 的基于 TCP/IP 協(xié)議的 Socket 編程中,服務(wù)端使用 ServerSocket 類開(kāi)創(chuàng)建,而客戶端使用的 Socket 類??蛻舳伺c客戶端的通信客戶端同客戶端的通信是通過(guò)服務(wù)器轉(zhuǎn)發(fā)的形式來(lái)實(shí)現(xiàn)的,其示意圖如下 圖所示。圖3.2通信示意圖需要注意的是,客戶端同客戶端之間并沒(méi)有直接的聯(lián)系,而是通過(guò)服務(wù)器作 為中轉(zhuǎn)站的形式來(lái)完成數(shù)據(jù)傳輸?shù)?。這樣可以保證服務(wù)器能夠?qū)蛻舳酥g的 數(shù)據(jù)進(jìn)行處理,同時(shí)還能保證數(shù)據(jù)的安全性。系統(tǒng)的架構(gòu)模式本聊天系統(tǒng)采用的是目前流行服務(wù)器 / 客戶端架構(gòu)來(lái)設(shè)置的,同時(shí)采用了三 層架構(gòu)。這三層分別是指數(shù)據(jù)庫(kù)服務(wù)器、應(yīng)用程序
49、服務(wù)器以及應(yīng)用程序客戶 端。這樣可以合理的將各個(gè)任務(wù)分配至客戶端和服務(wù)器端,從而降低系統(tǒng)的通 信開(kāi)銷。圖3.3架構(gòu)示意圖系統(tǒng)的功能模塊設(shè)計(jì)根據(jù)前面的需求分析和系統(tǒng)總體分析,最終設(shè)計(jì)系統(tǒng)的功能模塊圖如下圖 所示。圖3.4系統(tǒng)的功能模塊圖四.系統(tǒng)功能模塊設(shè)計(jì)4.1服務(wù)器端的設(shè)計(jì)服務(wù)器端需要完成三大功能,分別是與客戶端建立連接、監(jiān)聽(tīng)客戶端消息 以及操作數(shù)據(jù)庫(kù)。由于會(huì)有多個(gè)用戶同時(shí)訪問(wèn)服務(wù)器,為了適應(yīng)多個(gè)用戶的并 發(fā)訪問(wèn)。本系統(tǒng)服務(wù)器端程序需要借助于 Java 語(yǔ)言的多線程機(jī)制來(lái)完成。 4.1.1 服務(wù)器等待連接線程設(shè)計(jì)具體的實(shí)現(xiàn)為在服務(wù)器成功創(chuàng)建后,會(huì)啟動(dòng)一個(gè)循環(huán)等待連接線程,該線 程專門用來(lái)負(fù)責(zé)接
50、收客戶端請(qǐng)求,其實(shí)現(xiàn)代碼如下所示。class ServerAccept extends Threadpublic void run()try while(true)Socket s 。s=ss.accept() 。ServerRead sr=new ServerRead() 。sr.srs=s 。sr.start() 。 catch (IOException e) e.printStackTrace() 。服務(wù)器處理客戶端信息線程設(shè)計(jì)當(dāng)服務(wù)器等待連接線程接收到一個(gè)新的套接字連接后,就會(huì)啟動(dòng)一個(gè)新的服務(wù)器處理客戶端信息線程來(lái)負(fù)責(zé)本服務(wù)器和該客戶端之間的連接,同時(shí)該在線程中的 run 方法中處理客
51、戶端的請(qǐng)求。等待連接線程將繼續(xù)等待下一個(gè)客戶端連接請(qǐng)求。前一個(gè)請(qǐng)求在完成所有的交互操作后自動(dòng)退出,同時(shí)連接也將關(guān) 閉,其實(shí)現(xiàn)代碼如下。class ServerRead extends ThreadSocket srs 。String sadress 。BufferedReader br 。String username 。 public void run() try br=new BufferedReader(newInputStreamReader(srs.getInputStream() 。PrintStream ps = newPrintStream(srs.getOutputStrea
52、m() 。sadress=srs.getInetAddress().toString().substring(1) 。while(true)String codeline= br.readLine() 。 if(codeline!=null)System.out.println(codeline+ 。 。 。 。 。 。 。 。 。 。) 。if(codeline.startsWith()/有 人上線,并通知在線用戶更新在線人員列表if(readFromFile(codeline.split()1, codeline.split()2).equals(true)if(!mapip.contai
53、nsKey(codeline.split()1)System.out.println(codeline+有人登陸了 )this.usernamecodeline.split()1 mapps.put(username,ps) 。mapip.put(username, sadress)System.out.println(username)Set setmapps.keySet() 。Iterator it set.iterator() 。StringBuffer sb=newStringBuffer(,)。while(it.hasNext()String a =(String) it.next
54、() 。sb.append(a+,) 。Iteratoriit=set.iterator()String下線)mapps.remove(leave)while(iit.hasNext()=(String) iit.next() 。pss = (PrintStream)mapps.get(a)pss.println(sb.toString() 。ps.println(two) 。ps.println(false) 。if(codeline.startsWith(end=)/員列表leave=codeline.split(=)1PrintStreamelseelseelse有人下線,并通知在線用戶
55、更新在線人StringSystem.out.println(leave+mapip.remove(leave)Set set = mapps.keySet()。Iterator it =StringBuffer sb=newnme=codeline.split(=)1set.iterator()StringBuffer(,)it.next()while(it.hasNext()String a =(String)sb.append(a+,) 。Iteratoriit=set.iterator()while(iit.hasNext()String a =(String)iit.next()Pri
56、ntStream pss =(PrintStream)mapps.get(a)pss.println(sb.toString()if(codeline.startsWith(giveip=)/else要 ip ,并發(fā)回對(duì)應(yīng) IpStringStringtonme=codeline.split(=)2PrintStreampss=mapps.get(nme) 。pss.println(ip=+tonme+=+mapip.get(tonme)elseif(codeline.startsWith(=)Stringna=codeline.split(=)1Stringpsw=codeline.spli
57、t(=)2if(writeToFile(na, psw)ps.println(=true)elseps.println(=false) 。elseif(codeline.contains(=states=)Stringuser=codeline.split(=)0Stringstates=codeline.split(=)2mapps.keySet() 。set.iterator()StringBuffer(,)if(states.equals(在線 )Set set =Iterator it =StringBuffer sb=newwhile(it.hasNext()String a =(S
58、tring)it.next()sb.append(a+,) 。Iteratoriit=set.iterator()iit.next()while(iit.hasNext()String a =(String)PrintStream pss =(PrintStream)mapps.get(a)pss.println(sb.toString()elseSetsetStringBuffer sb=newwhile(it.hasNext()String a =(String)if(!a.equals(user)Iteratorwhile(iit.hasNext()String a =(String)P
59、rintStream pss =(PrintStream)mapps.get(a)pss.println(sb.toString()else/ 發(fā)送群消息Set set = mapps.keySet()Iteratoriit=set.iterator()while(iit.hasNext()String a =(String)iit.next() 。PrintStream pss =mapps.keySet()Iteratoritset.iterator()StringBuffer(,)it.next()sb.append(a+,) 。iit=set.iterator()iit.next()(
60、PrintStream)mapps.get(a) 。pss.println(codeline) 。 catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace() 。4.2客戶端設(shè)計(jì)4.2.1 客戶端登錄模塊設(shè)計(jì)客戶端登錄模塊用來(lái)判斷用戶是否為合法用戶,如果是則可以登錄到客戶端主界面,否則將無(wú)法進(jìn)入。系統(tǒng)登錄窗口的運(yùn)行效果如圖 4.1 所示。圖4.1登錄窗口在登錄窗口中輸入正確的賬戶和密碼信息,然后單擊“登錄”按鈕,即可 向服務(wù)器發(fā)送登錄請(qǐng)求。服務(wù)器會(huì)對(duì)用戶的登錄信息進(jìn)行判斷,然后返回相應(yīng) 的處理結(jié)果。4.2.2
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鐵路舊軌枕封閉施工方案
- 聽(tīng)評(píng)課教學(xué)過(guò)程怎么記錄
- 人教版數(shù)學(xué)八年級(jí)上冊(cè)聽(tīng)評(píng)課記錄14.3.1《提公因式法》
- 人教版地理八年級(jí)上冊(cè)《第三節(jié) 河流》聽(tīng)課評(píng)課記錄1
- 2025年度貸款合同法律適用范本
- 湘教版數(shù)學(xué)九年級(jí)上冊(cè)2.4《一元二次方程根與系數(shù)的關(guān)系》聽(tīng)評(píng)課記錄
- 2025年度定制木門市場(chǎng)調(diào)研與分析合同
- 2025年度家庭零花錢成長(zhǎng)記錄合作協(xié)議
- 湘教版數(shù)學(xué)七年級(jí)上冊(cè)1.4.1《有理數(shù)的加法》聽(tīng)評(píng)課記錄2
- 怎么做做聽(tīng)評(píng)課記錄
- 5G NSA站點(diǎn)開(kāi)通指導(dǎo)書(shū)(臨時(shí)IP開(kāi)站)
- 宗教與社會(huì)課件
- 3人-機(jī)-環(huán)-管理本質(zhì)安全化措施課件
- 生殖醫(yī)學(xué)中心建設(shè)驗(yàn)收標(biāo)準(zhǔn)分析-講座課件PPT
- DB44∕T 1811-2016 石灰?guī)r山地造林技術(shù)規(guī)程
- 2025采煤工作面巷道平面布置示意圖
- 慶陽(yáng)煤炭資源開(kāi)發(fā)調(diào)研報(bào)告
- 橋博常見(jiàn)問(wèn)題
- 貴州省電梯日常維護(hù)保養(yǎng)合同范本
- 《我們的方言》-教案(共4頁(yè))
- 泰國(guó)主要城市中英泰文對(duì)照
評(píng)論
0/150
提交評(píng)論