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

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  本科畢業(yè)設(shè)計(jì)(論文)</p><p>  題 目 </p><p>  QQ : </p><p>  年 級(jí) 專 業(yè) </p><p>  班 級(jí) 學(xué) 號(hào)

2、 </p><p>  學(xué)生姓名 </p><p>  指導(dǎo)教師 職 稱 </p><p>  論文提交日期 </p><p><b>  摘 要</b></p>&l

3、t;p>  隨著網(wǎng)絡(luò)普及和上網(wǎng)人數(shù)的大增,進(jìn)行信息交流已經(jīng)成為人們?nèi)粘I钪胁豢扇鄙俚囊徊糠?,目前比較流行的聊天軟件如:Facebook、騰訊QQ、移動(dòng)Fetion、MSN-Messager,等等,相比于手機(jī)話費(fèi)的昂貴,手機(jī)短信的繁瑣等,網(wǎng)絡(luò)通信操作簡(jiǎn)單,更重要的是給廣大用戶提供了一個(gè)廣闊的免費(fèi)的交留平臺(tái),讓原本不認(rèn)識(shí)的人也可以通過(guò)聊天軟件成為朋友,讓原本就熟悉的朋友們有更多的時(shí)間更多的機(jī)會(huì)交流,給我們的生活和工作帶來(lái)了很多便利,

4、因此受到越來(lái)越多的網(wǎng)民的青睞。該系統(tǒng)開發(fā)主要包括兩個(gè)方面,一個(gè)網(wǎng)絡(luò)聊天服務(wù)器端和一個(gè)網(wǎng)絡(luò)聊天客戶端。使用了最新的java2標(biāo)準(zhǔn)Swing組建,開發(fā)出簡(jiǎn)潔美觀和布局合理的用戶服務(wù)器界面;前者通過(guò)Socket套接字建立服務(wù)器,使服務(wù)器能夠讀取、轉(zhuǎn)發(fā)客戶端發(fā)來(lái)信息,并能刷新用戶列表。后者通過(guò)與服務(wù)器建立連接,接收客戶端之間的信息交流。其中用到了局域網(wǎng)通信機(jī)制的原理,采用多線程多任務(wù)的設(shè)計(jì)思想。開發(fā)中利用了計(jì)算機(jī)網(wǎng)絡(luò)編程的基本理論知識(shí),如TCP

5、/IP協(xié)議、客戶端/服務(wù)器端模式(Client/Server模式)、網(wǎng)絡(luò)編程的設(shè)計(jì)方法等。在網(wǎng)絡(luò)編程中對(duì)信息的讀取、發(fā)送,是利用流來(lái)實(shí)現(xiàn)信</p><p>  【關(guān)鍵詞】即時(shí)通訊系統(tǒng) B/S multithreading C/S MySQL Socket Swing </p><p><b>  ABSTRACT</b></p><p&g

6、t;  Along with the network popularization and the number of Internet users growth, the exchange of information in daily life has become an indispensable part of the relatively popular chat software such as: Facebook, ten

7、cent QQ, mobile Fetion, MSN-Messager, etc, when compared to the mobile phone calls of expensive, mobile phone short message such as the red tape, network communication operation simple, more important is to the general u

8、ser provides a broad free/leave platform, let originally not kno</p><p>  【Key words】Instant Messaging System B/S C/S MySQL Socket Swing</p><p><b>  目 錄</b></p><p&g

9、t;<b>  前言1</b></p><p>  第一章 聊天系統(tǒng)概述1</p><p>  第一節(jié) 開發(fā)背景1</p><p>  第二節(jié) 開發(fā)目的和意義1</p><p>  第三節(jié) 論文研究?jī)?nèi)容2</p><p>  第四節(jié) 即時(shí)通訊系統(tǒng)的相關(guān)研究3</p>&

10、lt;p>  一 、C/S開發(fā)模式3</p><p>  二 、B/S開發(fā)模式3</p><p>  三 、即時(shí)通訊原理4</p><p>  四 、Java web 、Struts2、AJAX、JavaScript應(yīng)用技術(shù)4</p><p>  五 、MySQL數(shù)據(jù)庫(kù)應(yīng)用技術(shù)4</p><p>  六

11、 、socket通信技術(shù)4</p><p>  七 、開發(fā)環(huán)境的搭建5</p><p>  第三章 系統(tǒng)分析6</p><p>  第一節(jié) 系統(tǒng)基本功能描述6</p><p>  第二節(jié) 可行性分析6</p><p>  第三節(jié) 系統(tǒng)需求分析7</p><p><b>  

12、一 、功能分析7</b></p><p>  第四章 系統(tǒng)設(shè)計(jì)9</p><p>  第一節(jié) 數(shù)據(jù)庫(kù)設(shè)計(jì)9</p><p>  第二節(jié) 系統(tǒng)模塊設(shè)計(jì)10</p><p>  一 、聊天系統(tǒng)工作原理圖10</p><p>  二 、系統(tǒng)功能模塊圖:11</p><p>  

13、三 、系統(tǒng)用例圖:11</p><p>  四 、活動(dòng)圖:12</p><p>  第三節(jié) 系統(tǒng)類設(shè)計(jì)14</p><p>  一 、Message類的設(shè)計(jì)14</p><p>  二 、截圖類的設(shè)計(jì)15</p><p>  三 、聊天記錄類的設(shè)計(jì)16</p><p>  四 、服務(wù)

14、器線程類設(shè)計(jì)17</p><p>  第五章 系統(tǒng)實(shí)現(xiàn)18</p><p>  第一節(jié) 實(shí)現(xiàn)概況18</p><p>  第二節(jié) 注冊(cè)模塊18</p><p><b>  一 、流程圖18</b></p><p>  二 、關(guān)鍵代碼18</p><p>  第

15、三節(jié) 登錄模塊20</p><p><b>  一 、流程圖20</b></p><p>  二 、關(guān)鍵代碼20</p><p>  第四節(jié) 聊天模塊24</p><p><b>  一 、流程圖24</b></p><p>  二 、關(guān)鍵代碼24</p&g

