Socket網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與設(shè)計方案_第1頁
Socket網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與設(shè)計方案_第2頁
免費預(yù)覽已結(jié)束,剩余29頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、封面作者:PanHongliang僅供個人學(xué)習(xí)基于Socket的網(wǎng)絡(luò)聊天系統(tǒng)開發(fā)與設(shè)計摘要近年來隨著計算機(jī)技術(shù)的飛速發(fā)展,特別是 Internet 技術(shù)的發(fā)展,已經(jīng)深刻的改變到了人們生活的方方面面。這時過去的種種陳舊的通訊方式,都已經(jīng)不 能滿足現(xiàn)代生活的需要。人們希望能夠用更低廉的價格,更加方便快捷的方 式,來實現(xiàn)即時通訊。這時開發(fā)一套基于 Internet 技術(shù)的網(wǎng)絡(luò)聊天系統(tǒng)變得尤為 重要。本人以基于 Java 語言開發(fā)的網(wǎng)絡(luò)聊天系統(tǒng)為實踐基礎(chǔ),詳細(xì)的介紹了聊天 系統(tǒng)的功能設(shè)計和界面邏輯結(jié)構(gòu)。最終實現(xiàn)了一個可以實現(xiàn)私聊、群聊、傳送 文件的網(wǎng)絡(luò)聊天系統(tǒng)。本次設(shè)計主要以 Socket 網(wǎng)絡(luò)通訊作

2、為基礎(chǔ),并以 Object 作為通訊載體,同時運用了一定的通訊協(xié)議知識開發(fā)完成。在界面方面,采用 的是 Java 中的 Swing 技術(shù)來實現(xiàn)。為了實現(xiàn)多用戶的連接,在服務(wù)器端將采用 多線程的技術(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 課題研究內(nèi)容及意義 51.3 系統(tǒng)相關(guān)技術(shù)介紹 61.3.1 Java 語言概述 61.3.2 TCP/IP 協(xié)議 71.3.3 Socke 編程 101.3.4 Swi ng 簡介 111.3.5 多線程技術(shù)介紹 12. 系統(tǒng)需求分析 162.1 需求分析 162.2 可行性分析 17(1)社會可行性 17(2)用戶可行性 17(3)技術(shù)可行性 17(4)經(jīng)濟(jì)可行性 182.3 系統(tǒng)開發(fā)環(huán)境 18. 系統(tǒng)

7、總體設(shè)計 183.1 客戶端與服務(wù)器的通信 183.2 客戶端與客戶端的通信 193.3 系統(tǒng)的架構(gòu)模式 191. . 系統(tǒng)功能模塊設(shè)計 202.1服務(wù)器端的設(shè)計 203.1服務(wù)器等待連接線程設(shè)計 203.2服務(wù)器處理客戶端信息線程設(shè)計2.2客戶端設(shè)計 284.1.2 客戶端登錄模塊設(shè)計 284.1.3 新用戶注冊模塊設(shè)計 294.1.4 客戶端主界面模塊設(shè)計 294.1.5 點對點通信模塊設(shè)計 294.1.6 一對多通信模塊設(shè)計 294.1.7 點對點文件傳輸模塊設(shè)計 302. . 系統(tǒng)測試 303. . 結(jié)束語 314. . 參考文獻(xiàn) 3120.緒論1課題背景Internet 是目前世界上

8、最大的計算機(jī)互聯(lián)網(wǎng)絡(luò),它遍布全球,并將世界各 地不同規(guī)模和大小的網(wǎng)絡(luò)連接成為一個整體。目前基于 Internet 的應(yīng)用已經(jīng)非 常多了,例如網(wǎng)上收發(fā)郵件、網(wǎng)上購物、網(wǎng)上看電影等等。這些應(yīng)用無不在改 變?nèi)藗兊纳顐鹘y(tǒng)生活方式。目前人們進(jìn)行信息交流的方式非常多,例如電報、電話、電子郵件等通訊 手段。但是這些都存在不便利或者費用方面的問題,例如電子郵件,雖然費用 不高,甚至可以免費使用,但是無法實現(xiàn)即時通訊,只能作為一種輔助交流的 通訊手段。這時開發(fā)一套網(wǎng)絡(luò)聊天系統(tǒng)變得尤為重要,通過該系統(tǒng)不但能夠?qū)?現(xiàn)點對點的交流,還能夠?qū)崿F(xiàn)多人同時聊天,并且可以相互傳遞文件資料。最 主要的是,它的費用非常低廉,信

9、息處理速度快,這樣人們才能在這個活動的 社會中加強(qiáng)聯(lián)系,從而創(chuàng)建出更多的財富和價值。2課題研究內(nèi)容及意義目前已有的一些網(wǎng)絡(luò)聊天系統(tǒng)已經(jīng)非常多了,例如騰訊的QQ 網(wǎng)易的泡泡等等。這些網(wǎng)絡(luò)聊天系統(tǒng)已經(jīng)非常成熟了,不過它們都要求用戶必須連接互聯(lián) 網(wǎng)才能夠進(jìn)行通信。目前有很多公司,由于保密公司并不會讓員工連入互聯(lián) 網(wǎng),所以這些軟件都將無法使用。這是就需要開發(fā)一款能夠在公司局域網(wǎng)中使 用的聊天系統(tǒng),并實現(xiàn)公司內(nèi)部員工的通訊和交流。該系統(tǒng)分為服務(wù)器端和客戶端兩個不同的程序,其中服務(wù)器端需要運行在 公司的服務(wù)器上,而客戶端需要部署到公司員工的機(jī)器上。這樣員工只需要打 開客戶端并登錄到服務(wù)器,就可以與局域網(wǎng)上

