




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、目錄第1章 緒論31.1選題背景31.2目的和意義3第2章 系統(tǒng)概況42.1系統(tǒng)主要功能42.2系統(tǒng)所用技術(shù)42.2.1 Java技術(shù)42.2.2 TCP/IP協(xié)議52.2.3 JMF使用RTP協(xié)議52.2.4 Mysql數(shù)據(jù)庫52.3系統(tǒng)運(yùn)行環(huán)境6第3章 系統(tǒng)分析63.1關(guān)于系統(tǒng)分析63.1.1可行性分析63.2系統(tǒng)功能分析63.2.1客戶端功能分析63.2.2 服務(wù)器功能分析73.3系統(tǒng)流程圖7第4章 系統(tǒng)設(shè)計(jì)94.1數(shù)據(jù)庫表設(shè)計(jì)94.2 自定義XMPP協(xié)議9第5章 系統(tǒng)實(shí)現(xiàn)115.1 客戶端實(shí)現(xiàn)115.1.1 登錄界面115.1.2 用戶列表界面145.1.3 聊天窗口及視頻界面165.
2、2 服務(wù)器端實(shí)現(xiàn)215.2.1 服務(wù)器界面21第6章 結(jié)束語22參考文獻(xiàn)23多人聊天室設(shè)計(jì)摘要:在信息時(shí)代的今天,進(jìn)行信息交流已成為了人們?nèi)粘I钪胁豢扇鄙俚氖虑?,但是由于手機(jī)話費(fèi)的昂貴、發(fā)送手機(jī)短信的煩瑣,以及它們之間由于不及時(shí)性而造成了相應(yīng)的損失;網(wǎng)絡(luò)通信軟件由于安裝方便、操作簡單,更重要的是它給廣大的用戶提供了一個(gè)免費(fèi)交流的平臺,這個(gè)平臺具有廣域性、及時(shí)性、高效性,因此受到了許多公司、企業(yè)院校的青睞,特別是廣大青年人的追捧;本論文介紹的就是一個(gè)基于TCP/IP協(xié)議、C/S模式、利用多線程、實(shí)現(xiàn)點(diǎn)對點(diǎn)通信的一個(gè)多人聊天室軟件,可以進(jìn)行私聊、群聊、視頻聊天等;關(guān)鍵字:Java;聊天室;線程;
3、協(xié)議;第1章 緒論1.1選題背景隨著信息時(shí)代的到來,信息的交流量也與日俱增。盡管一些通信工具,例如手機(jī),可以通過打電話或者發(fā)短信與對方進(jìn)行相應(yīng)的信息交流;但是對于大量的信息、長時(shí)間或者“面對面”的交流,手機(jī)則不能適應(yīng)。網(wǎng)絡(luò)通信軟件,正是由于它的安裝方便,只需要彼此之間都有連上網(wǎng)的電腦,安裝有相應(yīng)的客戶端,就可以進(jìn)行信息交流;并且它可以實(shí)現(xiàn)與一個(gè)人與多個(gè)不同國家、地方的人進(jìn)行交流,交流的過程中可以傳輸大量的信息資料,更加的方便快捷,也無需過多的通信費(fèi)用;甚至彼此之間還可以通信視頻實(shí)現(xiàn)“面對面” 的語音聊天,提供了更加親舒適的服務(wù);因此許多的公司、企業(yè)及院校都有相應(yīng)的網(wǎng)絡(luò)通信軟件,進(jìn)行日常的信息處
4、理。特別受青少年追捧的網(wǎng)絡(luò)通信軟件就是騰訊公司的QQ,本論文所介紹的多人聊天室就是在騰訊QQ的基礎(chǔ)上自己制作的一個(gè)實(shí)現(xiàn)了相應(yīng)功能的網(wǎng)絡(luò)通信軟件;1.2目的和意義1.網(wǎng)絡(luò)通信軟件可以為公司、企業(yè)及院校提供日常的信息處理服務(wù)??梢越鉀Q信息交流中的信息量大繁多,及時(shí)性,廣域性等相應(yīng)的問題,為企業(yè)內(nèi)部的凝聚,與外界的交流以及以后的發(fā)展帶來了不可磨滅的功勞;2.網(wǎng)絡(luò)通信軟件也給用戶的日常生活帶了方便。用戶可以通過這種通信軟件找到自己的知己,并且可以和他們交流自己的知識,興趣愛好等,也可以和自己的親戚、朋友、同學(xué)可以在聊天室里暢所欲言;第2章 系統(tǒng)概況2.1系統(tǒng)主要功能1.用戶登錄:用戶只有輸入正確的用戶
5、賬號、密碼才有權(quán)利進(jìn)入到聊天室,輸入錯誤則會出現(xiàn)相應(yīng)的提示;2.聊天:用戶指定相應(yīng)的在線用戶,輸入信息,點(diǎn)擊發(fā)送按鈕,即可將信息發(fā)送給對方;3.窗口抖動:聊天時(shí)點(diǎn)擊抖動按鈕,即可使聊天對方的窗口出現(xiàn)一定時(shí)間的抖動效果;4.視頻聊天:聊天雙方在有視頻的基礎(chǔ)上,可以通過視頻來進(jìn)行“面對面”的聊天;2.2系統(tǒng)所用技術(shù)2.2.1 Java技術(shù)Java是Sun公司于1995年推出的程序設(shè)計(jì)語言。Java分為三個(gè)體系J2SE(Java平臺標(biāo)準(zhǔn)版)、J2EE(Java平臺企業(yè)版)和J2ME(Java平臺微型版)。Java語言之所以發(fā)展這么迅速,主要在于它跨平臺、開源,在Java里面很多項(xiàng)目都是開源的,就像L
6、inux一樣,也可以說是開源推動了它的進(jìn)一步發(fā)展。Java在現(xiàn)在依然是很火的一門編程語言,主要在于它有如下特點(diǎn):1. Java語言是簡單的。它相對于C或C+來說比較簡單,它丟掉了C或C+里面的指針。2. 它是面向?qū)ο蟮摹T贘ava中可以認(rèn)為萬事萬物皆對象。3. Java語言是分布式的。Java語言支持Internet應(yīng)用的開發(fā),在基本的Java應(yīng)用編程接口中有一個(gè)網(wǎng)絡(luò)應(yīng)用編程接口(java net),它提供了用于網(wǎng)絡(luò)應(yīng)用編程的類庫,包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(遠(yuǎn)程方法激活)機(jī)制也是開發(fā)分布式應(yīng)用的重要手段。4. Java
7、語言也是動態(tài)的。Java語言的設(shè)計(jì)目標(biāo)之一是適應(yīng)于動態(tài)變化的環(huán)境。Java程序需要的類能夠動態(tài)地被載入到運(yùn)行環(huán)境,也可以通過網(wǎng)絡(luò)來載入所需要的類。這也有利于軟件的升級。另外,Java中的類有一個(gè)運(yùn)行時(shí)刻的表示,能進(jìn)行運(yùn)行時(shí)刻的類型檢查。2.2.2 TCP/IP協(xié)議TCP/IP(Transmission Control Protocol/Internet Protocol)的簡寫,中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet最基本的協(xié)議、Internet國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),簡單地說,就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。TCP/IP 定義了電子
8、設(shè)備(比如計(jì)算機(jī))如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)。TCP/IP是一個(gè)四層的分層體系結(jié)構(gòu)。高層為傳輸控制協(xié)議,它負(fù)責(zé)聚集信息或把文件拆分成更小的包。低層是網(wǎng)際協(xié)議,它處理每個(gè)包的地址部分,使這些包正確的到達(dá)目的地。在多人聊天室中則是在這種協(xié)議基礎(chǔ)上實(shí)現(xiàn)的彼此之間的信息交流;2.2.3 JMF使用RTP協(xié)議實(shí)時(shí)傳輸協(xié)議RTP(Real-Time Transport Protocol)是針對Internet上多媒體數(shù)據(jù)流的一個(gè)傳輸協(xié)議,由IETF(Internet工程任務(wù)小組)作為RFC1889發(fā)布。RTP被定義為在一對一或一對多的傳輸情況下工作,其目的是提供時(shí)間信息和實(shí)現(xiàn)流同步。
9、RTP的典型應(yīng)用建立在UDP上,但也可以建立在TCP或ATP等其它協(xié)議之上工作。RTP本身只保證實(shí)時(shí)數(shù)據(jù)的傳輸,并不能為按順序傳送數(shù)據(jù)包提供可靠的傳送機(jī)制,也不提供流量控制或擁塞控制,它依靠RTCP提供這些服務(wù)。在多人聊天室中則是在這種通信協(xié)議的基礎(chǔ)上實(shí)現(xiàn)的視頻聊天;2.2.4 Mysql數(shù)據(jù)庫MySQL是一種開放源代碼的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),MySQL數(shù)據(jù)庫系統(tǒng)使用最常用的數(shù)據(jù)庫管理語言-結(jié)構(gòu)化查詢語言(SQL)進(jìn)行數(shù)據(jù)庫管理。并且其速度、可靠性和適應(yīng)性都非常不錯,而且還有可視化的插件,便于建表和進(jìn)行其它的操作。多人聊天室中利用這種數(shù)據(jù)庫實(shí)現(xiàn)的數(shù)據(jù)保存;2.3系統(tǒng)運(yùn)行環(huán)境硬件環(huán)
10、境:個(gè)人計(jì)算機(jī)(內(nèi)存1G+)軟件環(huán)境:Eclipse 3.3 、JDK 1.6、Mysql 5.0 、Windows XP第3章 系統(tǒng)分析3.1關(guān)于系統(tǒng)分析3.1.1可行性分析本軟件在計(jì)算機(jī)語言上采用的是當(dāng)前流行的Java語言,這種語言具有很好的跨平臺性,可以對不同的操作系統(tǒng)進(jìn)行兼容,只需要用戶的電腦上將有SUN公司開發(fā)的JDK1.4以上的版本就可以運(yùn)行該程序;編輯器利用是Eclipse,這種編輯器具有很好的提示功能,支持插件,使用相當(dāng)方便;數(shù)據(jù)庫利用的是Mysql,這種數(shù)據(jù)庫易于安裝,所占的空間少,啟動快,適合在局域網(wǎng);該軟件只需要一臺將有JDK1.4以上版本的電腦即可,經(jīng)濟(jì)上實(shí)惠;由于電腦
11、技術(shù)的發(fā)展,人們素質(zhì)的提高,對于電腦的基本操作和維護(hù)都有了一定的基礎(chǔ),因此在維護(hù)上還是不成問題;3.2系統(tǒng)功能分析3.2.1客戶端功能分析在客戶端我們根據(jù)軟件的需要可以從它所應(yīng)具有的界面?zhèn)€數(shù)來對它的功能進(jìn)行分析;第一個(gè) 登錄界面在這個(gè)界面上,有兩個(gè)輸入框一個(gè)是賬號,一個(gè)是密碼;當(dāng)輸入完信息之后,點(diǎn)擊登錄按鈕,客戶端就會開始與服務(wù)器與行連接;在這個(gè)過程中要完成兩件事情。一件是,客戶端取得與服務(wù)器的連接,如果服務(wù)器沒有開啟或者網(wǎng)絡(luò)不通,自然要給客戶端一個(gè)友好的提示信息;另一件是,取得連接之后客戶端將賬號及密碼信息發(fā)送給服務(wù)器,以確保該用戶是否存在,如果不存在則提示賬號或者密碼錯誤,存在則進(jìn)入下一個(gè)
12、界面,進(jìn)度條則會顯示整個(gè)處理的進(jìn)度情況;第二個(gè) 用戶列表界面這個(gè)界面是用戶成功登錄之后,展現(xiàn)該用戶自己信息及所有好友信息的界面,這是每一個(gè)用戶都必須有的界面,只有退出整個(gè)程序時(shí)這個(gè)界面才會消息;在這個(gè)界面上提供給用戶進(jìn)行操作的則是,用戶可以根據(jù)自己的喜愛選擇好友列表中相應(yīng)的好友,雙擊頭像圖標(biāo)進(jìn)行聊天;第三個(gè) 聊天窗口 這是整個(gè)多人聊天室的主要界面;這在這界面上負(fù)責(zé)將自己的消息通過發(fā)達(dá)信息框發(fā)送給對方,并將對方的信息顯示在信息顯示框內(nèi);另外這個(gè)窗口還有相應(yīng)的功能按鈕提供給用戶一些方便的操作。例如抖動按鈕,發(fā)送按鈕,視頻聊天選項(xiàng)等;點(diǎn)擊視頻聊天選項(xiàng)會出現(xiàn)相應(yīng)的視頻聊天窗口,點(diǎn)擊發(fā)送按鈕會將消息發(fā)送
13、出去,點(diǎn)擊抖動按鈕會使聊天對方的聊天窗口出現(xiàn)一段時(shí)間的抖動;3.2.2 服務(wù)器功能分析服務(wù)器的主要功能則是將客戶端發(fā)送過來的信息,進(jìn)行驗(yàn)證和轉(zhuǎn)發(fā),服務(wù)器處理的工作較多,要求性能較好;在服務(wù)器端主要有一個(gè)界面,這個(gè)界面負(fù)責(zé)啟動服務(wù)器,并且在服務(wù)器啟動之后,會將所有存在的用戶信息包括賬號、密碼、頭像等信息顯示在表格上,以方便后臺的人員對用戶進(jìn)行相應(yīng)的操作;另外所有用戶發(fā)送給客戶端的信息都會在信息顯示框內(nèi)進(jìn)行顯示,以便查看整個(gè)通信過程;3.3系統(tǒng)流程圖為了更清楚地說明系統(tǒng)框架,以便更好地說明設(shè)計(jì)該系統(tǒng)的解決方案,我們給出了系統(tǒng)流程圖,如圖3.1。系統(tǒng)流程圖展示了該系統(tǒng)客戶端與服務(wù)器之間的邏輯關(guān)系,其
14、中主要介紹的是服務(wù)器如何處理消息的一個(gè)過程,并將在下面的的系統(tǒng)設(shè)計(jì)階段給出了相應(yīng)的消息設(shè)計(jì)(XMPP)。 圖3.1由上圖可以看出,一個(gè)客戶端只要能過了賬號、密碼的驗(yàn)證就可以與其它相應(yīng)的客戶端取得聯(lián)系,進(jìn)行彼此之間的交流。而服務(wù)器為了單獨(dú)處理第個(gè)客戶端則利用了多線程技術(shù),使得每個(gè)客戶端的信息不至于混亂;第4章 系統(tǒng)設(shè)計(jì)4.1數(shù)據(jù)庫表設(shè)計(jì) user 表:id整型唯一IDname字符型用戶名account字符型賬號password字符型密碼picture字符型頭像 friends 表:通過friends 表可以找到某個(gè)用戶的所有朋友信息id整型唯一IDid_user字符型外鍵type字符型朋友類型f
15、riend_account字符型朋友賬號4.2 自定義XMPP協(xié)議1-客戶端與服務(wù)器連接 a.沒有連接上則返回超時(shí), b.連接上 密碼錯誤則進(jìn)行提示 正確則返回個(gè)人信息、用戶列表并進(jìn)入用戶窗口 1-1 . 登錄請求 login 賬號 密碼 1-2 . 登錄應(yīng)答 login_response 1表示成功,0表示失敗 1-3 . 發(fā)送個(gè)人信息 user用戶名用戶賬號用戶頭像 1-4 . 發(fā)送好友隊(duì)列信息-默認(rèn)2個(gè)組 好友類型 好友名 好友賬號 好友頭像 2 . 聊天 彼此在線,好友發(fā)送消息過來時(shí),彈出對應(yīng)的聊天框 2-1. chat 本人賬號 朋友賬號 內(nèi)容 對方不在線時(shí),給發(fā)送者提示 2-2.
16、line -1 不在線好友賬號 3 . 抖動 點(diǎn)擊抖動按鈕則可以讓對方的聊天框出現(xiàn)一段時(shí)間的抖動,條件是該好友要在線 3-1. shake 發(fā)送方賬號 接收方賬號 4. 視頻 4-1 視頻請求(點(diǎn)擊開始視頻按鈕) vidio 發(fā)送方賬號 接收方賬號 發(fā)送者的ip,port 4-2 視頻應(yīng)答(點(diǎn)擊接受按鈕) r_vidio 發(fā)送方賬號 接收方賬號 發(fā)送者的ip,port第5章 系統(tǒng)實(shí)現(xiàn)5.1 客戶端實(shí)現(xiàn)5.1.1 登錄界面關(guān)鍵代碼:private void creatFrame() this.setTitle(QQ2011);this.setSize(340, 250);/ 三個(gè)panel-加中
17、一個(gè)布局管理器給圖片定位JPanel pan1 = new JPanel(new java.awt.FlowLayout(0, 0, 0);JPanel pan2 = new JPanel();JPanel pan3 = new JPanel(new java.awt.FlowLayout(0, 10, 3);/ pan2上的三個(gè)jpanelJPanel pan4 = new JPanel();JPanel pan5 = new JPanel();JPanel pan6 = new JPanel();/ pan1上的標(biāo)簽-要標(biāo)簽上加一張圖片JLabel lab1 = new JLabel();
18、javax.swing.ImageIcon img1 = new javax.swing.ImageIcon(images/login1.jpg);lab1.setIcon(img1);/ 在三個(gè)jpanel上設(shè)圖片和背景pan1.add(lab1);pan2.setBackground(new java.awt.Color(228, 244, 255);pan3.setBackground(new java.awt.Color(194, 255, 250);/ 設(shè)組件JLabel name_label = new JLabel(賬號:);name_label.setFont(new java
19、.awt.Font(宋體, Font.TRUETYPE_FONT, 12);text = new JTextField(15);JLabel reg_label = new JLabel( 注冊賬號);reg_label.setFont(new java.awt.Font(宋體, Font.TRUETYPE_FONT, 12);JLabel pwd_label = new JLabel(密碼:);pwd_label.setFont(new java.awt.Font(宋體, Font.TRUETYPE_FONT, 12);pwd = new JPasswordField(15);JLabel
20、mod_label = new JLabel( 修改密碼);mod_label.setFont(new java.awt.Font(宋體, Font.TRUETYPE_FONT, 12);/ 進(jìn)度條JProgressBar bar = new JProgressBar();JProBar prob=new JProBar(bar);/啟動進(jìn)度條prob.start();bar.setBackground(Color.red);JLabel bar_label = new JLabel( );JButton set_bt = new JButton(設(shè)置);set_bt.setSize(60,
21、5);set_bt.setFont(new java.awt.Font(宋體, Font.TRUETYPE_FONT, 12);JLabel empty_label = new JLabel( );/ 給登錄按鈕、密碼輸入框注冊偵聽器JButton log_bt = new JButton(登錄);LoginButtonListener listener = new LoginButtonListener(this);log_bt.addActionListener(listener);pwd.addActionListener(listener);log_bt.setSize(60, 5);
22、log_bt.setFont(new java.awt.Font(宋體, Font.TRUETYPE_FONT, 12);/ 將組件加到pan4,pan5,pan6,pan3上pan4.add(name_label);pan4.add(text);pan4.add(reg_label);pan5.add(pwd_label);pan5.add(pwd);pan5.add(mod_label);pan6.add(bar);pan6.add(bar_label);pan3.add(set_bt, BorderLayout.WEST);pan3.add(empty_label, BorderLayo
23、ut.CENTER);pan3.add(log_bt, BorderLayout.EAST);/ pan4,pan5,pan6加到pan2上pan2.add(pan4, BorderLayout.NORTH);pan2.add(pan5, BorderLayout.CENTER);pan2.add(pan6, BorderLayout.SOUTH);/ 三個(gè)jpanel的位置 北 中this.add(pan1, BorderLayout.NORTH);this.add(pan2, BorderLayout.CENTER);this.add(pan3, BorderLayout.SOUTH);t
24、his.setDefaultCloseOperation(3);/ 關(guān)閉窗口時(shí)退出運(yùn)行this.setLocationRelativeTo(null);/ 位于窗口的中間this.setVisible(true);/ 可視this.setResizable(false);/ 設(shè)定窗口不可改變大小5.1.2 用戶列表界面關(guān)鍵代碼:private JTree getJTree0() if (jTree0 = null) jTree0 = new JTree();DefaultTreeModel treeModel = null; / 根結(jié)點(diǎn)DefaultMutableTreeNode root =
25、 new DefaultMutableTreeNode(好友列表);/ 根據(jù)好友列表建樹/ 第一層,好友類型for (int i = 0; i 2; i+) DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(datai0);/ 第二層,好友名字for (int j = 0; j 1; j+) DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(datai1);node1.add(node2);root.add(node1);/ 表模型treeModel = new
26、DefaultTreeModel(root);/ 給葉節(jié)點(diǎn)加上圖片ImageIcon image = new ImageIcon(images/163.gif);DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();renderer.setLeafIcon(image);jTree0.setCellRenderer(renderer);/ 給節(jié)點(diǎn)加上雙擊事件jTree0.addMouseListener(new MouseAdapter() public void mouseClicked(MouseEvent e)
27、if (e.getClickCount() = 2) / 點(diǎn)擊路徑TreePath path = jTree0.getPathForLocation(e.getX(), e.getY();/ 根據(jù)路徑得到節(jié)點(diǎn)TreeNode node = (TreeNode) path.getLastPathComponent();/ 葉節(jié)點(diǎn)1if (node.toString().equals(data01) if (frame = null) frame = new ChatFrame(1,data,per,session);/ 葉節(jié)點(diǎn)2if (node.toString().equals(data11)
28、 if (frame2 = null) frame2 = new ChatFrame(2,data,per,session););jTree0.setModel(treeModel);return jTree0;5.1.3 聊天窗口及視頻界面FMJ視頻聊天室的實(shí)現(xiàn) 視頻聊天整體結(jié)構(gòu)分析整體流程圖示:服務(wù)器和客戶機(jī)通過基于UDP的RTP通信協(xié)議傳輸媒體流數(shù)據(jù),在建立RTP會話之前,先建立一個(gè)Socket連接,以發(fā)送接收其它請求消息,如要發(fā)送多媒體數(shù)據(jù)的請求和應(yīng)答消息。發(fā)送視頻請求消息和完成應(yīng)答之后,服務(wù)器利用客戶機(jī)發(fā)上來的消息建立RTP會話,因此在視頻請求的消息中應(yīng)包含客戶機(jī)的地址、端口等消息,
29、以供服務(wù)器建立RTP會話??蛻魴C(jī)也要和服務(wù)器建立對應(yīng)的RTP會話,這樣,視頻數(shù)據(jù)流就可以通過RTP會話傳輸:關(guān)鍵代碼:/* * 本地播放的方法 * param:dataSource 要初始化的數(shù)據(jù)源 */public void playSource() try / 創(chuàng)建一個(gè)播放器對象player = javax.media.Manager.createPlayer(dataSource);/ 創(chuàng)建一個(gè)播放器的控制器監(jiān)聽器對象MyRTPListener l = new MyRTPListener(player, ServerStart.jf,ServerStart.panel);/ 給播放器對象
30、注冊控制器監(jiān)聽器player.addControllerListener(l);/ 開始播放player.start(); catch (Exception e) e.printStackTrace();/* * 實(shí)現(xiàn)監(jiān)聽器接口中的方法.此方法可通知應(yīng)用程序?qū)Σシ牌鞯氖录龀龇磻?yīng) */public synchronized void controllerUpdate(ControllerEvent e) if (e instanceof javax.media.RealizeCompleteEvent) Component comp;/ 得到播放器的可視容器,即播放器顯示視頻的容器if (co
31、mp = player.getVisualComponent() != null) / 將可視容器加到窗體上panel.add(Center, comp);/ 得到播放器的控制面板容器if (comp = player.getControlPanelComponent() != null) / 添加到窗體上panel.add(South, comp);/ 刷新窗體jf.validate(); /* * 初始化RTP會話 * * return */protected boolean initialize() try mgrs = new RTPManagersessions.length;Ses
32、sionLabel session;/ 打開會話for (int i = 0; i sessions.length; i+) / 解析會話地址try session = new SessionLabel(sessionsi); catch (IllegalArgumentException e) System.err.println(Failed to parse the session address given: + sessionsi);return false;System.err.println( - Open RTP session for: addr: + session.add
33、r + port: + session.port + ttl: + session.ttl);mgrsi = (RTPManager) RTPManager.newInstance();mgrsi.addSessionListener(this);mgrsi.addReceiveStreamListener(this);/ 初始化 RTPManager用 RTPSocketAdaptermgrsi.initialize(new RTPSocketAdapter(InetAddress.getByName(session.addr), session.port, session.ttl);Buf
34、ferControl bc = (BufferControl) mgrsi.getControl(javax.media.control.BufferControl);if (bc != null)bc.setBufferLength(350); catch (Exception e) System.err.println(Cannot create the RTP Session: + e.getMessage();return false;/ 等待數(shù)據(jù)到達(dá).long then = System.currentTimeMillis();long waitingPeriod = 30000;
35、/ wait for a maximum of 30 secs.try synchronized (dataSync) while (!dataReceived& System.currentTimeMillis() - then waitingPeriod) if (!dataReceived)System.err.println( - Waiting for RTP data to arrive);dataSync.wait(1000); catch (Exception e) if (!dataReceived) System.err.println(No RTP data was re
36、ceived.);close();return false;return true;5.2 服務(wù)器端實(shí)現(xiàn)5.2.1 服務(wù)器界面關(guān)鍵代碼:/* * 處理客戶端端來的消息 */private void readFromClient() while (true) try / 讀取客戶端的消息-截取消息類型r_msg = readMsg(ins);String type = Xmpp.getXMLValue(r_msg, type);/ . 根據(jù)消息類型/ -進(jìn)行處理/ 1.登錄消息if (type.equals(login) loginMsg();/ 2.聊天消息if (type.equals(ch
37、at) chatMsg(r_msg);/ 3.抖動消息if (type.equals(shake) shakeMsg(r_msg);/ 4.視頻請求if (type.equals(vidio) vidioMsg(r_msg);/ 5.轉(zhuǎn)發(fā)視頻響應(yīng)消息if (type.equals(vidio_response) / 得到該消息發(fā)送給誰String friendaccount = Xmpp.getXMLValue(r_msg,friendaccount);/ 將該消息轉(zhuǎn)發(fā)給對應(yīng)的人Tool.sendMsg(r_msg, friendaccount); catch (IOException e)
38、Logger.Exception(讀取客戶端消息時(shí)異常!);e.printStackTrace();/ 捕獲異常后-結(jié)束線程里的方法-并處理相應(yīng)信息Tool.thread_list.remove(this);Tool.user_list.remove(u);System.out.println(u.getName() + 退出);return;第6章 結(jié)束語 聊天軟件對大家來說應(yīng)該是相當(dāng)熟悉,特別是騰訊QQ的興起,讓很多的人對這種軟件樂不思蜀。它的這種新穎的設(shè)計(jì),以及給公司帶來的巨大利潤,讓許多從事軟件行業(yè)的人看到的期望。本人當(dāng)初制作這個(gè)多人聊天室的時(shí)候也是仿制騰訊QQ的設(shè)計(jì)風(fēng)格而開始的。像這種聊天軟件,要將界面做成非常的炫麗,并且具有很好的人性化,并非一人之力,一時(shí)的功夫就能做好的; 本人制作的這個(gè)多人聊天室,只實(shí)現(xiàn)了視頻,聊天,抖動等功能,其它的功能由于能力,時(shí)間有限所以并沒有進(jìn)行設(shè)計(jì)了;但是在這幾項(xiàng)功能的實(shí)現(xiàn)過程當(dāng)中也碰到了許多的問題;特別是多線程這一塊,用的不好就會造成死鎖的現(xiàn)象,因此在這個(gè)方面找錯時(shí)花費(fèi)的時(shí)間也是相對較多;在實(shí)現(xiàn)視頻這一塊的時(shí)候,由于對這種新的RTCP/IP協(xié)議不是很熟悉,一開始在這個(gè)上面有卡住了,之后在自己查閱了相關(guān)的資料,并向同學(xué)請教之后,最終還
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房地產(chǎn)項(xiàng)目增資入股投資協(xié)議
- 二零二五年度辦公室文員聘用與企業(yè)文化融合協(xié)議
- 二零二五年度新能源汽車碰撞責(zé)任免除合同
- 2025年度現(xiàn)代農(nóng)業(yè)病蟲害防治藥害賠償協(xié)議書
- 二零二五年度勞動局標(biāo)準(zhǔn)合同:養(yǎng)老服務(wù)業(yè)員工就業(yè)保障協(xié)議范本
- 2025年度賬戶變更補(bǔ)充服務(wù)協(xié)議
- 高性能計(jì)算中心設(shè)備采購及安裝合同
- 企業(yè)辦公室裝飾設(shè)計(jì)與施工服務(wù)合同
- 教育培訓(xùn)行業(yè)線上課程開發(fā)與運(yùn)營計(jì)劃書
- 電氣設(shè)備安裝工程施工合同新
- DB5101-T 71-2020 成都市電動汽車充電設(shè)施 安全管理規(guī)范
- 2025年七臺河職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 監(jiān)理人員安全培訓(xùn)考試試卷(答案)
- 2025年北京電子科技職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 【MOOC】數(shù)據(jù)庫系統(tǒng)(上):模型與語言-哈爾濱工業(yè)大學(xué) 中國大學(xué)慕課MOOC答案
- 高教版2023年中職教科書《語文》(基礎(chǔ)模塊)下冊教案全冊
- HCCDP 云遷移認(rèn)證理論題庫
- 譯林英語五年級下冊單詞表(孩子自己默寫不用提)
- DLT 1055-2021 火力發(fā)電廠汽輪機(jī)技術(shù)監(jiān)督導(dǎo)則
- 杭州房建工程監(jiān)理大綱范本
- 現(xiàn)代交換原理與技術(shù)課件:第5章 分組交換技術(shù)
評論
0/150
提交評論