16、t;<p>  第五節(jié) 文件模塊28</p><p><b>  一 、流程圖28</b></p><p>  二 、關(guān)鍵代碼28</p><p>  第六節(jié) 用戶管理模塊33</p><p><b>  一 、流程圖33</b></p><p>  

17、二 、關(guān)鍵代碼33</p><p>  第七節(jié) 其他功能的實(shí)現(xiàn)36</p><p>  一 、截圖功能的實(shí)現(xiàn)36</p><p>  二 、聊天記錄功能的實(shí)現(xiàn)37</p><p>  三 、服務(wù)端線程的實(shí)現(xiàn)38</p><p>  第八節(jié) 用戶界面的設(shè)計(jì)38</p><p>&l

18、t;b>  結(jié)論42</b></p><p><b>  致謝43</b></p><p><b>  參考文獻(xiàn)44</b></p><p>  附 錄 ………………………………………………………………………………………44</p><p>  一、英文原文………………

19、…………………………………………………………………44</p><p>  二、英文翻譯…………………………………………………………………………………51</p><p>  三、工程設(shè)計(jì)圖紙……………………………………………………………………………59</p><p>  四、源程序……………………………………………………………………………………60</p&

20、gt;<p>  五、其它………………………………………………………………………………………61</p><p><b>  前言</b></p><p>  隨著信息時(shí)代的到來(lái),信息的交流也與日俱增,網(wǎng)絡(luò)聊天工具已經(jīng)作為一種重要的信息交流工具,網(wǎng)絡(luò)通信軟件,正是由于它的安裝方便,只需要彼此之間都有連上網(wǎng)的電腦,安裝有相應(yīng)的客服端,就可以進(jìn)行信息交流;并

21、且可以實(shí)現(xiàn)與不同地區(qū),不同國(guó)家的人進(jìn)行交流目前,因此受到越來(lái)越多的網(wǎng)民的青睞。目前出現(xiàn)了很多非常不錯(cuò)的聊天工具,其中特別受青少年追捧的且應(yīng)用比較廣泛的有Facebook、騰訊QQ、MSN-Messager等等。無(wú)論是個(gè)人還是企業(yè)等組織機(jī)構(gòu),對(duì)溝通的需求也在不斷發(fā)展,比如大量信息資料的傳輸,甚至視頻通信等,傳統(tǒng)的電話、傳真、郵件等溝通方式顯然已無(wú)法滿足當(dāng)今人們工作和生活溝通的需要。隨著軟件、網(wǎng)絡(luò)和通訊三大現(xiàn)代信息技術(shù)的發(fā)展,在溝通、協(xié)作方

22、面有著更多方便、快捷、實(shí)時(shí)、免費(fèi)等優(yōu)勢(shì)的即時(shí)通訊,成為繼電話、E-Mail之后又一個(gè)完全融入每個(gè)人生活的互聯(lián)網(wǎng)工具。</p><p>  Java它最初被命名為Oak,是一個(gè)由Sun公司開發(fā)而成的新一代編程語(yǔ)言。隨著互聯(lián)網(wǎng)的發(fā)展,Sun看到了Oak在計(jì)算機(jī)網(wǎng)絡(luò)上的廣闊應(yīng)用前景,于是改造了Oak,以“Java”的名稱正式發(fā)布。使用它可在各式各樣不同種機(jī)器、不同種操作平臺(tái)的網(wǎng)絡(luò)環(huán)境中開發(fā)軟件。不論你使用的是哪一種WW

23、W瀏覽器,哪一種計(jì)算機(jī),哪一種操作系統(tǒng),只要WWW瀏覽器上面注明了“支持Java”,你就可以看到生動(dòng)的主頁(yè)。Java正在逐步成為Internet應(yīng)用的主要開發(fā)語(yǔ)言。它徹底改變了應(yīng)用軟件的開發(fā)模式,帶來(lái)了自PC機(jī)以來(lái)又一次技術(shù)革命,為迅速發(fā)展的信息世界增添了新的活力。</p><p>  第一章 基于java網(wǎng)絡(luò)聊天系統(tǒng)概述</p><p>  第一節(jié) 開發(fā)目的和意義</p>

24、<p>  網(wǎng)絡(luò)即時(shí)通訊(Instant Messenger,簡(jiǎn)稱IM),是指能夠即時(shí)發(fā)送和接收互聯(lián)網(wǎng)消息等的業(yè)務(wù)。自1998年面世以來(lái),特別是近幾年的迅速發(fā)展,通訊工具最初雖為聊天而誕生,但其作用早已超出了聊天的范疇,隨著企業(yè)即時(shí)通訊工具的出現(xiàn),即時(shí)通訊不再是一個(gè)單純的聊天工具,即時(shí)信息在網(wǎng)絡(luò)營(yíng)銷中將發(fā)揮更大的作用。是一種終端連往即時(shí)通訊網(wǎng)絡(luò)的服務(wù)。即時(shí)通訊不同于e-mail在于它的交談是即時(shí)的。逐漸集成了電子郵件、博客、音

25、樂(lè)、電視、游戲和搜索等多種功能。比如我們熟知的QQ聊天工具,它就是利用網(wǎng)絡(luò)通信技術(shù)開發(fā)的一款眾所周知的網(wǎng)絡(luò)聊天工具。在為網(wǎng)民帶來(lái)方便的同時(shí)也為騰訊帶來(lái)了豐富的利潤(rùn)。目前,信息交流是互聯(lián)網(wǎng)提供的主要內(nèi)容,網(wǎng)絡(luò)通信系統(tǒng)有多種實(shí)現(xiàn)方 式,類似ICQ屬于一種點(diǎn)對(duì)點(diǎn)的聊天系統(tǒng);還有一種是基于socket的集中式聊天系統(tǒng),這種聊天系統(tǒng)需要登錄統(tǒng)一的聊天服務(wù)器??紤]到要可以在局域網(wǎng)中應(yīng)用,本系統(tǒng)使用的是第二種方法,經(jīng)過(guò)設(shè)置,在局域網(wǎng)或internet