10、的其他員工彼此之間發(fā)送信息, 并傳送資料了。本課題主要研究的是基于 Socket 的聊天軟件,此聊天軟件分為服務(wù)器程序 和客戶端程序,本課題的目標(biāo)是能實現(xiàn)用戶在客戶端與服務(wù)器端傳遞信息。主 要研究開發(fā)內(nèi)容是:熟悉系統(tǒng)開發(fā)平臺,探索在此開發(fā)平臺下,利用 Socket 編 程技術(shù)、多線程開發(fā)技術(shù)、TCP/IP 協(xié)議等進(jìn)行聊天軟件的實際開發(fā)。具體要實 現(xiàn)的目標(biāo)如下: (1) 實現(xiàn)用戶的注冊、登陸、修改信息等功能 (2) 實現(xiàn)點對點 的通信,即私聊 (3) 實現(xiàn)一對多的通信,即群聊 (4)實現(xiàn)點對點的文件傳 輸。3系統(tǒng)相關(guān)技術(shù)介紹1.3.1 Java 語言概述Java 語言是目前流行的一種網(wǎng)絡(luò)編程語言

11、,它的面向?qū)ο?、跨平臺和分布 應(yīng)用等特點給編程人員帶來一種嶄新的計算概念,使WWWfc 最初的單純提供靜態(tài)信息發(fā)展到現(xiàn)在的提供各種各樣的動態(tài)服務(wù)。 Java 不僅能夠編寫嵌入網(wǎng)頁中 具有聲音和動畫功能的小應(yīng)用程序,而且還能夠應(yīng)用于獨立的大中型應(yīng)用程 序,其強(qiáng)大的網(wǎng)絡(luò)功能可以把整個 Internet 作為一個統(tǒng)一的運行平臺,極大地 拓展了傳統(tǒng)單機(jī)或Client/Server 模式應(yīng)用程序的外延和內(nèi)涵。從 1995 年正式 問世以來, Java 逐步從一種單純的高級編程語言發(fā)展為一種重要的 Internet 開發(fā)平臺,并進(jìn)而引發(fā)帶動了 Java 產(chǎn)業(yè)的發(fā)展和壯大,成為當(dāng)今計算機(jī)業(yè)界不 可忽視的力量

12、和重要的發(fā)展潮流與方向。Java 語言的起源最早 Java 語言的出現(xiàn)是源于獨立開發(fā)平臺語言的需要,當(dāng)時人們希望能編 寫出嵌入到各種家用電器等設(shè)備的芯片上、且易于維護(hù)的程序。它的出現(xiàn)是為 了彌補(bǔ)當(dāng)時的編程語言,例如C、C+等只能對特定的 CPU 芯片進(jìn)行編譯的缺陷。 Java 的設(shè)計者們就大膽設(shè)想讓更換芯片的電器還是能夠正確運行,無需重 新編譯芯片,因此 Sun 公司于 1990 年成立了由 James Gosling 領(lǐng)導(dǎo)的開發(fā)小 組,開始致力于開發(fā)一種可移植的、 跨平臺的語言, 該語言能生成正確運行于 各種操作系統(tǒng)、 各種 CPU芯片上的代碼。經(jīng)過他們的精心鉆研和努力,便促成 了 Java

13、 語言的誕生。Java 語言的發(fā)展前景在 2005 年的 Java One 開發(fā)者大會上, James Gosling 做了題為“ Java 技 術(shù)下一個 10 年貢獻(xiàn)”的演講, James Gosling 認(rèn)為, Java 技術(shù)提高了計算的 “流動性”,就如同貨幣的發(fā)明提高了商品的流動性一樣。無所不在的網(wǎng)絡(luò)豐 富了每個人的信息量,就如同可以兌換的貨幣產(chǎn)生了財富一樣。由于從前的網(wǎng) 絡(luò)速度是很慢的,所以計算被束縛在特定的計算機(jī)上,而這種情況將一去不復(fù) 返了。目前,全球 Java 開發(fā)人員已經(jīng)超過 450 萬,因此 Java 社區(qū)是一個充滿活 力和創(chuàng)新精神的團(tuán)隊,這正是 Java 更加繁榮的保障。

14、為了保持 Java 的增長和 推進(jìn) Java 社區(qū)的參與,Sun 在 Java One 開發(fā)者大會上宣布開放 Java 核心源代 碼,以鼓勵更多的人參與到社團(tuán)活動中來,這是Sun 為推進(jìn)社團(tuán)發(fā)展和維護(hù)Java 技術(shù)兼容性而邁出的重要一步,同時也是Java 技術(shù)在創(chuàng)新和社會進(jìn)步上繼續(xù)發(fā)揮重要作用的標(biāo)志。隨著 Java 的開源,在未來的十年里,Java 的應(yīng)用范圍將變得更廣。數(shù)字 媒體將是Java 的下一個目標(biāo),同時,Java 將教育和健康作為未來 Java 發(fā)展過 程中的兩大重點應(yīng)用領(lǐng)域。(3)Java 的語法Java 是面向?qū)ο蟮某绦蛟O(shè)計語言,其基本語法和C 語言大致相同。從一定角度上講,C

