版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p><b> 第1章 緒論3</b></p><p><b> 1.1選題背景3</b></p><p> 1.2目的和意義3</p><p> 第2章 系統(tǒng)概況4</p><p>
2、 2.1系統(tǒng)主要功能4</p><p> 2.2系統(tǒng)所用技術(shù)4</p><p> 2.2.1 Java技術(shù)4</p><p> 2.2.2 TCP/IP協(xié)議5</p><p> 2.2.3 JMF使用RTP協(xié)議5</p><p> 2.2.4 Mysql數(shù)據(jù)庫(kù)5</p><p
3、> 2.3系統(tǒng)運(yùn)行環(huán)境6</p><p> 第3章 系統(tǒng)分析6</p><p> 3.1關(guān)于系統(tǒng)分析6</p><p> 3.1.1可行性分析6</p><p> 3.2系統(tǒng)功能分析6</p><p> 3.2.1客戶端功能分析6</p><p> 3.2.2 服
4、務(wù)器功能分析7</p><p> 3.3系統(tǒng)流程圖7</p><p> 第4章 系統(tǒng)設(shè)計(jì)9</p><p> 4.1數(shù)據(jù)庫(kù)表設(shè)計(jì)9</p><p> 4.2 自定義XMPP協(xié)議9</p><p> 第5章 系統(tǒng)實(shí)現(xiàn)11</p><p> 5.1 客戶端實(shí)現(xiàn)11</
5、p><p> 5.1.1 登錄界面11</p><p> 5.1.2 用戶列表界面14</p><p> 5.1.3 聊天窗口及視頻界面16</p><p> 5.2 服務(wù)器端實(shí)現(xiàn)21</p><p> 5.2.1 服務(wù)器界面21</p><p> 第6章 結(jié)束語(yǔ)22<
6、/p><p><b> 參考文獻(xiàn)23</b></p><p><b> 多人聊天室設(shè)計(jì)</b></p><p> 摘要:在信息時(shí)代的今天,進(jìn)行信息交流已成為了人們?nèi)粘I钪胁豢扇鄙俚氖虑?,但是由于手機(jī)話費(fèi)的昂貴、發(fā)送手機(jī)短信的煩瑣,以及它們之間由于不及時(shí)性而造成了相應(yīng)的損失;網(wǎng)絡(luò)通信軟件由于安裝方便、操作簡(jiǎn)單,更重要的
7、是它給廣大的用戶提供了一個(gè)免費(fèi)交流的平臺(tái),這個(gè)平臺(tái)具有廣域性、及時(shí)性、高效性,因此受到了許多公司、企業(yè)院校的青睞,特別是廣大青年人的追捧;本論文介紹的就是一個(gè)基于TCP/IP協(xié)議、C/S模式、利用多線程、實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信的一個(gè)多人聊天室軟件,可以進(jìn)行私聊、群聊、視頻聊天等;</p><p> 關(guān)鍵字:Java;聊天室;線程;協(xié)議;</p><p><b> 第1章 緒論<
8、/b></p><p><b> 1.1選題背景</b></p><p> 隨著信息時(shí)代的到來(lái),信息的交流量也與日俱增。盡管一些通信工具,例如手機(jī),可以通過(guò)打電話或者發(fā)短信與對(duì)方進(jìn)行相應(yīng)的信息交流;但是對(duì)于大量的信息、長(zhǎng)時(shí)間或者“面對(duì)面”的交流,手機(jī)則不能適應(yīng)。</p><p> 網(wǎng)絡(luò)通信軟件,正是由于它的安裝方便,只需要彼此之間都
9、有連上網(wǎng)的電腦,安裝有相應(yīng)的客戶端,就可以進(jìn)行信息交流;并且它可以實(shí)現(xiàn)與一個(gè)人與多個(gè)不同國(guó)家、地方的人進(jìn)行交流,交流的過(guò)程中可以傳輸大量的信息資料,更加的方便快捷,也無(wú)需過(guò)多的通信費(fèi)用;甚至彼此之間還可以通信視頻實(shí)現(xiàn)“面對(duì)面” 的語(yǔ)音聊天,提供了更加親舒適的服務(wù);</p><p> 因此許多的公司、企業(yè)及院校都有相應(yīng)的網(wǎng)絡(luò)通信軟件,進(jìn)行日常的信息處理。特別受青少年追捧的網(wǎng)絡(luò)通信軟件就是騰訊公司的QQ,本論文所介
10、紹的多人聊天室就是在騰訊QQ的基礎(chǔ)上自己制作的一個(gè)實(shí)現(xiàn)了相應(yīng)功能的網(wǎng)絡(luò)通信軟件;</p><p><b> 1.2目的和意義</b></p><p> 1.網(wǎng)絡(luò)通信軟件可以為公司、企業(yè)及院校提供日常的信息處理服務(wù)??梢越鉀Q信息交流中的信息量大繁多,及時(shí)性,廣域性等相應(yīng)的問(wèn)題,為企業(yè)內(nèi)部的凝聚,與外界的交流以及以后的發(fā)展帶來(lái)了不可磨滅的功勞;</p>
11、<p> 2.網(wǎng)絡(luò)通信軟件也給用戶的日常生活帶了方便。用戶可以通過(guò)這種通信軟件找到自己的知己,并且可以和他們交流自己的知識(shí),興趣愛(ài)好等,也可以和自己的親戚、朋友、同學(xué)可以在聊天室里暢所欲言;</p><p><b> 第2章 系統(tǒng)概況</b></p><p><b> 2.1系統(tǒng)主要功能</b></p><p&
12、gt; 1.用戶登錄:用戶只有輸入正確的用戶賬號(hào)、密碼才有權(quán)利進(jìn)入到聊天室,輸入錯(cuò)誤則會(huì)出現(xiàn)相應(yīng)的提示;</p><p> 2.聊天:用戶指定相應(yīng)的在線用戶,輸入信息,點(diǎn)擊發(fā)送按鈕,即可將信息發(fā)送給對(duì)方;</p><p> 3.窗口抖動(dòng):聊天時(shí)點(diǎn)擊抖動(dòng)按鈕,即可使聊天對(duì)方的窗口出現(xiàn)一定時(shí)間的抖動(dòng)效果;</p><p> 4.視頻聊天:聊天雙方在有視頻的基礎(chǔ)上
13、,可以通過(guò)視頻來(lái)進(jìn)行“面對(duì)面”的聊天;</p><p><b> 2.2系統(tǒng)所用技術(shù)</b></p><p> 2.2.1 Java技術(shù)</p><p> Java是Sun公司于1995年推出的程序設(shè)計(jì)語(yǔ)言。Java分為三個(gè)體系J2SE(Java平臺(tái)標(biāo)準(zhǔn)版)、J2EE(Java平臺(tái)企業(yè)版)和J2ME(Java平臺(tái)微型版)。Java語(yǔ)言之所
14、以發(fā)展這么迅速,主要在于它跨平臺(tái)、開(kāi)源,在Java里面很多項(xiàng)目都是開(kāi)源的,就像Linux一樣,也可以說(shuō)是開(kāi)源推動(dòng)了它的進(jìn)一步發(fā)展。</p><p> Java在現(xiàn)在依然是很火的一門編程語(yǔ)言,主要在于它有如下特點(diǎn):</p><p> Java語(yǔ)言是簡(jiǎn)單的。它相對(duì)于C或C++來(lái)說(shuō)比較簡(jiǎn)單,它丟掉了C或C++里面的指針。</p><p> 它是面向?qū)ο蟮?。在Java
15、中可以認(rèn)為萬(wàn)事萬(wàn)物皆對(duì)象。</p><p> Java語(yǔ)言是分布式的。Java語(yǔ)言支持Internet應(yīng)用的開(kāi)發(fā),在基本的Java應(yīng)用編程接口中有一個(gè)網(wǎng)絡(luò)應(yīng)用編程接口(java net),它提供了用于網(wǎng)絡(luò)應(yīng)用編程的類庫(kù),包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(遠(yuǎn)程方法激活)機(jī)制也是開(kāi)發(fā)分布式應(yīng)用的重要手段。</p><p>
16、 Java語(yǔ)言也是動(dòng)態(tài)的。Java語(yǔ)言的設(shè)計(jì)目標(biāo)之一是適應(yīng)于動(dòng)態(tài)變化的環(huán)境。Java程序需要的類能夠動(dòng)態(tài)地被載入到運(yùn)行環(huán)境,也可以通過(guò)網(wǎng)絡(luò)來(lái)載入所需要的類。這也有利于軟件的升級(jí)。另外,Java中的類有一個(gè)運(yùn)行時(shí)刻的表示,能進(jìn)行運(yùn)行時(shí)刻的類型檢查。</p><p> 2.2.2 TCP/IP協(xié)議</p><p> TCP/IP(Transmission Control Protocol/
17、Internet Protocol)的簡(jiǎn)寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet最基本的協(xié)議、Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡(jiǎn)單地說(shuō),就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。TCP/IP 定義了電子設(shè)備(比如計(jì)算機(jī))如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)。TCP/IP是一個(gè)四層的分層體系結(jié)構(gòu)。高層為傳輸控制協(xié)議,它負(fù)責(zé)聚集信息或把文件拆分成更小的包。低層是網(wǎng)際協(xié)議
18、,它處理每個(gè)包的地址部分,使這些包正確的到達(dá)目的地。</p><p> 在多人聊天室中則是在這種協(xié)議基礎(chǔ)上實(shí)現(xiàn)的彼此之間的信息交流;</p><p> 2.2.3 JMF使用RTP協(xié)議</p><p> 實(shí)時(shí)傳輸協(xié)議RTP(Real-Time Transport Protocol)是針對(duì)Internet上多媒體數(shù)據(jù)流的一個(gè)傳輸協(xié)議,由IETF(Internet
19、工程任務(wù)小組)作為RFC1889發(fā)布。RTP被定義為在一對(duì)一或一對(duì)多的傳輸情況下工作,其目的是提供時(shí)間信息和實(shí)現(xiàn)流同步。RTP的典型應(yīng)用建立在UDP上,但也可以建立在TCP或ATP等其它協(xié)議之上工作。RTP本身只保證實(shí)時(shí)數(shù)據(jù)的傳輸,并不能為按順序傳送數(shù)據(jù)包提供可靠的傳送機(jī)制,也不提供流量控制或擁塞控制,它依靠RTCP提供這些服務(wù)。</p><p> 在多人聊天室中則是在這種通信協(xié)議的基礎(chǔ)上實(shí)現(xiàn)的視頻聊天;<
20、;/p><p> 2.2.4 Mysql數(shù)據(jù)庫(kù)</p><p> MySQL是一種開(kāi)放源代碼的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),MySQL數(shù)據(jù)庫(kù)系統(tǒng)使用最常用的數(shù)據(jù)庫(kù)管理語(yǔ)言--結(jié)構(gòu)化查詢語(yǔ)言(SQL)進(jìn)行數(shù)據(jù)庫(kù)管理。并且其速度、可靠性和適應(yīng)性都非常不錯(cuò),而且還有可視化的插件,便于建表和進(jìn)行其它的操作。多人聊天室中利用這種數(shù)據(jù)庫(kù)實(shí)現(xiàn)的數(shù)據(jù)保存;</p><p>&
21、lt;b> 2.3系統(tǒng)運(yùn)行環(huán)境</b></p><p> 硬件環(huán)境:個(gè)人計(jì)算機(jī)(內(nèi)存1G+)</p><p> 軟件環(huán)境:Eclipse 3.3 、JDK 1.6、Mysql 5.0 、Windows XP</p><p><b> 第3章 系統(tǒng)分析</b></p><p><b>
22、 3.1關(guān)于系統(tǒng)分析</b></p><p> 3.1.1可行性分析</p><p> 本軟件在計(jì)算機(jī)語(yǔ)言上采用的是當(dāng)前流行的Java語(yǔ)言,這種語(yǔ)言具有很好的跨平臺(tái)性,可以對(duì)不同的操作系統(tǒng)進(jìn)行兼容,只需要用戶的電腦上將有SUN公司開(kāi)發(fā)的JDK1.4以上的版本就可以運(yùn)行該程序;編輯器利用是Eclipse,這種編輯器具有很好的提示功能,支持插件,使用相當(dāng)方便;數(shù)據(jù)庫(kù)利用的是My
23、sql,這種數(shù)據(jù)庫(kù)易于安裝,所占的空間少,啟動(dòng)快,適合在局域網(wǎng);該軟件只需要一臺(tái)將有JDK1.4以上版本的電腦即可,經(jīng)濟(jì)上實(shí)惠;由于電腦技術(shù)的發(fā)展,人們素質(zhì)的提高,對(duì)于電腦的基本操作和維護(hù)都有了一定的基礎(chǔ),因此在維護(hù)上還是不成問(wèn)題;</p><p><b> 3.2系統(tǒng)功能分析</b></p><p> 3.2.1客戶端功能分析</p><p&
24、gt; 在客戶端我們根據(jù)軟件的需要可以從它所應(yīng)具有的界面?zhèn)€數(shù)來(lái)對(duì)它的功能進(jìn)行分析;</p><p><b> 第一個(gè) 登錄界面</b></p><p> 在這個(gè)界面上,有兩個(gè)輸入框一個(gè)是賬號(hào),一個(gè)是密碼;當(dāng)輸入完信息之后,點(diǎn)擊登錄按鈕,客戶端就會(huì)開(kāi)始與服務(wù)器與行連接;在這個(gè)過(guò)程中要完成兩件事情。一件是,客戶端取得與服務(wù)器的連接,如果服務(wù)器沒(méi)有開(kāi)啟或者網(wǎng)絡(luò)不通,自
25、然要給客戶端一個(gè)友好的提示信息;另一件是,取得連接之后客戶端將賬號(hào)及密碼信息發(fā)送給服務(wù)器,以確保該用戶是否存在,如果不存在則提示賬號(hào)或者密碼錯(cuò)誤,存在則進(jìn)入下一個(gè)界面,進(jìn)度條則會(huì)顯示整個(gè)處理的進(jìn)度情況;</p><p> 第二個(gè) 用戶列表界面</p><p> 這個(gè)界面是用戶成功登錄之后,展現(xiàn)該用戶自己信息及所有好友信息的界面,這是每一個(gè)用戶都必須有的界面,只有退出整個(gè)程序時(shí)這個(gè)界面才
26、會(huì)消息;在這個(gè)界面上提供給用戶進(jìn)行操作的則是,用戶可以根據(jù)自己的喜愛(ài)選擇好友列表中相應(yīng)的好友,雙擊頭像圖標(biāo)進(jìn)行聊天;</p><p><b> 第三個(gè) 聊天窗口</b></p><p> 這是整個(gè)多人聊天室的主要界面;這在這界面上負(fù)責(zé)將自己的消息通過(guò)發(fā)達(dá)信息框發(fā)送給對(duì)方,并將對(duì)方的信息顯示在信息顯示框內(nèi);另外這個(gè)窗口還有相應(yīng)的功能按鈕提供給用戶一些方便的操作。例如
27、抖動(dòng)按鈕,發(fā)送按鈕,視頻聊天選項(xiàng)等;點(diǎn)擊視頻聊天選項(xiàng)會(huì)出現(xiàn)相應(yīng)的視頻聊天窗口,點(diǎn)擊發(fā)送按鈕會(huì)將消息發(fā)送出去,點(diǎn)擊抖動(dòng)按鈕會(huì)使聊天對(duì)方的聊天窗口出現(xiàn)一段時(shí)間的抖動(dòng);</p><p> 3.2.2 服務(wù)器功能分析</p><p> 服務(wù)器的主要功能則是將客戶端發(fā)送過(guò)來(lái)的信息,進(jìn)行驗(yàn)證和轉(zhuǎn)發(fā),服務(wù)器處理的工作較多,要求性能較好;在服務(wù)器端主要有一個(gè)界面,這個(gè)界面負(fù)責(zé)啟動(dòng)服務(wù)器,并且在服務(wù)器啟
28、動(dòng)之后,會(huì)將所有存在的用戶信息包括賬號(hào)、密碼、頭像等信息顯示在表格上,以方便后臺(tái)的人員對(duì)用戶進(jìn)行相應(yīng)的操作;另外所有用戶發(fā)送給客戶端的信息都會(huì)在信息顯示框內(nèi)進(jìn)行顯示,以便查看整個(gè)通信過(guò)程;</p><p><b> 3.3系統(tǒng)流程圖</b></p><p> 為了更清楚地說(shuō)明系統(tǒng)框架,以便更好地說(shuō)明設(shè)計(jì)該系統(tǒng)的解決方案,我們給出了系統(tǒng)流程圖,如圖3.1。系統(tǒng)流程圖
29、展示了該系統(tǒng)客戶端與服務(wù)器之間的邏輯關(guān)系,其中主要介紹的是服務(wù)器如何處理消息的一個(gè)過(guò)程,并將在下面的的系統(tǒng)設(shè)計(jì)階段給出了相應(yīng)的消息設(shè)計(jì)(XMPP)。</p><p><b> 圖3.1</b></p><p> 由上圖可以看出,一個(gè)客戶端只要能過(guò)了賬號(hào)、密碼的驗(yàn)證就可以與其它相應(yīng)的客戶端取得聯(lián)系,進(jìn)行彼此之間的交流。而服務(wù)器為了單獨(dú)處理第個(gè)客戶端則利用了多線程技術(shù)
30、,使得每個(gè)客戶端的信息不至于混亂;</p><p><b> 第4章 系統(tǒng)設(shè)計(jì)</b></p><p><b> 4.1數(shù)據(jù)庫(kù)表設(shè)計(jì)</b></p><p><b> user 表:</b></p><p> friends 表:通過(guò)friends 表可以找到某個(gè)用戶的
31、所有朋友信息</p><p> 4.2 自定義XMPP協(xié)議</p><p> 1------>客戶端與服務(wù)器連接 a.沒(méi)有連接上則返回超時(shí),
32、60; b.連接上 密碼錯(cuò)誤則進(jìn)行提示 正確則返回個(gè)人信息、用戶列表并進(jìn)入用戶窗口 &
33、#160;
34、; 1-1 . 登錄請(qǐng)求 <msg>
35、 <type>login</type> <account>賬號(hào)</account> <pwd>密碼</pwd>
36、160; </msg> 1-2 . 登錄應(yīng)答 <msg> <type>login_response</type>
37、; <state>1表示成功,0表示失敗</state> </msg> 1-3 . 發(fā)送個(gè)人信息 <msg><type>user</type><
38、name>用戶名</name><account</p><p><b> 第5章 系統(tǒng)實(shí)現(xiàn)</b></p><p><b> 5.1 客戶端實(shí)現(xiàn)</b></p><p> 5.1.1 登錄界面</p><p><b> 關(guān)鍵代碼:</b><
39、/p><p> private void creatFrame() {</p><p> this.setTitle("QQ2011");</p><p> this.setSize(340, 250);</p><p> // 三個(gè)panel--加中一個(gè)布局管理器給圖片定位</p><p>
40、 JPanel pan1 = new JPanel(new java.awt.FlowLayout(0, 0, 0));</p><p> JPanel pan2 = new JPanel();</p><p> JPanel pan3 = new JPanel(new java.awt.FlowLayout(0, 10, 3));</p><p> // p
41、an2上的三個(gè)jpanel</p><p> JPanel pan4 = new JPanel();</p><p> JPanel pan5 = new JPanel();</p><p> JPanel pan6 = new JPanel();</p><p> // pan1上的標(biāo)簽---要標(biāo)簽上加一張圖片</p>
42、<p> JLabel lab1 = new JLabel();</p><p> javax.swing.ImageIcon img1 = new javax.swing.ImageIcon(</p><p> "images//login1.jpg");</p><p> lab1.setIcon(img1);</p
43、><p> // 在三個(gè)jpanel上設(shè)圖片和背景</p><p> pan1.add(lab1);</p><p> pan2.setBackground(new java.awt.Color(228, 244, 255));</p><p> pan3.setBackground(new java.awt.Color(194, 255
44、, 250));</p><p><b> // 設(shè)組件</b></p><p> JLabel name_label = new JLabel("賬號(hào):");</p><p> name_label.setFont(new java.awt.Font("宋體", Font.TRUETYPE_FON
45、T, 12));</p><p> text = new JTextField(15);</p><p> JLabel reg_label = new JLabel(" 注冊(cè)賬號(hào)");</p><p> reg_label.setFont(new java.awt.Font("宋體", Font.TRUETYPE_FO
46、NT, 12));</p><p> JLabel pwd_label = new JLabel("密碼:");</p><p> pwd_label.setFont(new java.awt.Font("宋體", Font.TRUETYPE_FONT, 12));</p><p> pwd = new JPasswor
47、dField(15);</p><p> JLabel mod_label = new JLabel(" 修改密碼");</p><p> mod_label.setFont(new java.awt.Font("宋體", Font.TRUETYPE_FONT, 12));</p><p><b> // 進(jìn)度
48、條</b></p><p> JProgressBar bar = new JProgressBar();</p><p> JProBar prob=new JProBar(bar);</p><p><b> //啟動(dòng)進(jìn)度條</b></p><p> prob.start();</p>
49、<p> bar.setBackground(Color.red);</p><p> JLabel bar_label = new JLabel(" ");</p><p> JButton set_bt = new JButton("設(shè)置");</p><p> set_bt.setSize(6
50、0, 5);</p><p> set_bt.setFont(new java.awt.Font("宋體", Font.TRUETYPE_FONT, 12));</p><p> JLabel empty_label = new JLabel(</p><p> "
51、 ");</p><p> // 給登錄按鈕、密碼輸入框注冊(cè)偵聽(tīng)器</p><p> JButton log_bt = new JButton("登錄");</p><p> LoginButtonListener listener = new LoginButtonListener
52、(this);</p><p> log_bt.addActionListener(listener);</p><p> pwd.addActionListener(listener);</p><p> log_bt.setSize(60, 5);</p><p> log_bt.setFont(new java.awt.Font
53、("宋體", Font.TRUETYPE_FONT, 12));</p><p> // 將組件加到pan4,pan5,pan6,pan3上</p><p> pan4.add(name_label);</p><p> pan4.add(text);</p><p> pan4.add(reg_label);&l
54、t;/p><p> pan5.add(pwd_label);</p><p> pan5.add(pwd);</p><p> pan5.add(mod_label);</p><p> pan6.add(bar);</p><p> pan6.add(bar_label);</p><p&g
55、t; pan3.add(set_bt, BorderLayout.WEST);</p><p> pan3.add(empty_label, BorderLayout.CENTER);</p><p> pan3.add(log_bt, BorderLayout.EAST);</p><p> // pan4,pan5,pan6加到pan2上</p&g
56、t;<p> pan2.add(pan4, BorderLayout.NORTH);</p><p> pan2.add(pan5, BorderLayout.CENTER);</p><p> pan2.add(pan6, BorderLayout.SOUTH);</p><p> // 三個(gè)jpanel的位置 北 中</p>
57、<p> this.add(pan1, BorderLayout.NORTH);</p><p> this.add(pan2, BorderLayout.CENTER);</p><p> this.add(pan3, BorderLayout.SOUTH);</p><p> this.setDefaultCloseOperation(3);/
58、/ 關(guān)閉窗口時(shí)退出運(yùn)行</p><p> this.setLocationRelativeTo(null);// 位于窗口的中間</p><p> this.setVisible(true);// 可視</p><p> this.setResizable(false);// 設(shè)定窗口不可改變大小</p><p><b>
59、}</b></p><p> 5.1.2 用戶列表界面</p><p><b> 關(guān)鍵代碼:</b></p><p> private JTree getJTree0() {</p><p> if (jTree0 == null) {</p><p> jTree0 = n
60、ew JTree();</p><p> DefaultTreeModel treeModel = null;</p><p><b> { // 根結(jié)點(diǎn)</b></p><p> DefaultMutableTreeNode root = new DefaultMutableTreeNode("好友列表");<
61、/p><p> // 根據(jù)好友列表建樹(shù)</p><p> // 第一層,好友類型</p><p> for (int i = 0; i < 2; i++) {</p><p> DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(</p><p>
62、; data[i][0]);</p><p> // 第二層,好友名字</p><p> for (int j = 0; j < 1; j++) {</p><p> DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(</p><p> data[i][1]);
63、</p><p> node1.add(node2);</p><p><b> }</b></p><p> root.add(node1);</p><p><b> }</b></p><p><b> // 表模型</b></p&
64、gt;<p> treeModel = new DefaultTreeModel(root);</p><p><b> }</b></p><p> // 給葉節(jié)點(diǎn)加上圖片</p><p> ImageIcon image = new ImageIcon("images/163.gif");</
65、p><p> DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();</p><p> renderer.setLeafIcon(image);</p><p> jTree0.setCellRenderer(renderer);</p><p> // 給節(jié)點(diǎn)加
66、上雙擊事件</p><p> jTree0.addMouseListener(new MouseAdapter() {</p><p> public void mouseClicked(MouseEvent e) {</p><p> if (e.getClickCount() == 2) {</p><p><b> /
67、/ 點(diǎn)擊路徑</b></p><p> TreePath path = jTree0.getPathForLocation(e.getX(), e</p><p><b> .getY());</b></p><p> // 根據(jù)路徑得到節(jié)點(diǎn)</p><p> TreeNode node = (Tre
68、eNode) path.getLastPathComponent();</p><p><b> // 葉節(jié)點(diǎn)1</b></p><p> if ((node.toString()).equals(data[0][1])) {</p><p> if (frame == null) {</p><p> fram
69、e = new ChatFrame(1,data,per,session);</p><p><b> }</b></p><p><b> }</b></p><p><b> // 葉節(jié)點(diǎn)2</b></p><p> if ((node.toString()).eq
70、uals(data[1][1])) {</p><p> if (frame2 == null) {</p><p> frame2 = new ChatFrame(2,data,per,session);</p><p><b> }</b></p><p><b> }</b></
71、p><p><b> }</b></p><p><b> }</b></p><p><b> });</b></p><p> jTree0.setModel(treeModel);</p><p><b> }</b>&
72、lt;/p><p> return jTree0;</p><p><b> }</b></p><p> 5.1.3 聊天窗口及視頻界面</p><p> FMJ視頻聊天室的實(shí)現(xiàn)</p><p> 視頻聊天整體結(jié)構(gòu)分析</p><p><b> 整體流程
73、圖示:</b></p><p> 服務(wù)器和客戶機(jī)通過(guò)基于UDP的RTP通信協(xié)議傳輸媒體流數(shù)據(jù),在建立RTP會(huì)話之前,先建立一個(gè)Socket連接,以發(fā)送接收其它請(qǐng)求消息,如要發(fā)送多媒體數(shù)據(jù)的請(qǐng)求和應(yīng)答消息。發(fā)送視頻請(qǐng)求消息和完成應(yīng)答之后,服務(wù)器利用客戶機(jī)發(fā)上來(lái)的消息建立RTP會(huì)話,因此在視頻請(qǐng)求的消息中應(yīng)包含客戶機(jī)的地址、端口等消息,以供服務(wù)器建立RTP會(huì)話??蛻魴C(jī)也要和服務(wù)器建立對(duì)應(yīng)的RTP會(huì)話,這
74、樣,視頻數(shù)據(jù)流就可以通過(guò)RTP會(huì)話傳輸:</p><p><b> 關(guān)鍵代碼:</b></p><p><b> /**</b></p><p><b> * 本地播放的方法</b></p><p> * @param:dataSource 要初始化的數(shù)據(jù)源</p
75、><p><b> */</b></p><p> public void playSource() {</p><p><b> try {</b></p><p> // 創(chuàng)建一個(gè)播放器對(duì)象</p><p> player = javax.media.Manager
76、.createPlayer(dataSource);</p><p> // 創(chuàng)建一個(gè)播放器的控制器監(jiān)聽(tīng)器對(duì)象</p><p> MyRTPListener l = new MyRTPListener(player, ServerStart.jf,</p><p> ServerStart.panel);</p><p> // 給播
77、放器對(duì)象注冊(cè)控制器監(jiān)聽(tīng)器</p><p> player.addControllerListener(l);</p><p><b> // 開(kāi)始播放</b></p><p> player.start();</p><p> } catch (Exception e) {</p><p>
78、; e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p> * 實(shí)現(xiàn)監(jiān)聽(tīng)器接口中的方法.此方法可通知應(yīng)用程序?qū)Σシ牌鞯氖录龀龇磻?yīng)</p&g
79、t;<p><b> */</b></p><p> public synchronized void controllerUpdate(ControllerEvent e) {</p><p> if (e instanceof javax.media.RealizeCompleteEvent) {</p><p> C
80、omponent comp;</p><p> // 得到播放器的可視容器,即播放器顯示視頻的容器</p><p> if ((comp = player.getVisualComponent()) != null) {</p><p> // 將可視容器加到窗體上</p><p> panel.add("Center&qu
81、ot;, comp);</p><p><b> }</b></p><p> // 得到播放器的控制面板容器</p><p> if ((comp = player.getControlPanelComponent()) != null) {</p><p><b> // 添加到窗體上</b&
82、gt;</p><p> panel.add("South", comp);</p><p><b> }</b></p><p><b> // 刷新窗體</b></p><p> jf.validate();</p><p><b>
83、 } </b></p><p><b> }</b></p><p><b> /**</b></p><p> * 初始化RTP會(huì)話</p><p><b> * </b></p><p><b> * @return
84、</b></p><p><b> */</b></p><p> protected boolean initialize() {</p><p><b> try {</b></p><p> mgrs = new RTPManager[sessions.length];&l
85、t;/p><p> SessionLabel session;</p><p><b> // 打開(kāi)會(huì)話</b></p><p> for (int i = 0; i < sessions.length; i++) {</p><p><b> // 解析會(huì)話地址</b></p>
86、;<p><b> try {</b></p><p> session = new SessionLabel(sessions[i]);</p><p> } catch (IllegalArgumentException e) {</p><p> System.err</p><p> .p
87、rintln("Failed to parse the session address given: "</p><p> + sessions[i]);</p><p> return false;</p><p><b> }</b></p><p> System.err.println
88、(" - Open RTP session for: addr: "</p><p> + session.addr + " port: " + session.port + " ttl: "</p><p> + session.ttl);</p><p> mgrs[i] = (RTPManag
89、er) RTPManager.newInstance();</p><p> mgrs[i].addSessionListener(this);</p><p> mgrs[i].addReceiveStreamListener(this);</p><p> // 初始化 RTPManager用 RTPSocketAdapter</p><
90、;p> mgrs[i].initialize(new RTPSocketAdapter(InetAddress</p><p> .getByName(session.addr), session.port, session.ttl));</p><p> BufferControl bc = (BufferControl) mgrs[i]</p><p&g
91、t; .getControl("javax.media.control.BufferControl");</p><p> if (bc != null)</p><p> bc.setBufferLength(350);</p><p><b> }</b></p><p> } catc
92、h (Exception e) {</p><p> System.err.println("Cannot create the RTP Session: "</p><p> + e.getMessage());</p><p> return false;</p><p><b> }</b&g
93、t;</p><p> // 等待數(shù)據(jù)到達(dá).</p><p> long then = System.currentTimeMillis();</p><p> long waitingPeriod = 30000; // wait for a maximum of 30 secs.</p><p><b> try {&l
94、t;/b></p><p> synchronized (dataSync) {</p><p> while (!dataReceived</p><p> && System.currentTimeMillis() - then < waitingPeriod) {</p><p> if (!data
95、Received)</p><p> System.err</p><p> .println(" - Waiting for RTP data to arrive");</p><p> dataSync.wait(1000);</p><p><b> }</b></p>
96、<p><b> }</b></p><p> } catch (Exception e) {</p><p><b> }</b></p><p> if (!dataReceived) {</p><p> System.err.println("No RTP da
97、ta was received.");</p><p><b> close();</b></p><p> return false;</p><p><b> }</b></p><p> return true;</p><p><b>
98、}</b></p><p> 5.2 服務(wù)器端實(shí)現(xiàn)</p><p> 5.2.1 服務(wù)器界面</p><p><b> 關(guān)鍵代碼:</b></p><p><b> /**</b></p><p> * 處理客戶端端來(lái)的消息</p><
99、;p><b> */</b></p><p> private void readFromClient() {</p><p> while (true) {</p><p><b> try {</b></p><p> // 讀取客戶端的消息--截取消息類型</p>
100、<p> r_msg = readMsg(ins);</p><p> String type = Xmpp.getXMLValue(r_msg, "type");</p><p> // ............ 根據(jù)消息類型</p><p> // ------------進(jìn)行處理</p><p>
101、<b> // 1.登錄消息</b></p><p> if (type.equals("login")) {</p><p> loginMsg();</p><p><b> }</b></p><p><b> // 2.聊天消息</b>&l
102、t;/p><p> if (type.equals("chat")) {</p><p> chatMsg(r_msg);</p><p><b> }</b></p><p><b> // 3.抖動(dòng)消息</b></p><p> if (type
103、.equals("shake")) {</p><p> shakeMsg(r_msg);</p><p><b> }</b></p><p><b> // 4.視頻請(qǐng)求</b></p><p> if (type.equals("vidio"))
104、 {</p><p> vidioMsg(r_msg);</p><p><b> }</b></p><p> // 5.轉(zhuǎn)發(fā)視頻響應(yīng)消息</p><p> if (type.equals("vidio_response")) {</p><p> // 得到該消息
105、發(fā)送給誰(shuí)</p><p> String friendaccount = Xmpp.getXMLValue(r_msg,</p><p> "friendaccount");</p><p> // 將該消息轉(zhuǎn)發(fā)給對(duì)應(yīng)的人</p><p> Tool.sendMsg(r_msg, friendaccount);&l
106、t;/p><p><b> }</b></p><p> } catch (IOException e) {</p><p> Logger.Exception("讀取客戶端消息時(shí)異常!");</p><p> e.printStackTrace();</p><p>
107、// 捕獲異常后---結(jié)束線程里的方法--并處理相應(yīng)信息</p><p> Tool.thread_list.remove(this);</p><p> Tool.user_list.remove(u);</p><p> System.out.println(u.getName() + "退出");</p><p&g
108、t;<b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 第6章 結(jié)束語(yǔ)</b></p>
109、<p> 聊天軟件對(duì)大家來(lái)說(shuō)應(yīng)該是相當(dāng)熟悉,特別是騰訊QQ的興起,讓很多的人對(duì)這種軟件樂(lè)不思蜀。它的這種新穎的設(shè)計(jì),以及給公司帶來(lái)的巨大利潤(rùn),讓許多從事軟件行業(yè)的人看到的期望。本人當(dāng)初制作這個(gè)多人聊天室的時(shí)候也是仿制騰訊QQ的設(shè)計(jì)風(fēng)格而開(kāi)始的。像這種聊天軟件,要將界面做成非常的炫麗,并且具有很好的人性化,并非一人之力,一時(shí)的功夫就能做好的;</p><p> 本人制作的這個(gè)多人聊天室,只實(shí)現(xiàn)了視頻,
110、聊天,抖動(dòng)等功能,其它的功能由于能力,時(shí)間有限所以并沒(méi)有進(jìn)行設(shè)計(jì)了;但是在這幾項(xiàng)功能的實(shí)現(xiàn)過(guò)程當(dāng)中也碰到了許多的問(wèn)題;特別是多線程這一塊,用的不好就會(huì)造成死鎖的現(xiàn)象,因此在這個(gè)方面找錯(cuò)時(shí)花費(fèi)的時(shí)間也是相對(duì)較多;在實(shí)現(xiàn)視頻這一塊的時(shí)候,由于對(duì)這種新的RTCP/IP協(xié)議不是很熟悉,一開(kāi)始在這個(gè)上面有卡住了,之后在自己查閱了相關(guān)的資料,并向同學(xué)請(qǐng)教之后,最終還是將這一塊給拿下了。</p><p> 在寫畢業(yè)論文時(shí)我深
111、深體會(huì)到搞設(shè)計(jì)的艱辛與困難。由于我的理論知識(shí)還很欠缺,在論文里也有不少的錯(cuò)誤。在以后的工作中我會(huì)更加的努力學(xué)習(xí)來(lái)彌補(bǔ)我現(xiàn)在的不足之處。</p><p> 大學(xué)即將接近尾聲,有得也有失;但是在這個(gè)學(xué)習(xí)的過(guò)程當(dāng)中能夠找到自己的興趣愛(ài)好,并且找到自己喜歡的職業(yè),那就是最好的;</p><p><b> 參考文獻(xiàn)</b></p><p> [1]
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java聊天室畢業(yè)論文
- 畢業(yè)論文asp聊天室
- 聊天室(java)-畢業(yè)論文
- 畢業(yè)論文 java聊天室的設(shè)計(jì)
- jsp在線聊天室-畢業(yè)論文
- 基于web的聊天室畢業(yè)論文
- 畢業(yè)論文——網(wǎng)上聊天室
- 基于web的聊天室畢業(yè)論文
- 畢業(yè)論文---網(wǎng)絡(luò)聊天室的規(guī)劃和設(shè)計(jì)
- 基于web的聊天室構(gòu)建畢業(yè)論文
- 畢業(yè)論文——網(wǎng)上聊天室 (3)
- 畢業(yè)論文——網(wǎng)上聊天室 (3)
- 畢業(yè)論文——網(wǎng)上聊天室 (2)
- 畢業(yè)論文——網(wǎng)上聊天室 (3)
- 基于java的聊天室設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 基于java的聊天室設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- java局域網(wǎng)聊天室系統(tǒng)畢業(yè)論文
- 聊天室畢業(yè)設(shè)計(jì)(論文)說(shuō)明書
- 聊天室系統(tǒng)畢業(yè)設(shè)計(jì)
- java聊天室設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論