26、上都可以使用。</p><p>  第二節(jié) 主要研究技術(shù)</p><p><b>  一、 通訊連接原理</b></p><p>  在系統(tǒng)啟動(dòng)時(shí)首先驗(yàn)證登陸,如果成功,則建立與服務(wù)端的socket連接,客戶端與服務(wù)器是基于TCP/IP建立連接的,該協(xié)議是一種基于連接的協(xié)議,服務(wù)端新開啟一個(gè)線程專門客戶端服務(wù),客戶端將打包好的Message發(fā)送

27、給服務(wù)器端,服務(wù)器端根據(jù)Message里面的信息,再將信息轉(zhuǎn)發(fā)給其他用戶,它在幾臺(tái)計(jì)算機(jī)中提供了可靠的數(shù)據(jù)流,即標(biāo)準(zhǔn)的C/S模式。</p><p>  Socket程序的工作過(guò)程:</p><p>  1、建立Socket連接:在通信開始之前由通信雙方確認(rèn)身份,建立一條專用的虛擬連接通道。</p><p>  2、數(shù)據(jù)通信:利用虛擬連接通道傳送數(shù)據(jù)信息進(jìn)行通信。&l

28、t;/p><p>  3、關(guān)閉:通信結(jié)束時(shí),再將所建的虛擬連接拆除。</p><p><b>  具體如下:</b></p><p><b>  服務(wù)器</b></p><p>  圖 2-1 socket通信</p><p><b>  二、Swing技術(shù)</

29、b></p><p>  當(dāng)java1.0剛剛出現(xiàn)時(shí)還沒(méi)有swing,當(dāng)時(shí)的GUI基本編程庫(kù),sun取名叫AWT(Abstract Window Tookit),基本AWT庫(kù)處理用戶界面的方法是將這些元素的創(chuàng)建行為交給,底層操作系統(tǒng)的GUI工具箱進(jìn)行處理,來(lái)實(shí)現(xiàn)WORA的目的.而因?yàn)榉N種原因,不同的OS之間存在差異,使得AWT界面庫(kù)存在許多bug.1996年sun同netscape通力合作創(chuàng)建了新的庫(kù)取名

30、Swing.如果,沒(méi)有Swing,java的圖形就面就不名一文.swing是java的基礎(chǔ)類,是JFC的一部分,完整的JFC是很巨大的.包括的組件也很多.Swing具有更豐富而且更加方便的用戶界面元素集合,Swing對(duì)于底層平臺(tái)的依賴更少,因此,特殊平臺(tái)上的bug會(huì)很少,Swing會(huì)帶來(lái)交叉平臺(tái)上的統(tǒng)一的視覺(jué)體驗(yàn)。三、Java web和struts2技術(shù)</p><p>  Java Web,是用Java技術(shù)來(lái)

31、解決相關(guān)web互聯(lián)網(wǎng)領(lǐng)域的技術(shù)總和。web包括:web服務(wù)器和web客戶端兩部分。Java在客戶端的應(yīng)用有java applet,Java在服務(wù)器端的應(yīng)用非常的豐富,比如Servlet,JSP和第三方框架等等。Java技術(shù)對(duì)Web領(lǐng)域的發(fā)展注入了強(qiáng)大的動(dòng)力本系統(tǒng)采用B/S的結(jié)構(gòu)實(shí)現(xiàn)服務(wù)器端,對(duì)用戶和在線用戶進(jìn)行增刪改查,和踢用戶下線,以及開啟服務(wù)器和關(guān)閉服務(wù)器。</p><p><b>  四、系統(tǒng)的構(gòu)

32、建討論</b></p><p>  本系統(tǒng)在客戶端采用C/S結(jié)構(gòu),C/S結(jié)構(gòu)的優(yōu)點(diǎn)是能充分發(fā)揮客戶端PC的處理能力,很多工作可以在客戶端處理后再提交給服務(wù)器。對(duì)應(yīng)的優(yōu)點(diǎn)就是客戶端響應(yīng)速度快。缺點(diǎn)主要有以下幾個(gè): </p><p>  客戶端需要安裝專用的客戶端軟件。首先涉及到安裝的工作量,其次任何一臺(tái)電腦出問(wèn)題,如病毒、硬件損壞,都需要進(jìn)行安裝或維護(hù)。還有,系統(tǒng)軟件升級(jí)時(shí),每一

33、臺(tái)客戶機(jī)需要重新安裝,其維護(hù)和升級(jí)成本非常高。(大多數(shù)沒(méi)法自動(dòng)升級(jí)而需要人工升級(jí)) </p><p>  對(duì)客戶端的操作系統(tǒng)一般也會(huì)有限制??赡苓m應(yīng)于Windows 98,但不能用于Windows 2000或Windows XP?;蛘卟贿m用于微軟新的操作系統(tǒng)等等,更不用說(shuō)Linux、Unix等。而隨著互聯(lián)網(wǎng)的飛速發(fā)展,移動(dòng)辦公和分布式辦公越來(lái)越普及,這需要我們的系統(tǒng)具有擴(kuò)展性。這種方式遠(yuǎn)程訪問(wèn)需要專門的技術(shù),同時(shí)