15、語言加上面向?qū)ο蠊δ芫褪荂+。那么 Java 與 C+有什么區(qū)別呢?簡要地說,Java 改進(jìn)了 C+的些缺點,并增加了一些新的功能,從而變 得比 C+更加簡單、易學(xué),編寫出來的程序也更具健壯性。下面就對它們進(jìn)行 一個簡單的比較。Java 去掉了 C 語言的指針。如指針使用得當(dāng),對增強(qiáng)程序的功能有很大 幫助,一旦使用不當(dāng),經(jīng)常會導(dǎo)致死機(jī)。Java 沒有了 C 語言中的預(yù)處理器。如#ifdef、#define、常量聲明等都 不使用了,當(dāng)然也少了 #inelude 命令,從而也沒有頭文件(.h 文件)。和 C+ 相比,Java 不支持多繼承的概念,目的是為了避免對象和對象之間的關(guān)系復(fù)雜 化。Java

16、 增加了垃圾回收機(jī)制、異常處理和新的限定詞等功能。這些幾乎全 部都是基于整個系統(tǒng)和程序本身安全性的考慮。不論在何種平臺上,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é)議, 簡單地說,就是由底層的 IP 協(xié)議和 TCP 協(xié)議組成的。TCP/IP 協(xié)議的開發(fā)工作 始于 70 年代,是用于互聯(lián)網(wǎng)的第一套協(xié)議。(1) TCP/IP 參考模型TCP/IP 協(xié)議的開發(fā)研制人員將 Interne

17、t 分為五個層次,以便于理解,它 也稱為互聯(lián)網(wǎng)分層模型或互聯(lián)網(wǎng)分層參考模型,如下所示:物理層:對應(yīng)于網(wǎng)絡(luò)的基本硬件,這也是 Internet 物理構(gòu)成,即我們可以 看得見的硬設(shè)備,如 PC 機(jī)、互連網(wǎng)服務(wù)器、網(wǎng)絡(luò)設(shè)備等,必須對這些硬設(shè)備的 電氣特性作一個規(guī)范,使這些設(shè)備都能夠互相連接幷兼容使用。網(wǎng)絡(luò)接口層:它定義了將資料組成正確幀的規(guī)程和在網(wǎng)絡(luò)中傳輸幀的規(guī) 程,幀是指的簡寫,一串資料,它是資料在網(wǎng)絡(luò)中傳輸?shù)膯挝弧;ヂ?lián)網(wǎng)層:本層定義了互聯(lián)網(wǎng)中傳輸?shù)摹靶畔备袷剑约皬囊粋€用戶 通過一個或多個路由器到最終目標(biāo)的 信息包轉(zhuǎn)發(fā)機(jī)制。傳輸層: 為兩個用戶進(jìn)程之間建立、 管理和拆除可靠而又有效的端到端連

18、 接。應(yīng)用層:它定義了應(yīng)用程序使用互聯(lián)網(wǎng)的規(guī)程。(2) 網(wǎng)間協(xié)議 IPInternet 上使用的一個關(guān)鍵的底層協(xié)議是網(wǎng)際協(xié)議,通常稱 IP 協(xié)議。我 們利用一個共同遵守的通信協(xié)議,從而使 Internet 成為一個允許連接不同類 型的計算機(jī)和不同操作系統(tǒng)的網(wǎng)絡(luò)。 要使兩臺計算機(jī)彼此之間進(jìn)行通信, 必須 使兩臺計算機(jī)使用同一種 語言 。通信協(xié)議正像兩臺計算機(jī)交換信息所使用的 共同語言,它規(guī)定了通信雙方在通信中所應(yīng)共同遵守的約定。計算機(jī)的通信協(xié)議精確地定義了計算機(jī)在彼此通信過程的所有細(xì)節(jié)。例 如,每臺計算機(jī)發(fā)送的信息格式和含義,在什么情況下應(yīng)發(fā)送規(guī)定的特殊信 息,以及接收方的計算機(jī)應(yīng)做出哪些應(yīng)答等

19、等。網(wǎng)際協(xié)議 IP 協(xié)議提供了能適應(yīng)各種各樣網(wǎng)絡(luò)硬件的靈活性,對底層網(wǎng)絡(luò)硬 件幾乎沒有任何要求,任何一個網(wǎng)絡(luò)只要可以從一個地點向另一個地點傳送二 進(jìn)制數(shù)據(jù),就可以使用 IP 協(xié)議加入 Internet 了。如果希望能在 Internet 上進(jìn)行交流和通信,則每臺連上 Internet 的計 算機(jī)都必須遵守 IP 協(xié)議。為此使用 Internet 的每臺計算機(jī)都必須運行 IP 軟 件,以便時刻準(zhǔn)備發(fā)送或接收信息。IP 協(xié)議對于網(wǎng)絡(luò)通信有著重要的意義:網(wǎng)絡(luò)中的計算機(jī)通過安裝 IP 軟 件,使許許多多的局域網(wǎng)絡(luò)構(gòu)成了一個龐大而又嚴(yán)密的通信系統(tǒng)。從而使 Internet 看起來好象是真實存在的,但實際