34、要對(duì)系統(tǒng)進(jìn)行專門的設(shè)計(jì)來(lái)處理分布式的數(shù)據(jù)。 </p><p>  管理端采用B/S的結(jié)構(gòu), B/S結(jié)構(gòu)(Browser/Server結(jié)構(gòu))結(jié)構(gòu)即瀏覽器和服務(wù)器結(jié)構(gòu)。它是隨著Internet技術(shù)的興起,對(duì)C/S結(jié)構(gòu)的一種變化或者改進(jìn)的結(jié)構(gòu)。</p><p>  在這種結(jié)構(gòu)下,用戶工作界面是通過(guò)WWW瀏覽器來(lái)實(shí)現(xiàn),極少部分事務(wù)邏輯在前端(Browser)實(shí)現(xiàn),但是主要事務(wù)邏輯在服務(wù)器端(Ser

35、ver)實(shí)現(xiàn),形成所謂三層3-tier結(jié)構(gòu)。這樣就大大簡(jiǎn)化了客戶端電腦載荷,減輕了系統(tǒng)維護(hù)與升級(jí)的成本和工作量,降低了用戶的總體成本(TCO)。</p><p>  以目前的技術(shù)看,局域網(wǎng)建立B/S結(jié)構(gòu)的網(wǎng)絡(luò)應(yīng)用,并通過(guò)Internet/Intranet模式下數(shù)據(jù)庫(kù)應(yīng)用,相對(duì)易于把握、成本也是較低的。它是一次性到位的開發(fā),能實(shí)現(xiàn)不同的人員,從不同的地點(diǎn),以不同的接入方式(比如LAN, WAN, Internet/

36、Intranet等)訪問(wèn)和操作共同的數(shù)據(jù)庫(kù);它能有效地保護(hù)數(shù)據(jù)平臺(tái)和管理訪問(wèn)權(quán)限,服務(wù)器數(shù)據(jù)庫(kù)也很安全 。</p><p>  特別是在JAVA這樣的跨平臺(tái)語(yǔ)言出現(xiàn)之后,B/S架構(gòu)管理軟件更是方便、速度快、效果優(yōu)。</p><p>  用Tomcat 作為服務(wù)器,MySQL作為數(shù)據(jù)庫(kù),還使用到了WindowBuilder開源框架進(jìn)行界面開發(fā)。</p><p><

37、;b>  即時(shí)通訊原理</b></p><p>  登陸進(jìn)入聊天軟件后,即顯示出好友列表,在線的顯示亮頭像,不在線的顯示灰色頭像。雙擊好友頭像即會(huì)顯示出聊天界面。</p><p>  在聊天頁(yè)面上,有發(fā)送文字,發(fā)送截圖,和發(fā)送文件的功能按鈕。</p><p>  點(diǎn)擊“發(fā)送”按鈕之后,程序就會(huì)把輸入的信息的種類,信息內(nèi)容、本人的ID號(hào)、對(duì)方的ID號(hào)

38、以及當(dāng)前的時(shí)間等內(nèi)容打包成一個(gè)Message對(duì)象通過(guò)Socket發(fā)送到服務(wù)器端。</p><p>  服務(wù)器接收到Message之后,按照協(xié)議進(jìn)行解析和轉(zhuǎn)發(fā)。這樣,雙方的即時(shí)通訊就實(shí)現(xiàn)了。</p><p>  MySQL數(shù)據(jù)庫(kù)應(yīng)用技術(shù)</p><p>  使用MySQL存儲(chǔ)用戶信息,采用JDBC技術(shù)對(duì)其進(jìn)行增刪改查。</p><p><

39、b>  第3章 系統(tǒng)分析</b></p><p>  3.1 系統(tǒng)基本功能描述</p><p>  客戶端可以實(shí)現(xiàn)注冊(cè),即時(shí)聊天,相互之間收發(fā)文件,發(fā)送截圖,查看歷史聊天記錄等功能。收發(fā)消息時(shí),可以實(shí)現(xiàn)離線接收。</p><p>  服務(wù)器端應(yīng)當(dāng)建立一個(gè)ServerSocket,并且不斷進(jìn)行偵聽(tīng)是否有客戶端連接或者斷開連接(包括判斷沒(méi)有響應(yīng)的連接超

40、時(shí))。服務(wù)器端應(yīng)當(dāng)是一個(gè)信息發(fā)送中心,所有客戶端的信息都傳到服務(wù)器端,由服務(wù)器端根據(jù)要求分發(fā)信息。</p><p>  在后臺(tái)管理系統(tǒng),可以到對(duì)用戶進(jìn)行增刪改查,查看在線用戶,和踢用戶下線</p><p><b>  3.2 可行性分析</b></p><p>  本系統(tǒng)的可行性分析包括以下幾個(gè)方面的內(nèi)容:</p><p&g

41、t;<b>  (1) 技術(shù)可行性</b></p><p>  使用Swing 和socket技術(shù),可以很輕松地開發(fā)出實(shí)用、簡(jiǎn)便、高效的基于網(wǎng)絡(luò)的即時(shí)通訊系統(tǒng)。</p><p>  因此技術(shù)上是可以實(shí)現(xiàn)的。</p><p><b>  (2) 經(jīng)濟(jì)可行性</b></p><p>  計(jì)算機(jī)網(wǎng)絡(luò)已經(jīng)普

42、及,因此在網(wǎng)絡(luò)設(shè)備上不需要進(jìn)行大的投入。本系統(tǒng)需要一個(gè)MySQL數(shù)據(jù)庫(kù)服務(wù)器,由于并發(fā)使用人數(shù)比較少,tomcat可以作為web服務(wù)器,所以成本很低。</p><p><b>  (3) 操作可行性</b></p><p>  只要一臺(tái)以上計(jì)算機(jī)連接在同一個(gè)局域網(wǎng)內(nèi),本系統(tǒng)就可以安裝使用,所以操作上完全不存在問(wèn)題。如果要實(shí)現(xiàn)internet上通訊,只需要將服務(wù)器端運(yùn)行

43、在一個(gè)有固定IP的公網(wǎng)上就可以。</p><p>  綜上所述,即時(shí)Java即時(shí)通訊系統(tǒng)是可行的。</p><p>  3.3 系統(tǒng)需求分析</p><p><b>  3.3.1功能分析</b></p><p>  本系統(tǒng)要實(shí)現(xiàn)的功能如下:</p><p><b>  1)注冊(cè)<

44、/b></p><p>  服務(wù)器收到用戶的注冊(cè)請(qǐng)求,便開始接受客戶傳遞的信息,諸如客戶的呢稱,性別,籍貫,個(gè)人資料等,接受完畢后,便通過(guò)JDBC與后臺(tái)數(shù)據(jù)庫(kù)連接,然后向數(shù)據(jù)庫(kù)添加記錄,如果成功,便向客戶返回其號(hào)碼??蛻羰盏椒?wù)器返回的信息后,便打開窗口登陸。</p><p><b>  2)登陸</b></p><p>  在客戶端,用

45、戶輸入其號(hào)碼和密碼,然后建立與服務(wù)器的連接,告訴服務(wù)器我要登錄,服務(wù)器收到后,開始通過(guò)JDBC讀取數(shù)據(jù)庫(kù),然后與用戶輸入的信息進(jìn)行比對(duì),如果成功,便打開主程序窗口。然后客戶向服務(wù)器請(qǐng)求讀取好友名單,服務(wù)器收到該請(qǐng)求,從數(shù)據(jù)庫(kù)中取出好友列表,然后向客戶端發(fā)送這些信息,客戶收到后就在主窗口顯示好友。</p><p><b>  3)聊天</b></p><p>  客戶端

46、首先發(fā)送消息到服務(wù)器端,服務(wù)器端根據(jù)發(fā)送人信息和接收者信息來(lái)轉(zhuǎn)發(fā)。例如服務(wù)器接收到一個(gè)A發(fā)給B的消息,先判斷B是否已經(jīng)在線,如果在線就將信息發(fā)送過(guò)去。如果B不在線則把信息儲(chǔ)存在服務(wù)器,等B上線了在發(fā)送給他。B接收到A發(fā)來(lái)的信息,如果是未建立對(duì)話窗口,則自動(dòng)打開顯示。</p><p><b>  4)發(fā)送截圖</b></p><p>  客戶端A點(diǎn)擊截圖按鈕,將屏幕鎖定

47、,截取圖片,將圖片儲(chǔ)存在byte[]數(shù)組中發(fā)送到服務(wù)器端。服務(wù)器端根據(jù)發(fā)送人信息和接收者信息來(lái)轉(zhuǎn)發(fā)。B接收到A發(fā)來(lái)的截圖信息,會(huì)根據(jù)byte[]構(gòu)造圖片,將圖片顯示出來(lái)。同樣,如果是未建立對(duì)話窗口,則自動(dòng)打開顯示。</p><p><b>  5)發(fā)送文件</b></p><p>  客戶端A點(diǎn)擊發(fā)送文件按鍵,從本地選擇文件,將文件在byte[]數(shù)組中分批次發(fā)送到服務(wù)

48、器端。服務(wù)器端根據(jù)發(fā)送人信息和接收者信息來(lái)轉(zhuǎn)發(fā)。B接收到A發(fā)來(lái)的文件信息,會(huì)根據(jù)文件發(fā)送的狀態(tài)和byte[]構(gòu)造文件。</p><p><b>  6)日志</b></p><p>  客戶端發(fā)送和接收到的信息都會(huì)儲(chǔ)存在文本文檔中。默認(rèn)儲(chǔ)存在C盤下面,會(huì)以用戶的登錄賬號(hào)為名。</p><p><b>  7)對(duì)用戶的操作 </b

49、></p><p>  管理員通過(guò)B/S的系統(tǒng)對(duì)用戶進(jìn)行增加,修改,刪除,查找等操作,對(duì)系統(tǒng)進(jìn)行維護(hù)。</p><p>  8)在線用戶的操作 </p><p>  管理員通過(guò)B/S的系統(tǒng)對(duì)在線用戶操作,可以踢用戶下線。</p><p><b>  第4章 系統(tǒng)設(shè)計(jì)</b></p><p>

50、<b>  4.1 數(shù)據(jù)庫(kù)設(shè)計(jì)</b></p><p>  本系統(tǒng)中所涉及的主要實(shí)體及其屬性有:</p><p>  用戶(用戶賬號(hào),用戶名,密碼,個(gè)性簽名,頭像ID,年齡,性別) </p><p>  E-R模型如圖所示。</p><p>  圖 4-1系統(tǒng)實(shí)體及其屬性</p><p><

51、b>  表4-1 User</b></p><p>  4.2 系統(tǒng)模塊設(shè)計(jì)</p><p>  4.2.1 聊天系統(tǒng)工作原理圖</p><p>  圖 4-2 系統(tǒng)工作原理</p><p>  4.2.2 系統(tǒng)功能模塊圖:</p><p>  圖 4-3 系統(tǒng)模塊</p><p

52、>  4.2.3 系統(tǒng)用例圖:</p><p><b>  普通用戶的用例圖:</b></p><p>  圖 4-4 普通用戶用例圖</p><p>  后臺(tái)管理員的用例圖:</p><p>  圖 4-5 后臺(tái)用戶用例圖</p><p>  4.2.4 活動(dòng)圖:</p>&

53、lt;p><b>  1)用戶登陸活動(dòng)圖</b></p><p>  首先填寫登陸信息,提交以后服務(wù)器會(huì)對(duì)用戶名和密碼進(jìn)行驗(yàn)證。如果不正確,返回一個(gè)提示信息。如果登陸成功,就更新在線狀態(tài)。通知所有好友自己已經(jīng)上線。服務(wù)器再檢查是否有他的離線消息,如果有這立即發(fā)送給用戶。</p><p>  圖 4-6 用戶登錄活動(dòng)圖</p><p>&l

54、t;b>  2)發(fā)送消息活動(dòng)圖</b></p><p>  短消息發(fā)送以后,服務(wù)器端對(duì)應(yīng)的監(jiān)聽(tīng)線程會(huì)接收到一個(gè)數(shù)據(jù)包。此包中包含接收者的信息,如果接收者在線,數(shù)據(jù)包將會(huì)轉(zhuǎn)發(fā)到接收者。如果不在線,存在服務(wù)器端,等它上線在發(fā)送。</p><p>  圖 4-7發(fā)送消息活動(dòng)圖</p><p><b>  4.3 系統(tǒng)類設(shè)計(jì)</b>&

55、lt;/p><p>  4.3.1 Message類的設(shè)計(jì):客戶端和服務(wù)器端通信時(shí),發(fā)送的都是Message類的對(duì)象,因此Message類的設(shè)計(jì)很重要。</p><p>  表4-2 Message</p><p>  private Integer msgType消息的類型有這么幾種:</p><p>  public interface