20、上它是一種幷不存在的虛擬網(wǎng)絡(luò), 只不過是利用 IP 協(xié)議把全世界上所有愿意接入 Internet 的計算機(jī)局域網(wǎng)絡(luò)連 接起來,使得它們彼此之間都能夠通信。(3)傳輸控制協(xié)議 TCP盡管計算機(jī)通過安裝 IP 軟件,從而保證了計算機(jī)之間可以發(fā)送和接收資 料,但 IP協(xié)議還不能解決資料分組在傳輸過程中可能出現(xiàn)的問題。因此,若要 解決可能出現(xiàn)的問題,連上 Internet 的計算機(jī)還需要安裝 TCP 協(xié)議來提供可 靠的幷且無差錯的通信服務(wù)。TCP 協(xié)議被稱作一種端對端協(xié)議。這是因為它為兩臺計算機(jī)之間的連接起 了重要作用:當(dāng)一臺計算機(jī)需要與另一臺遠(yuǎn)程計算機(jī)連接時,TCP 協(xié)議會讓它們建立一個連接、發(fā)送和

21、接收資料以及終止連接。傳輸控制協(xié)議 TCP 協(xié)議利用重發(fā)技術(shù)和擁塞控制機(jī)制,向應(yīng)用程序提供可 靠的通信連接,使它能夠自動適應(yīng)網(wǎng)上的各種變化。即使在 Internet 暫時出 現(xiàn)堵塞的情況下,TCP也能夠保證通信的可靠。眾所周知, Internet 是一個龐大的國際性網(wǎng)絡(luò),網(wǎng)絡(luò)上的擁擠和空閑時 間總是交替不定的,加上傳送的距離也遠(yuǎn)近不同,所以傳輸資料所用時間也會 變化不定。TCP 協(xié)議具有自動調(diào)整超時值的功能,能很好地適應(yīng) In ternet 上各種各樣的變化,確保傳輸數(shù)值的正確。因此,從上面我們可以了解到: IP 協(xié)議只保證計算機(jī)能發(fā)送和接收分組資 料,而TCP 協(xié)議則可提供一個可靠的、可流控

22、的、全雙工的信息流傳輸服務(wù)。綜上所述,雖然 IP 和 TCP 這兩個協(xié)議的功能不盡相同,也可以分開單獨使 用,但它們是在同一時期作為一個協(xié)議來設(shè)計的,幷且在功能上也是互補(bǔ)的。 只有兩者的結(jié)合,才能保證 Internet 在復(fù)雜的環(huán)境下正常運行。凡是要連接 到 Internet 的計算機(jī),都必須同時安裝和使用這兩個協(xié)議,因此在實際中常 把這兩個協(xié)議統(tǒng)稱作 TCP/IP 協(xié)議。1.3.3Socket 編程Socket 接口是訪問 Internet 使用得最廣泛的方法。 如果你有一臺剛配 好 TCP/IP 協(xié)議的主機(jī),其 IP 地址是 01 , 此時在另一臺主機(jī)或 同 一

23、臺 主 機(jī) 上 執(zhí)行 ftp 01 , 顯 然 無 法 建 立 連 接 。 因 01 這臺主機(jī)沒有運行 FTP 服務(wù)軟件。同樣,在另一臺或同一臺主機(jī)上運行瀏覽軟件 如 Netscape ,輸入 ,也無法建立連接?,F(xiàn)在,如果 在這臺主機(jī)上運行一個 FTP 服務(wù)軟件(該軟件將打開一個 Socket , 并將其綁 定到 21 端口) ,再在這臺主機(jī)上運行一個Web 服務(wù)軟件(該軟件將打開另一個 Socket ,并將其綁定到 80 端口)。這樣,在另一臺主機(jī)或同一臺主機(jī)上執(zhí) 行 ftp01, FTP 客戶軟件將通過 21 端

24、口來呼叫主機(jī)上由 FTP 服務(wù)軟件提供的 Socket ,與其建立連接并對話。而在 netscape 中輸入 時,將 通過 80端口來呼叫主機(jī)上由 Web 服務(wù)軟件提供的 Socket,與其建 立連接并對 話。在 Internet 上有很多這樣的主機(jī),這些主機(jī)一般運行了多個服務(wù)軟件,同 時提供幾種服務(wù)。每種服務(wù)都打開一個Socket,并綁定到一個端口上,不同的端口對應(yīng)于不同的服務(wù)。 Socket 正如其英文原意那樣,象一個多孔插座。一臺 主機(jī)猶如布滿各種插座的房間, 每個插座有一個編號, 有的插座提供 220 伏交 流電,有的提供 110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭 插到

25、不同編號的插座,就可以得到不同的服務(wù)。在 Java 中所謂 Socket 通常也稱作 套接字 ,用于描述 IP 地址和端口,是 一個通信鏈的句柄。應(yīng)用程序通常通過 套接字向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò) 請求。 以J2SDK-1.3 為例, Socket 和 ServerSocket 類庫位于 包 中。 ServerSocket 用于服務(wù)器端, Socket 是建立網(wǎng)絡(luò)連接時使用的。在連接成 功時,應(yīng)用程序兩端都會產(chǎn)生一個 Socket 實例,操作這個實例,完成所需的會 話。對于一個網(wǎng)絡(luò)連接來說,套接字是平等的,并沒有差別,不因為在服務(wù)器 端或在客戶端而產(chǎn)生不同級別。不管是 Socket 還是 Se