56、MessageType {</p><p>  Integer message_succeed=1;//表明是登陸成功</p><p>  Integer message_login_fail=2;//表明登錄失敗</p><p>  Integer message_comm_mes=3;//普通信息包</p><p>  Integer m

57、essage_get_onLineFriend=4;//要求在線好友的包</p><p>  Integer message_ret_onLineFriend=5;//返回在線好友的包</p><p>  Integer message_offline=6;//下線通知包</p><p>  Integer message_img=7;//圖片包</p>

58、<p>  Integer message_file=8;//文件包</p><p><b>  }</b></p><p>  4.3.2 截圖類的設(shè)計(jì):</p><p><b>  截圖類的實(shí)現(xiàn)類為:</b></p><p>  class Screenshot extends

59、 JFrame implements MouseListener,MouseMotionListener。</p><p>  圖 4-8 Screenshot類</p><p>  截圖類的核心是JDK中:Robot類中createScreenCapture(Rectangle screenRect) 創(chuàng)建包含從屏幕中讀取的像素的圖像。</p><p>

60、;  先用截取全部屏幕的圖片,然后顯示出來(lái),覆蓋住整個(gè)屏幕。然后監(jiān)聽(tīng)鼠標(biāo)事件,再用createScreenCapture(Rectangle screenRect)方法截圖。</p><p>  雙擊表示截圖成功,右鍵表示取消截圖。</p><p>  4.3.3 聊天記錄類的設(shè)計(jì):</p><p>  記錄日志的功能被封裝在MessageRecord

61、類中,所在包為com.im.client.record,在發(fā)送或接受到數(shù)據(jù)后,將其寫入日志文件。</p><p>  圖 4-9 MessageRecord類</p><p>  如果是圖片則顯示出,發(fā)送時(shí)間和圖片大小。如果是文件則顯示出請(qǐng)求發(fā)送時(shí)間,同意接收時(shí)間,接收完成時(shí)間,和文件大小。 </p><p><b>  日志文件格式如下:<

62、;/b></p><p>  圖 4-10 記錄文件</p><p>  4.3.4 服務(wù)端線程的設(shè)計(jì):</p><p>  服務(wù)器端的核心是對(duì)應(yīng)客戶的線程,每個(gè)socket對(duì)應(yīng)一個(gè)線程,也就是每一個(gè)客戶端都在服務(wù)器端有一個(gè)相應(yīng)的線程。它負(fù)責(zé)轉(zhuǎn)發(fā)客戶端發(fā)來(lái)的消息。</p><p>  線程類為ClientThread:</p&

63、gt;<p>  表4-3 ClientThread類</p><p><b>  第5章 系統(tǒng)實(shí)現(xiàn)</b></p><p><b>  5.1 實(shí)現(xiàn)概況</b></p><p>  本系統(tǒng)可分為登錄、聊天、文件、用戶管理和注冊(cè)五個(gè)功能模塊?!暗卿洝蹦K為用戶提供登錄界面,并在用戶登錄顯示好友列表;“聊天”

64、模塊實(shí)現(xiàn)用戶的即時(shí)傳送信息,即多用戶即時(shí)聊天,可以發(fā)送文字或者截圖;“文件”模塊主要實(shí)現(xiàn)一用戶向另一用戶發(fā)送文件,對(duì)方可以選擇接受或者拒絕。聊天記錄會(huì)以文本文檔格式保存?!坝脩艄芾怼蹦K即管理員對(duì)用戶進(jìn)行增刪改查,和踢用戶下線的操作。</p><p>  下面詳細(xì)介紹各個(gè)模塊的具體實(shí)現(xiàn)。</p><p><b>  5.2 注冊(cè)模塊</b></p>&l

65、t;p><b>  5.2.1 流程圖</b></p><p>  圖 5-1 用戶注冊(cè)流程圖</p><p>  5.2.2 關(guān)鍵代碼</p><p>  注冊(cè)的前臺(tái)頁(yè)面是showDetail.jsp,后臺(tái)是UserAction類,UserAction類中有方法:</p><p>  public String

66、saveOrUpdate(){</p><p>  us.saveOrUpdate(user);</p><p>  return "refresh";</p><p><b>  }</b></p><p>  saveOrUpdate則是用到了Userservice里面的方法:</p>

67、<p>  public void saveOrUpdate(User u){</p><p>  System.out.println("u.getAccount()="+u.getAccount());</p><p>  if(u.getAccount()==null)</p><p>  ud.save(u);</p&

68、gt;<p>  else ud.update(u);</p><p><b>  }</b></p><p><b>  DAO類中的方法:</b></p><p>  public void save(User u){</p><p>  conn=getConnection();

69、</p><p><b>  try {</b></p><p>  ps=conn.prepareStatement(SAVE);</p><p>  ps.setString(1, u.getName());</p><p>  ps.setString(2, u.getPassword());</p>

70、<p>  ps.setString(3, u.getSignature());</p><p>  ps.setInt(4, 1);</p><p>  ps.setInt(5, u.getAge());</p><p>  ps.setString(6, u.getSex());</p><p>  ps.execute();

71、</p><p>  } catch (SQLException e) {</p><p>  // TODO Auto-generated catch block</p><p>  e.printStackTrace();</p><p><b>  }finally{</b></p><p>

72、;<b>  close();</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  網(wǎng)頁(yè)上顯示用戶的account</p><p>  圖 5-2 用戶注冊(cè)信息</p><p><b

73、>  5.3 登錄模塊</b></p><p><b>  5.3.1 流程圖</b></p><p>  圖 5-3 登錄流程圖</p><p>  5.3.2 關(guān)鍵代碼</p><p><b>  1)客戶端代碼</b></p><p>  登錄事件

74、是定義在class IMClientLogin extends JFrame 這個(gè)類的監(jiān)聽(tīng)事件中。登錄成功后,立即向服務(wù)器請(qǐng)求自己的好友列表。</p><p><b>  //登錄事件</b></p><p>  login.addActionListener(new ActionListener() {</p><p>  public vo

75、id actionPerformed(ActionEvent e) {</p><p>  //cus=new IMClientUserServer();</p><p>  //System.out.println(cus.getServer());</p><p>  User u=new User();</p><p>

76、  u.setAccount(Integer.parseInt(account.getText().trim()));</p><p>  u.setPassword(new String(passwordField.getPassword()));</p><p>  //登陸成功</p><p>  if(cus.checkLogin(u)){</

77、p><p>  //向服務(wù)器發(fā)送數(shù)據(jù)包,請(qǐng)求在線人得信息</p><p>  ClientConnToServerThread t=Manager.THREAD;</p><p>  Message m=new Message();</p><p>  m.setMsgType(MessageType.message_get_onLineFri

78、end);</p><p>  m.setSenderAccount(u.getAccount());</p><p><b>  try {</b></p><p>  t.send(m);</p><p>  } catch (IOException e1) {</p><p>  e1.pr

79、intStackTrace();</p><p><b>  }</b></p><p>  dispose();</p><p><b>  }</b></p><p><b>  else</b></p><p>  JOptionPane.

80、showMessageDialog(null, "用戶名或密碼錯(cuò)誤", "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);</p><p><b>  }</b></p><p><b>  });</b></p><p>  登錄邏輯是在public class I

81、MClientUserServer 里面,認(rèn)證成功者就會(huì)新建一個(gè)線程,專門負(fù)責(zé)接收服務(wù)器端發(fā)來(lái)的信息class ClientConnToServerThread extends Thread 。</p><p>  public boolean checkLogin(Object o) {</p><p>  boolean success=false;</p><p&

82、gt;  Message msg=(Message) server.sendLoginInfo(o);</p><p>  //System.out.println(msg.getMsgType());</p><p>  //System.out.println(MessageType.message_succeed);</p><p>  if(msg.

83、getMsgType().intValue()==MessageType.message_succeed.intValue()){</p><p>  success=true;</p><p>  User u=(User) o;</p><p>  //將好友列表放到管理器中,進(jìn)行上下線操作</p><p>  IMFriendList

84、 fl=new IMFriendList(msg.getMyself(),msg.getFriends());</p><p>  Manager.FRIEND_LIST=fl;</p><p>  //開啟客戶線程 ,接收服務(wù)器端的信息</p><p>  connThread =new ClientConnToServerThread(server.getSoc

85、ket());</p><p>  connThread.setSocket(server.getSocket());</p><p>  connThread.start();</p><p>  connThread.setName(u.getAccount()+"");</p><p>  Manager.THREA

86、D=connThread;</p><p><b>  }</b></p><p>  return success;</p><p><b>  }</b></p><p>  客戶端通過(guò)public class IMClientServer 類與服務(wù)器通信</p><p>

87、;  public Object sendLoginInfo(Object o) {</p><p><b>  try {</b></p><p>  ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());</p><p>  oos.writeOb

88、ject(o);</p><p>  ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());</p><p>  Message ms = (Message) ois.readObject();</p><p>  return ms;</p><p> 

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

90、><p>  return null;</p><p><b>  }</b></p><p>  這樣按照MVC的模式設(shè)計(jì),減小的系統(tǒng)耦合。</p><p><b>  2)服務(wù)端代碼</b></p><p>  服務(wù)器端接收用戶驗(yàn)證信息的代碼被寫在了一個(gè)線程public cl

91、ass ServerThread extends Thread中,這樣服務(wù)器就可以不停的監(jiān)聽(tīng)端口,接收來(lái)自不同客戶端的請(qǐng)求,建立socket連接,也不會(huì)堵塞在主線程當(dāng)中。</p><p>  從數(shù)據(jù)庫(kù)中搜索用戶,看是否存在</p><p>  public boolean checkLogin(User u){</p><p>  User user=ud.find

92、ById(u.getAccount());</p><p>  if(user!=null){</p><p>  return user.getPassword().equals(u.getPassword());</p><p><b>  }</b></p><p>  return false;</p>

93、;<p><b>  }</b></p><p>  如果驗(yàn)證成功,查找是否有他的離線消息,有就發(fā)送給他。然后在服務(wù)器上專門開啟一個(gè)針對(duì)當(dāng)前用戶的線程,并且吧線程放入管理類中,便于日后的管理。</p><p>  if (checkLogin(u)) {</p><p>  // 返回一個(gè)成功登陸的信息報(bào)</p>&

94、lt;p>  User myself=ud.findById(u.getAccount());</p><p>  m.setMsgType(MessageType.message_succeed);</p><p>  m.setMyself(myself);</p><p>  m.setFriends(ud.findAll());//好友列表</p

95、><p>  oos.writeObject(m);</p><p>  //為用戶單獨(dú)創(chuàng)建線程</p><p>  ClientThread t=new ClientThread(s);</p><p>  //查看是否有離線消息</p><p>  LinkedList<Message> list=OffL

96、ineMsgManager.get(u.getAccount());</p><p>  if(list!=null){</p><p>  for(Message msg:list){</p><p>  t.send(msg);</p><p><b>  }</b></p><p>  li

97、st.clear();</p><p><b>  }</b></p><p><b>  //開啟線程</b></p><p>  t.start();</p><p>  t.setName(u.getAccount()+"");</p><p>  

98、//把用戶線程放入管理類中</p><p>  ClientThreadManager.addClientThread(u.getAccount(), t);</p><p><b>  //通知其他的用戶</b></p><p>  t.notifyOnline();</p><p>  System.out.prin

99、tln(" 成功");</p><p><b>  } else {</b></p><p>  m.setMsgType(3);</p><p>  oos.writeObject(m);</p><p>  System.out.println(" 失敗");</p&

100、gt;<p>  // 關(guān)閉Socket</p><p>  s.close();</p><p><b>  }</b></p><p><b>  5.4 聊天模塊</b></p><p><b>  5.4.1 流程圖</b></p><

101、p>  圖 5-4 聊天流程圖</p><p>  5.4.2 關(guān)鍵代碼</p><p><b>  1)客服端代碼</b></p><p><b>  發(fā)送文字信息:</b></p><p>  客戶端發(fā)送和顯示信息的代碼被封裝在了IMChat extends JFrame impleme