26、rverSocket 它們的工作 都是通過 SocketImpl 類及其子類完成的。重要的 Socket API :.Socket 繼承于 java.lang.Object ,有八個 構(gòu)造器,其方法并不多,下面介紹使用最頻繁的三個方法,其它方法可以參見JDK-1.3 文檔Accept 方法用于產(chǎn)生 阻塞,直到接受到一個連接,并且返回一個客戶端 的 Socket對象實例。 阻塞是一個術(shù)語,它使程序運行暫時 停留在這個地 方,直到一個會話產(chǎn)生,然后程序繼續(xù);通常 阻塞 是由循環(huán)產(chǎn)生的。getInputStream 方法獲得網(wǎng)絡(luò)連接輸入,同時返回一個 InputStream 對象 實例。getOut

27、putStream 方 法 連 接 的 另 一 端 將 得 到 輸 入 , 同 時 返 回 一 個OutputStream 對象實例。 注意:其中 getInputStream 和 getOutputStream 方 法均可能會產(chǎn)生一個 IOException ,它必須被捕獲,因為它們返回的流對象, 通常都會被另一個流對象使用。服務(wù)器,使用 ServerSocket 監(jiān)聽指定的端口,端口可以隨意指定(由于 1024 以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以 建議使用大于 1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在 完成會話后,關(guān)閉連接??蛻舳耍褂?S

28、ocket 對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求, 一旦連接成功,打開會話;會話完成后,關(guān)閉 Socket ??蛻舳瞬恍枰付ù蜷_ 的端口,通常臨時的、動態(tài)的分配一個 1024 以上的端口。Socket 接口是 TCP/IP 網(wǎng)絡(luò)的 API,Socket 接口定義了許多函數(shù)或例程, 程序員可以用它們來開發(fā) TCP/IP 網(wǎng)絡(luò)上的應(yīng)用程序。要學(xué) Internet 上的 TCP/IP 網(wǎng)絡(luò)編程,必須理解 Socket 接口。 Socket 接口設(shè)計者最先是將接口放 在 Unix 操作系統(tǒng)里面的。如果了解 Unix 系統(tǒng)的輸入和輸出的話,就很容易了 解 Socket 了。網(wǎng)絡(luò)的 Socket

29、 數(shù)據(jù)傳輸是一種特殊的 I/O , Socket 也是一種文 件描述符。 Socket 也具有一個類似于打開文件的函數(shù)調(diào)用 Socket() ,該函數(shù)返 回一個整型的 Socket 描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該 Socket 實現(xiàn)的。1.3.4Swing 簡介Swing 是一個用于開發(fā) Java 應(yīng)用程序用戶界面的開發(fā)工具包。它以抽象窗 口工具包(AWT 為基礎(chǔ)使跨平臺應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格。 Swing 開發(fā)人員只用很少的代碼就可以利用 Swing 豐富、靈活的功能和模塊化組件來創(chuàng)建優(yōu)雅的用戶界面Swing 的產(chǎn)生主要原因就是 AWT 不能滿足圖形化用戶界面

30、發(fā)展的需要。AWT 設(shè)計的初衷是支持開發(fā)小應(yīng)用程序的簡單用戶界面。例如AWT 缺少剪貼板、打印支持、鍵盤導(dǎo)航等特性,而且原來的AWT 甚至不包括彈出式菜單或滾動窗格等基本元素。此外 AWT 還存在著嚴(yán)重的缺陷,人們使 AWT 適應(yīng)基于繼承的、具有很大伸 縮性的事件模型,基于同位體的體系結(jié)構(gòu)也成為其致命的弱點。隨著發(fā)展的需要, Swing 出現(xiàn)了, Swing 組件幾乎都是輕量組件,與重量組 件相比,沒有本地的對等組件,不像重量組件要在它們自己的本地不透明窗體 中繪制,輕量組件在它們的重量組件的窗口中繪制。這一講我們講一下基本的 Swing 組件使用方法和使用 Swing 組件創(chuàng)建用戶 界面的初

31、步方法。Swing 是由 100%純 Java 實現(xiàn)的, Swing 組件是用 Java 實現(xiàn)的輕量級( light-weight )組件,沒有本地代碼,不依賴操作系統(tǒng)的支持,這是它與 AWT 組件的最大區(qū)別。由于 AWT 組件通過與具體平臺相關(guān)的對等類(Peer )實 現(xiàn),因此 Swing 比 AWT組件具有更強(qiáng)的實用性。Swing 在不同的平臺上表現(xiàn)一 致,并且有能力提供本地窗口系統(tǒng)不支持的其它特性。Swing 采用了一種 MVC 的設(shè)計范式, 即模型-視圖-控制(Model-View- Controller ),其中模型用來保存內(nèi)容,視圖用來顯示內(nèi)容,控制器用來控制 用戶輸入。Swing

32、 外觀感覺采用可插入的外觀感覺(Pluggable Look and Feel,PL&F) 在 AWT 組件中,由于控制組件外觀的對等類與具體平臺相關(guān),使得AWT 組件總是只有與本機(jī)相關(guān)的外觀。 Swing 使得程序在一個平臺上運行時能夠有不同的 外觀。用戶可以選擇自己習(xí)慣的外觀。1.3.5 多線程技術(shù)介紹多線程是這樣一種機(jī)制,它允許在程序中并發(fā)執(zhí)行多個指令流,每個指令 流都稱為一個線程,彼此間互相獨立。線程又稱為輕量級進(jìn)程,它和進(jìn)程一樣擁有獨立的執(zhí)行控制,由操作系統(tǒng) 負(fù)責(zé)調(diào)度,區(qū)別在于線程沒有獨立的存儲空間,而是和所屬進(jìn)程中的其它線程 共享一個存儲空間,這使得線程間的通信遠(yuǎn)較進(jìn)程簡單

33、。多個線程的執(zhí)行是并發(fā)的,也就是在邏輯上“同時”,而不管是否是物理 上的“同時”。如果系統(tǒng)只有一個 CPU 那么真正的“同時”是不可能的,但 是由于 CPU 的速度非??欤脩舾杏X不到其中的區(qū)別,因此我們也不用關(guān)心 它,只需要設(shè)想各個線程是同時執(zhí)行即可。多線程和傳統(tǒng)的單線程在程序設(shè)計上最大的區(qū)別在于,由于各個線程的控 制流彼此獨立,使得各個線程之間的代碼是亂序執(zhí)行的,由此帶來的線程調(diào) 度,同步等問題。在 Java 中實現(xiàn)多線程。 我們不妨設(shè)想,為了創(chuàng)建一個新的線程,我們需要做些什么?很顯然,我 們必須指明這個線程所要執(zhí)行的代碼,而這就是在 Java 中實現(xiàn)多線程我們所需 要做的一切!真是神奇!

34、 Java 是如何做到這一點的?通過類!作為一個完全面向?qū)ο蟮?語言,Java 提供了類 java.lang.Thread 來方便多線程編程,這個類提供了大 量的方法來方便我們控制自己的各個線程,我們以后的討論都將圍繞這個類進(jìn) 行。那么如何提供給 Java 我們要線程執(zhí)行的代碼呢?讓我們來看一看 Thread 類。Thread 類最重要的方法是 run() ,它為 Thread 類的方法 start() 所調(diào)用, 提供我們的線程所要執(zhí)行的代碼。為了指定我們自己的代碼,只需要覆蓋它!方法一:繼承 Thread 類,覆蓋方法 run() ,我們在創(chuàng)建的 Thread 類的 子類中重寫 run()

35、, 加入線程所要執(zhí)行的代碼即可。下面是一個例子: 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 + : 計數(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()。這種方法簡單明了,符合大家的習(xí)慣,但是,它也有一個很大的缺點,那 就是如果我們的類已經(jīng)從一個類繼承(如小程序必須繼承自 Applet 類),則 無法再繼承 Thread 類,這時如果我們又不想建立一個新的類,應(yīng)該怎么辦 呢?我們不妨來探索一種新的方法:我們不創(chuàng)建 Thread 類的子類,而是直接使 用它,那么我們只能將我們的方法作為參數(shù)傳遞給 Thread 類的實例,有點類 似回調(diào)函數(shù)。但是 Java 沒有指針,我們只能傳遞一個包含這個方法的類的實 例。那么如何限制這個類必須包含這一方法呢?當(dāng)然是使用

37、接口!(雖然抽象 類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避 免繼承帶來的限制嗎?)Java 提供了接口 java.lang.Runnable 來支持這種方法。方法二:實現(xiàn) Runnable 接口Runnable 接口只有一個方法 run() ,我們聲明自己的類實現(xiàn) Runnable 接口 并提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務(wù)。但 是 Runnable 接口并沒有任何對線程的支持,我們還必須創(chuàng)建 Thread 類的實 例,這一點通過 Thread 類的構(gòu)造函數(shù) public Thread(Runnable target) 。來 實現(xiàn)。下面是

38、一個例子: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 + : 計數(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)格地說,創(chuàng)建 Thread 子類的實例也是可行的,但是必須注意的是,該子 類必須沒有覆蓋 Thread 類的 run 方法,否則該線程執(zhí)行的將是子類的 run 方法,而不是我們用以實現(xiàn) Runnable 接口的類的 run 方法,對此大家不妨實 驗一下。使用 Runnable 接口來實現(xiàn)多線程使得我們能夠在一個類中包容所有的代 碼,有利于封裝,它的缺點在于,我們只能使用一套代碼,若想創(chuàng)建多個線程 并使各個線程執(zhí)行不同的代碼,則仍必須額外創(chuàng)建類,如果這樣的話,在大多 數(shù)情況下也許還不如直接用多個類分別繼承 Thre

40、ad 來得緊湊。線程的四種狀態(tài)新狀態(tài):線程已被創(chuàng)建但尚未執(zhí)行( start() 尚未被調(diào)用)??蓤?zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU 時間隨時可能被分配給該線程,從而使得它執(zhí)行。死亡狀態(tài):正常情況下 run() 返回使得線程死亡。調(diào)用 stop() 或 destroy() 亦有同樣效果,但是不被推薦,前者會產(chǎn)生異常,后者是強(qiáng)制終 止,不會釋放鎖。阻塞狀態(tài):線程不會被分配 CPU 時間,無法執(zhí)行。線程的優(yōu)先級 線程的優(yōu)先級代表該線程的重要程度,當(dāng)有多個線程同時處于可執(zhí)行狀態(tài) 并等待獲得 CPU 時間時,線程調(diào)度系統(tǒng)根據(jù)各個線程的優(yōu)先級來決定給誰分配 CPU 時間,優(yōu)先級高的線程有更

41、大的機(jī)會獲得CPU 時間,優(yōu)先級低的線程也不是沒有機(jī)會,只是機(jī)會要小一些罷了。你可以調(diào)用 Thread 類的方法 getPriority() 和 setPriority() 來存取線 程的優(yōu)先級,線程的優(yōu)先級界于 1(MIN_PRI0RITY 和 10(MAX_PRIORITY 之間, 缺省是5(NORM_PRIORITY。)線程的同步 由于同一進(jìn)程的多個線程共享同一片存儲空間,在帶來方便的同時,也帶 來了訪問沖突這個嚴(yán)重的問題。 Java 語言提供了專門機(jī)制以解決這種沖突,有 效避免了同一個數(shù)據(jù)對象被多個線程同時訪問。由于我們可以通過 private 關(guān)鍵字來保證數(shù)據(jù)對象只能被方法訪問,所以

42、 我們只需針對方法提出一套機(jī)制,這套機(jī)制就是 synchronized 關(guān)鍵字,它包 括兩種用法:synchronized 方法和 synchronized 塊。二.系統(tǒng)需求分析需求分析為了開發(fā)出符合要求的網(wǎng)絡(luò)聊天程序,首先必須知道使用者的需求。對需 求的深入理解是開發(fā)工作獲得成功的前提條件,它對目標(biāo)工程提出完整、準(zhǔn) 確、清晰、具體的要求。首先,服務(wù)器需要同時連接很多個用戶,并能提供給 這些連接用戶所需要的任務(wù)處理請求,這就要求服務(wù)器能同時處理多個 Socket 連接。服務(wù)器模型一般分為循環(huán)服務(wù)器和并發(fā)服務(wù)器,循環(huán)服務(wù)器一次只能處 理一個連接,也就是說同一時間只能由一個用戶連接到服務(wù)器進(jìn)行消息

43、處理, 這種情況是不被允許的。因此我們將采用多線程方式的并發(fā)服務(wù)器來設(shè)計服務(wù) 器端,這樣將能從很大程度上提高服務(wù)器的運行效率。其次,客戶端只需要連 接到服務(wù)器便可以進(jìn)行任務(wù)的處理工作,因此客戶端的主要性能要求為圖形界 面運行的穩(wěn)定性和對出錯信息的及時反映。當(dāng)一個窗體出現(xiàn)問題時能夠及時的 處理,讓主程序不受影響。再者,所有的應(yīng)用程序在運行過程中都會出現(xiàn)出錯 的情況,這種錯誤可能來自于程序本身,也可能是用戶操作的失誤所造成的。 當(dāng)有錯誤發(fā)生時,我們應(yīng)該有一個很好的機(jī)制來保障錯誤能夠及時地被排除。當(dāng)應(yīng)用程序出現(xiàn)了錯誤的時候我們就需要程序能提供給我們出錯的信息,這樣 用戶就能夠很快的找出具體的出錯原因

44、,以便尋找合理的途徑去解決它。2.2可行性分析可行性分析(Feasibility Analysis)也稱為可行性研究,是在系統(tǒng)調(diào)查的基礎(chǔ) 上,針對新系統(tǒng)的開發(fā)是否具備必要性和可能性,對新系統(tǒng)的開發(fā)從技術(shù)、經(jīng) 濟(jì)、社會的方面進(jìn)行分析和研究,以避免投資失誤,保證新系統(tǒng)的開發(fā)成功。 可行性研究的目的就是用最小的代價在盡可能短的時間內(nèi)確定問題是否能夠解 決。2.3.1 社會可行性隨著計算機(jī)的發(fā)展與普及,以及互聯(lián)網(wǎng)技術(shù)的擴(kuò)展,很多的公司和企業(yè)都提 供了局域網(wǎng)信息服務(wù)。而網(wǎng)絡(luò)聊天系統(tǒng)只要公司的電腦連入局域網(wǎng)就能夠訪 問,無須任何的其他昂貴設(shè)備,大大的節(jié)省了公司的資金。2.3.2 用戶可行性本系統(tǒng)服務(wù)的對象

45、是各大公司的技術(shù)人員,使用人員主要是掌握計算機(jī)基 本操作技能的知識分子。加之,當(dāng)前類似的系統(tǒng)操作簡單,使用者能夠很快上 手。因此,在系統(tǒng)的使用方面不會存在問題。2.3.3 技術(shù)可行性本次工程所使用的開發(fā)語言是Java, Java 語言以其跨平臺的特性一致都被業(yè)界認(rèn)為是編程的最佳選擇,經(jīng)過多年的發(fā)展Java 虛擬機(jī)已經(jīng)升值 1.7 版本,在性能上有了很大提高,在 API 函數(shù)方面有了很多擴(kuò)充和冗余的精簡。同時, 基于 Java語言的設(shè)計模式的發(fā)展為軟件的設(shè)計提供了大量的可供選擇的解決方 案,保證了系統(tǒng)軟件的實現(xiàn)效率和運行過程中的邏輯健壯性。圖2.1 C/S架構(gòu)示意圖本次工程系統(tǒng)架構(gòu)是 C/S 架

46、構(gòu)。如圖 2.1,因為 C/S 以它的靈活性,通用 性,易操作性等特點在用戶呈現(xiàn)方面一致是比較好的選擇。目前,由于這種架 構(gòu)在系統(tǒng)構(gòu)架方面的廣泛采用,已經(jīng)在系統(tǒng)構(gòu)架上積累了大量的經(jīng)驗。所以本 系統(tǒng)在技術(shù)上是可行的。2.3.4 經(jīng)濟(jì)可行性從經(jīng)濟(jì)可行性的角度出發(fā),系統(tǒng)在開發(fā)的過程中,主要應(yīng)該考慮如何節(jié)約 開發(fā)成本,縮短開發(fā)周期,以最小的投入獲得最大的回報。為了保證軟件產(chǎn)品 的質(zhì)量,系統(tǒng)的開發(fā)周期應(yīng)該控制在 1 個月左右,并且要保證充足的調(diào)研時間 和測試周期。整個網(wǎng)絡(luò)聊天系統(tǒng)在開發(fā)過程中僅僅需要 1 到 2 名具有一定開發(fā)經(jīng)驗的程 序員。所用的軟件主要是 Eclipse,該軟件目前是開源和免費的。在

47、硬件方面只 需要一臺交換機(jī)和專門用于編程和數(shù)據(jù)庫服務(wù)的 1 到 2 臺電腦,這些在目前市 場上價格是可以接受的。因此在經(jīng)濟(jì)方面是可行的。2.3系統(tǒng)開發(fā)環(huán)境軟件環(huán)境方面, 本系統(tǒng)的采用的開發(fā)技術(shù)主要是 Java, 界面技術(shù)上采用的 是 Swing,并通過 Socket 和多線程技術(shù)來實現(xiàn)。系統(tǒng)開發(fā)工具是采用的 Eclipse 集成開發(fā)環(huán)境。在硬件環(huán)境方面,本系統(tǒng)的實現(xiàn)需要一臺數(shù)據(jù)庫服務(wù)器和一臺服務(wù)器以及 若干的終端電腦。以保證在系統(tǒng)完成之后有一個模擬環(huán)境,進(jìn)行必要的測試。三.系統(tǒng)總體設(shè)計客戶端與服務(wù)器的通信客戶端和服務(wù)器是基于 TCP/IP 協(xié)議建立連接,并完成數(shù)據(jù)傳輸?shù)?,其流?圖如下圖所示。

48、圖3.1客戶端和服務(wù)器創(chuàng)建流程圖在 Java 的基于 TCP/IP 協(xié)議的 Socket 編程中,服務(wù)端使用 ServerSocket 類開創(chuàng)建,而客戶端使用的 Socket 類。客戶端與客戶端的通信客戶端同客戶端的通信是通過服務(wù)器轉(zhuǎn)發(fā)的形式來實現(xiàn)的,其示意圖如下 圖所示。圖3.2通信示意圖需要注意的是,客戶端同客戶端之間并沒有直接的聯(lián)系,而是通過服務(wù)器作 為中轉(zhuǎn)站的形式來完成數(shù)據(jù)傳輸?shù)摹_@樣可以保證服務(wù)器能夠?qū)蛻舳酥g的 數(shù)據(jù)進(jìn)行處理,同時還能保證數(shù)據(jù)的安全性。系統(tǒng)的架構(gòu)模式本聊天系統(tǒng)采用的是目前流行服務(wù)器 / 客戶端架構(gòu)來設(shè)置的,同時采用了三 層架構(gòu)。這三層分別是指數(shù)據(jù)庫服務(wù)器、應(yīng)用程序

49、服務(wù)器以及應(yīng)用程序客戶 端。這樣可以合理的將各個任務(wù)分配至客戶端和服務(wù)器端,從而降低系統(tǒng)的通 信開銷。圖3.3架構(gòu)示意圖系統(tǒng)的功能模塊設(shè)計根據(jù)前面的需求分析和系統(tǒng)總體分析,最終設(shè)計系統(tǒng)的功能模塊圖如下圖 所示。圖3.4系統(tǒng)的功能模塊圖四.系統(tǒng)功能模塊設(shè)計4.1服務(wù)器端的設(shè)計服務(wù)器端需要完成三大功能,分別是與客戶端建立連接、監(jiān)聽客戶端消息 以及操作數(shù)據(jù)庫。由于會有多個用戶同時訪問服務(wù)器,為了適應(yīng)多個用戶的并 發(fā)訪問。本系統(tǒng)服務(wù)器端程序需要借助于 Java 語言的多線程機(jī)制來完成。 4.1.1 服務(wù)器等待連接線程設(shè)計具體的實現(xiàn)為在服務(wù)器成功創(chuàng)建后,會啟動一個循環(huán)等待連接線程,該線 程專門用來負(fù)責(zé)接

50、收客戶端請求,其實現(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è)計當(dāng)服務(wù)器等待連接線程接收到一個新的套接字連接后,就會啟動一個新的服務(wù)器處理客戶端信息線程來負(fù)責(zé)本服務(wù)器和該客戶端之間的連接,同時該在線程中的 run 方法中處理客

51、戶端的請求。等待連接線程將繼續(xù)等待下一個客戶端連接請求。前一個請求在完成所有的交互操作后自動退出,同時連接也將關(guān) 閉,其實現(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ā)回對應(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è)計4.2.1 客戶端登錄模塊設(shè)計客戶端登錄模塊用來判斷用戶是否為合法用戶,如果是則可以登錄到客戶端主界面,否則將無法進(jìn)入。系統(tǒng)登錄窗口的運行效果如圖 4.1 所示。圖4.1登錄窗口在登錄窗口中輸入正確的賬戶和密碼信息,然后單擊“登錄”按鈕,即可 向服務(wù)器發(fā)送登錄請求。服務(wù)器會對用戶的登錄信息進(jìn)行判斷,然后返回相應(yīng) 的處理結(jié)果。4.2.2

溫馨提示

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

評論

0/150

提交評論