102、nts ActionListener類中,其中發(fā)送文字信息的代碼</p><p>  //點(diǎn)擊的如果是發(fā)送button</p><p>  if (e.getSource() == confirmButton) {</p><p>  Message m=(Message) makePackage(MessageType.message_comm_mes,null)

103、;</p><p><b>  //發(fā)送</b></p><p>  sendMessage(m);</p><p>  //在自己的Ouput上顯示</p><p>  showMessage(m,Color.BLACK);</p><p><b>  //清空輸入</b>

104、</p><p>  input_textArea.setText("");</p><p><b>  }</b></p><p>  當(dāng)用戶點(diǎn)擊發(fā)送按鈕后,先把先把信息顯示在自己的聊天窗口上,后方發(fā)送信息,自己發(fā)送的信息和接收到的信息用不同的顏色顯示。</p><p>  顯示文字信息,顯示在Jt

105、extPane控件中 </p><p>  SimpleAttributeSet attrset = new SimpleAttributeSet();</p><p>  StyleConstants.setForeground(attrset,c);</p><p>  Document docs = output_pane.getDocument();<

106、/p><p>  // 利用getDocument()方法取得JTextPane的Document</p><p><b>  //一般信息</b></p><p>  if(m.getMsgType().intValue()==MessageType.message_comm_mes){</p><p>  Strin

107、g str=m.getSenderAccount() + " " +m.getTime()+"\n"+" "+ m.getContent()+ "\n";</p><p><b>  try {</b></p><p>  docs.insertString(docs.getLen

108、gth(), str, attrset);</p><p><b>  //設(shè)置光標(biāo)到末尾</b></p><p>  output_pane.setCaretPosition(docs.getLength());</p><p>  } catch (BadLocationException e) {</p><p>

109、  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  發(fā)送圖片信息:</b></p><p>  在發(fā)送圖片信息的時(shí)候,先將圖片轉(zhuǎn)換成為byte[]數(shù)組,包裝在信息包種發(fā)送出去,

110、接收到圖片信息時(shí),從byte[]數(shù)組構(gòu)建圖片,顯示出來(lái)。</p><p>  圖片和byte[]之間相互轉(zhuǎn)換的關(guān)鍵代碼如下:</p><p>  //將image轉(zhuǎn)換成 byte[]</p><p>  public byte[] imageToBytes(Image img){</p><p>  ByteArrayOutputStream

111、 bos=new ByteArrayOutputStream();</p><p><b>  try {</b></p><p>  ImageIO.write((RenderedImage) img, "jpg", bos);</p><p>  } catch (IOException e) {</p>

112、<p>  e.printStackTrace();</p><p><b>  }</b></p><p>  return bos.toByteArray();</p><p><b>  }</b></p><p>  //將 byte[]轉(zhuǎn)換成image</p>&l

113、t;p>  public Image bytesToImage(byte[] b){</p><p><b>  try {</b></p><p>  return ImageIO.read(new ByteArrayInputStream(b));</p><p>  } catch (IOException e) {</p&

114、gt;<p>  e.printStackTrace();</p><p><b>  }</b></p><p>  return null;</p><p><b>  }</b></p><p>  在JtextPane中顯示圖片的代碼:</p><p>

115、  if(m.getMsgType().intValue()==MessageType.message_img){</p><p><b>  //圖片信息</b></p><p>  String str=m.getSenderAccount() + " " +m.getTime()+ "\n";</p><

116、;p><b>  try {</b></p><p>  //顯示發(fā)送人 和時(shí)間</p><p>  docs.insertString(docs.getLength(), str, attrset);</p><p><b>  //設(shè)置光標(biāo)到末尾</b></p><p>  output_

117、pane.setCaretPosition(docs.getLength());</p><p>  output_pane.insertIcon(new ImageIcon(m.getImg()));</p><p>  docs.insertString(docs.getLength(), "\n", attrset);</p><p>&l

118、t;b>  //設(shè)置光標(biāo)到末尾</b></p><p>  output_pane.setCaretPosition(docs.getLength());</p><p>  } catch (BadLocationException e) {</p><p>  e.printStackTrace();</p><p>&

119、lt;b>  }</b></p><p><b>  }</b></p><p>  在客戶端顯示截圖示例:</p><p>  圖 5-5 聊天截圖</p><p><b>  2)服務(wù)端代碼</b></p><p>  服務(wù)端接收到客戶端的信息后,只需

120、要根據(jù)他的接收人,進(jìn)行轉(zhuǎn)發(fā)就可以。關(guān)鍵代碼如下:</p><p>  Message m = (Message) receive();</p><p>  // 如果是普通信息</p><p>  if (m.getMsgType() == MessageType.message_comm_mes.intValue()) {</p><p>

121、  System.out.println(m.getSenderAccount() + "send to"+ m.getReceiverAccount() + "at" + m.getTime());</p><p>  Integer receiverAccount = m.getReceiverAccount();</p><p>  Clien

122、tThread t = ClientThreadManager.getClientThread(receiverAccount);</p><p>  if (t == null) {</p><p>  //不在線就暫時(shí)存儲(chǔ)在服務(wù)器上</p><p>  OffLineMsgManager.putSingle(receiverAccount, m);</p&

123、gt;<p><b>  } else</b></p><p>  t.send(m);</p><p><b>  }</b></p><p><b>  5.5 文件模塊</b></p><p><b>  5.5.1 流程圖</b>&l

124、t;/p><p>  圖 5-6 發(fā)送文件流程圖</p><p>  5.5.2 關(guān)鍵代碼</p><p><b>  1)客戶端代碼</b></p><p>  在客戶端采用JfileChooser來(lái)瀏覽本地文件,點(diǎn)擊瀏覽按鈕后,會(huì)彈出對(duì)話框,讓用戶選擇文件,然后將文件名,大小等信息封裝在數(shù)據(jù)包里,發(fā)送出去。關(guān)鍵代碼如下

溫馨提示

  • 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論