帶網(wǎng)絡(luò)功能的多媒體播放器_第1頁(yè)
帶網(wǎng)絡(luò)功能的多媒體播放器_第2頁(yè)
帶網(wǎng)絡(luò)功能的多媒體播放器_第3頁(yè)
帶網(wǎng)絡(luò)功能的多媒體播放器_第4頁(yè)
帶網(wǎng)絡(luò)功能的多媒體播放器_第5頁(yè)
已閱讀5頁(yè),還剩29頁(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、帶網(wǎng)絡(luò)功能的多媒體播放器 分類: Java系列 2010-05-27 20:09 84人閱讀 評(píng)論(0) 收藏 舉報(bào) 課 程 設(shè) 計(jì) 說(shuō) 明 書(shū)設(shè)計(jì)題目:JAVA網(wǎng)絡(luò)視頻點(diǎn)播系統(tǒng)系 別: 計(jì) 算 機(jī) 學(xué) 院 班 級(jí): 07計(jì)算2班 學(xué) 號(hào): 07xxxxxxxx 姓 名: cgxinyan 指導(dǎo)老師: 老 師 小組成員:cgxinyan、幸福的豬、水清藍(lán)yy北工業(yè)大學(xué) 二0一0年5月18日目錄摘要I第一章前言1第二章概要設(shè)計(jì)22.1開(kāi)發(fā)環(huán)境22.2播放器功能22.3界面設(shè)計(jì)2第三章詳細(xì)設(shè)計(jì)63.1系統(tǒng)入口63.2系統(tǒng)主界面73.2.1菜單欄73.2.2播放窗口83.2.3播放器狀態(tài)欄83.2.

2、4播放清單93.2.5截屏顯示93.3流程圖93.4網(wǎng)網(wǎng)絡(luò)點(diǎn)播功能設(shè)計(jì)103.4.1概述103.4.2網(wǎng)絡(luò)功能設(shè)計(jì)103.4.2.1服務(wù)器103.4.2.2客戶端113.4.3網(wǎng)絡(luò)功能的詳細(xì)設(shè)計(jì)113.4.3.1rtp協(xié)議實(shí)現(xiàn)實(shí)時(shí)媒體信息的網(wǎng)絡(luò)傳輸113.4.3.2java socket實(shí)現(xiàn)客戶端和服務(wù)器的通信14第四章運(yùn)行結(jié)果21第五章測(cè)試分析23第六章參考文獻(xiàn)32第七章致 謝33摘要該程序是一個(gè)利用jmf實(shí)現(xiàn)的圖形界面的簡(jiǎn)單的播放器,具有良好的界面,使用人員能快捷簡(jiǎn)單地進(jìn)行操作。該播放器可以實(shí)現(xiàn) 該系統(tǒng)是一個(gè)圖形界面的簡(jiǎn)單的網(wǎng)絡(luò)(單機(jī))視頻點(diǎn)播系統(tǒng),具有良好的界面,用戶能快捷簡(jiǎn)單地進(jìn)行操作

3、。本系統(tǒng)主要實(shí)現(xiàn)常見(jiàn)本地視頻文件的播放和局域網(wǎng)電影點(diǎn)播的功能,播放器還包含截屏功能。本系統(tǒng)采用java語(yǔ)言開(kāi)發(fā), 通過(guò)jmf實(shí)現(xiàn)多媒體文件播放和實(shí)時(shí)傳輸功能,java socket網(wǎng)絡(luò)編程技術(shù)實(shí)現(xiàn)系統(tǒng)的網(wǎng)絡(luò)部分功能。實(shí)時(shí)流媒體傳輸采用RTP協(xié)議。關(guān)鍵字:java、jmf、java socket、RTP協(xié)議、播放器、多媒體、流媒體、實(shí)時(shí)傳輸、視頻點(diǎn)播系第一章 前言隨著計(jì)算機(jī)技術(shù)和Internet的不斷發(fā)展,網(wǎng)絡(luò)視頻點(diǎn)播系統(tǒng)越來(lái)越受到人們的親睞。網(wǎng)絡(luò)視頻點(diǎn)播系統(tǒng)是計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)通信技術(shù)、多媒體技術(shù)、電視技術(shù)和數(shù)字壓縮技術(shù)等多學(xué)科、多領(lǐng)域融合、交叉、結(jié)合的產(chǎn)物。網(wǎng)絡(luò)視頻點(diǎn)播,也稱為交互式電視點(diǎn)播系

4、統(tǒng)。傳統(tǒng)的電視系統(tǒng)信息,單向傳送,用戶只能被動(dòng)接收,而我們將要開(kāi)發(fā)的網(wǎng)絡(luò)視頻點(diǎn)播系統(tǒng)是以“用戶自主”的全新概念的基礎(chǔ)的雙向視音頻信息系統(tǒng),實(shí)現(xiàn)了用戶可以自主選擇本地和在線的自己喜歡的視音頻節(jié)目,而且還可以截取自己覺(jué)得美好的畫(huà)面。本視頻點(diǎn)播系統(tǒng)根據(jù)流媒體傳輸原理,RTP實(shí)時(shí)傳輸協(xié)議,模擬基于JMF的網(wǎng)絡(luò)視頻點(diǎn)播系統(tǒng),主要實(shí)現(xiàn)常見(jiàn)本地視頻文件的播放和局域網(wǎng)電影點(diǎn)播的功能,播放器還包含定時(shí)截屏功能。通過(guò)JAVA實(shí)現(xiàn),主要論述了客戶端(Client)和服務(wù)器端(Server)的視頻服務(wù)平臺(tái)搭建,流媒體相關(guān)原理,以及相關(guān)功能的具體實(shí)現(xiàn)。本次課程設(shè)計(jì)主要闡述了基于JMF的交互式網(wǎng)絡(luò)視頻點(diǎn)播系統(tǒng)的協(xié)議原理,

5、軟件結(jié)構(gòu)和設(shè)計(jì)實(shí)現(xiàn)。第二章 概要設(shè)計(jì)2.1 開(kāi)發(fā)環(huán)境開(kāi)發(fā)平臺(tái):Microsoft Windows XP Professional Service Pack 3開(kāi)發(fā)工具:JDK 1.6+ JMF1.1(JAVA多媒體框架)+ ECLIPSE2.2 播放器功能基本功能:1、在本地實(shí)現(xiàn)mpg、mov、au、avi等常用音視頻格式的播放。2、通過(guò)菜單設(shè)定定時(shí)截取視頻成靜態(tài)圖像并按照jpg格式保存到制定目錄,并在播放視頻的同時(shí)展開(kāi)這些圖像文件,動(dòng)態(tài)擴(kuò)展。3、設(shè)定常用快捷鍵,方便用戶使用。高級(jí)功能:在局域網(wǎng)內(nèi)按照C/S架構(gòu)開(kāi)展網(wǎng)絡(luò)視頻點(diǎn)播2.3 界面設(shè)計(jì)圖1 客戶端主界面圖2 打開(kāi)某文件圖3 截屏圖4 輸

6、入服務(wù)器IP圖5 網(wǎng)絡(luò)連接成功圖6 服務(wù)器界面第三章 詳細(xì)設(shè)計(jì)類結(jié)構(gòu)設(shè)計(jì):整個(gè)網(wǎng)絡(luò)視頻播放器由客戶端(client)和服務(wù)器端(server)兩部分組成。由于我們組三人各有分工,我主要負(fù)責(zé)網(wǎng)絡(luò)部分的功能,即實(shí)現(xiàn)網(wǎng)絡(luò)點(diǎn)播和實(shí)時(shí)數(shù)據(jù)流的接收并播放以及客戶端和服務(wù)器的通信功能,所以在這里我將詳細(xì)介紹有關(guān)網(wǎng)絡(luò)部分的詳細(xì)設(shè)計(jì)。截屏功能由我們小組的水清藍(lán)同學(xué)完成,本地文件的播放主要有小組的幸福的豬完成。3.1 系統(tǒng)入口文件main.java,主要實(shí)現(xiàn)整個(gè)播放器的入口功能,通過(guò)調(diào)用main.java來(lái)進(jìn)入播放器主界面,以實(shí)現(xiàn)播放器的各個(gè)功能。Main.java文件內(nèi)容如下:package ourplayer

7、.client;import javax.swing.UIManager;public class Main /* * param args * the command line arguments */public static void main(String args) try UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); catch (Exception e) ourplayer.client.gui.MainFrame mainFrame = new ourplayer.client.gui.M

8、ainFrame();3.2 系統(tǒng)主界面系統(tǒng)主界面是在文件MainFrame.java里實(shí)現(xiàn)的。主界面是通過(guò)frame容器展現(xiàn),并通過(guò)給各frame容器添加監(jiān)聽(tīng)來(lái)實(shí)現(xiàn)各部分功能。3.2.1 菜單欄播放器菜單欄位于整個(gè)播放器的上部,他是播放器各功能的入口。通過(guò)選擇菜單欄各菜單項(xiàng),實(shí)現(xiàn)播放器的各個(gè)功能。其界面如下:菜單欄3.2.2 播放窗口播放窗口放置在整個(gè)界面的中央,用以實(shí)現(xiàn)視頻/音頻的播放及顯示功能,其界面如下:播放視頻窗口播放音頻文件3.2.3 播放器狀態(tài)欄播放器狀態(tài)欄用于顯示當(dāng)前播放器的狀態(tài)(網(wǎng)絡(luò)狀態(tài)或者單機(jī)狀態(tài)),其界面如下:?jiǎn)螜C(jī)狀態(tài)網(wǎng)絡(luò)狀態(tài)3.2.4 播放清單播放清單放置在整個(gè)界面的右

9、邊,用來(lái)列出當(dāng)前目錄下所有符合要求的音視頻文件,其界面如下:播放清單值得一提的是,在實(shí)現(xiàn)播放清單功能時(shí),通過(guò)“文件”菜單下面的“打開(kāi)”按鈕,在本地目錄找到需要播放的音視頻文件過(guò)后,會(huì)把當(dāng)前目錄下的所有符合條件(即指可以播放的文件格式)的文件一起加入到播放清單里面。并且在添加之前清空原來(lái)的播放列表。3.2.5 截屏顯示在整個(gè)界面的最下方有一個(gè)區(qū)域用來(lái)存放截屏的縮略圖,其界面如下:截屏縮略圖顯示3.3 流程圖 整體程序流程圖3.4 網(wǎng)網(wǎng)絡(luò)點(diǎn)播功能設(shè)計(jì)3.4.1 概述網(wǎng)絡(luò)點(diǎn)播功能由兩個(gè)大的模塊組成,他們分別是:1、網(wǎng)絡(luò)點(diǎn)播客戶端;2、網(wǎng)絡(luò)點(diǎn)播服務(wù)器。在本課程設(shè)計(jì)的成品軟件中已經(jīng)將服務(wù)器作為播放器的一

10、個(gè)功能集成到客戶端了。點(diǎn)擊播放器的“服務(wù)器”菜單或者按下快捷鍵“ctrl + S”來(lái)啟動(dòng)服務(wù)器。3.4.2 網(wǎng)絡(luò)功能設(shè)計(jì)3.4.2.1 服務(wù)器在播放器主界面啟動(dòng)服務(wù)器程序,在服務(wù)器端通過(guò)“文件”菜單的打開(kāi)項(xiàng)來(lái)設(shè)定提供媒體文件的文件夾。這樣,服務(wù)器就可以將這里面的文件提供到網(wǎng)絡(luò)上,供網(wǎng)絡(luò)上的客戶端使用。同一臺(tái)機(jī)子在同一時(shí)刻只允許運(yùn)行一臺(tái)服務(wù)器。服務(wù)器運(yùn)行的端口為10010。服務(wù)器可以同時(shí)接受很多客戶端的連接請(qǐng)求并給出實(shí)時(shí)響應(yīng)。當(dāng)客戶端一旦連接成功,服務(wù)器就將可提供實(shí)時(shí)媒體傳輸?shù)奈募斜戆l(fā)送給客戶端。服務(wù)器還能響應(yīng)客戶端的點(diǎn)播請(qǐng)求,并使用rtp協(xié)議講媒體數(shù)據(jù)發(fā)送到客戶端。3.4.2.2 客戶端客戶

11、端能連接到指定IP的服務(wù)器,在右側(cè)將網(wǎng)絡(luò)連接的狀態(tài)實(shí)時(shí)的顯示出來(lái)。當(dāng)收到服務(wù)器發(fā)送來(lái)的媒體列表后將他們顯示在右側(cè)的“播放清單”中。用戶可以通過(guò)單機(jī)媒體的名字來(lái)向服務(wù)器請(qǐng)求媒體的點(diǎn)播。播放器屏蔽了網(wǎng)絡(luò)連接的底層實(shí)現(xiàn)細(xì)節(jié),給用戶提供清爽的界面,簡(jiǎn)潔的操作和強(qiáng)大的功能。3.4.3 網(wǎng)絡(luò)功能的詳細(xì)設(shè)計(jì)3.4.3.1 rtp協(xié)議實(shí)現(xiàn)實(shí)時(shí)媒體信息的網(wǎng)絡(luò)傳輸本功能主要采用jmf提供的rtp協(xié)議實(shí)現(xiàn)的api完成。使用rtp協(xié)議的網(wǎng)絡(luò)多媒體應(yīng)用程序,分為兩個(gè)部分1、負(fù)責(zé)通過(guò)網(wǎng)絡(luò)發(fā)送數(shù)據(jù)的主機(jī)端,2、接收數(shù)據(jù)的客戶端。 Rtp協(xié)議會(huì)話框架實(shí)現(xiàn)實(shí)時(shí)媒體的發(fā)送端一個(gè)rtp協(xié)議會(huì)話通過(guò)一個(gè)IP和一對(duì)端口號(hào)來(lái)標(biāo)識(shí),一個(gè)端

12、口傳輸媒體數(shù)據(jù),另一個(gè)傳輸控制數(shù)據(jù)。每個(gè)不同的媒體類型都采用不同的會(huì)話來(lái)傳輸,且他們是獨(dú)立傳輸?shù)模绻谶M(jìn)行帶音頻的視頻傳輸還要進(jìn)行音視頻同步,不過(guò)幸好這些繁瑣的工作jmf都已經(jīng)為我們做了。采用jmf提供的rtp實(shí)現(xiàn)來(lái)進(jìn)行媒體數(shù)據(jù)的網(wǎng)絡(luò)傳輸步驟:(1) 從本機(jī)選擇待發(fā)送的媒體文件,獲取數(shù)據(jù)源,并通過(guò)獲取的數(shù)據(jù)源構(gòu)造媒體定位器。(2) 將數(shù)據(jù)以rtp流的形式發(fā)送出去(3) 產(chǎn)生一個(gè)jmf處理器(Process)為每一種rtp格式設(shè)置相應(yīng)的軌跡(4) 從處理器獲得輸出數(shù)據(jù)源(輸出到網(wǎng)絡(luò)中的數(shù)據(jù)源)(5) 會(huì)話管理器(SessionManager)產(chǎn)生一個(gè)發(fā)送數(shù)據(jù)流。(6) 開(kāi)始會(huì)話傳輸(7) 通過(guò)

13、監(jiān)聽(tīng)ControlerEvent時(shí)間來(lái)控制會(huì)話過(guò)程(8) 停止會(huì)話,刪除會(huì)話管理器下面是實(shí)現(xiàn)媒體傳輸?shù)年P(guān)鍵代碼(由于代碼較多,這里只放核心代碼)public void start() throws NoProcessorException, NoDataSourceException,CannotRealizeException, IOException,InvalidSessionAddressException, UnsupportedFormatException /* -獲得一個(gè)處理器- */this.getProcessor();/* -產(chǎn)生RTP會(huì)話- */this.getTran

14、smit();processor.start(); Rtp協(xié)議會(huì)話框架實(shí)現(xiàn)實(shí)時(shí)媒體的接收端實(shí)時(shí)接收網(wǎng)絡(luò)媒體數(shù)據(jù)流失通過(guò)各種rtp時(shí)間監(jiān)聽(tīng)器和rtp事件處理類來(lái)實(shí)現(xiàn)的,而jmf提供的Player接口就可以實(shí)現(xiàn)媒體數(shù)據(jù)流的播放接收并且播放媒體數(shù)據(jù)流步驟:(1) 實(shí)現(xiàn)ReceiveStreamListener監(jiān)聽(tīng)接口監(jiān)聽(tīng)接收數(shù)據(jù)的事件(2) 通過(guò)事件獲取接收媒體數(shù)據(jù)流,然后通過(guò)接收媒體數(shù)據(jù)流獲取數(shù)據(jù)源(3) 同過(guò)捕獲的媒體數(shù)據(jù)流產(chǎn)生播放媒體的播放器(4) 給播放器添加監(jiān)聽(tīng)來(lái)實(shí)現(xiàn)事件的監(jiān)聽(tīng)關(guān)鍵代碼如下:rtpManagers = new RTPManagersessionMessage.length;

15、for (int i = 0; i ”字符,所以各個(gè)不同的信息段采用“”符號(hào)來(lái)做分隔符,每條通行信息以回車換行(“/r/n”)來(lái)結(jié)束客戶端像服務(wù)器端發(fā)送“get media list”命令來(lái)獲取沒(méi)列表如果服務(wù)器有可提供的媒體文件,則發(fā)送list命令list命令格式:“l(fā)ist文件名文件名.”(“”用于隔開(kāi)每一個(gè)不同文件,“l(fā)ist”說(shuō)明給出的響應(yīng)是媒體列表)s如果服務(wù)器端無(wú)媒體文件響應(yīng):“error”客戶端向服務(wù)器請(qǐng)求媒體,也就是實(shí)現(xiàn)點(diǎn)播??蛻舳艘淮沃荒茳c(diǎn)播一個(gè)媒體數(shù)據(jù),顯示的給出IP是為了處理的簡(jiǎn)單。請(qǐng)求媒體數(shù)據(jù)命令:“request media data”加上要請(qǐng)求媒體文件名 最后還要給出

16、客戶IP。服務(wù)器響應(yīng):首先檢查命令格式是否正確,如果正確則獲得發(fā)送端口然后將自己的IP和端口一并發(fā)送給客戶端,并給出“media well send”命令media well send格式:“media well send服務(wù)器IP/發(fā)送端口”s如果檢查出客戶端發(fā)來(lái)的命令有錯(cuò)誤,則給出錯(cuò)誤響應(yīng)指令“errorno target”客戶端一旦接收到“media well send”命令就表示服務(wù)器已經(jīng)做好了數(shù)據(jù)發(fā)送的準(zhǔn)備工作,現(xiàn)在就是通知客戶端打開(kāi)接收器進(jìn)行接收??蛻舳诵陆ㄒ粋€(gè)線程來(lái)監(jiān)聽(tīng)并且接收數(shù)據(jù)流,并設(shè)定超時(shí)值。當(dāng)客戶端準(zhǔn)備好這些工作后就像服務(wù)器發(fā)送“receive done”指令服務(wù)器受到r

17、eceive done指令后才開(kāi)始真正的發(fā)送數(shù)據(jù),并且發(fā)送數(shù)據(jù)的線程是新開(kāi)辟的。因?yàn)榉?wù)器要對(duì)客戶端的請(qǐng)求產(chǎn)生實(shí)時(shí)響應(yīng),這樣就不能產(chǎn)生阻塞。發(fā)送的參數(shù)都由這個(gè)指令給定。一旦發(fā)送出現(xiàn)錯(cuò)誤就發(fā)送error指令通知客戶端及時(shí)取消接收。發(fā)送成功則發(fā)送media is sending命令通知客戶端一切正常,此時(shí)客戶端不做任何回應(yīng)。服務(wù)器線程繼續(xù)監(jiān)聽(tīng)客戶端指令。下面給出協(xié)議實(shí)現(xiàn)的主要代碼: 客戶端/* * 內(nèi)嵌的網(wǎng)絡(luò)客戶端 * * author Administrator * */class Client private static final int BUFSIZE = 2048;/ 接收緩沖int

18、servPort = 10010;/ 與點(diǎn)點(diǎn)播服務(wù)器連接的默認(rèn)端口-10010OutputStream out;InputStream in;Socket socket;public Client(String server) throws UnknownHostException, IOException / TODO Auto-generated constructor stubsocket = new Socket(server, servPort);in = socket.getInputStream();out = socket.getOutputStream();public St

19、ring handle(String message) throws UnknownHostException,IOException byte receiveData = new byteBUFSIZE;String temp = message.substring(0, message.indexOf(/n);/* 動(dòng)態(tài)構(gòu)造發(fā)送緩沖數(shù)組-這樣做很重要,因?yàn)橹挥腥绱瞬拍鼙WC傳輸過(guò)程不會(huì)出現(xiàn)錯(cuò)誤* */byte sendData = temp.getBytes();/ 因?yàn)橹噶畈豢赡艹^(guò)256個(gè)字符if (sendData = null | sendData.length 操作目標(biāo)目的主機(jī)IP

20、 * return 返回處理結(jié)果-若命令出錯(cuò)返回 error */public String command(String message) String str = error;String cmd = message.split();/ 主要考慮到,文件的路徑中不包含“”字符,因此用作命令間的分隔符if (get media list.equals(cmd0) / 請(qǐng)求媒體數(shù)據(jù)信息System.out.println(mediaPath);str = Tools.findMedias(mediaPath, true);/ 獲取所用媒體信息,并回饋給客戶機(jī)if(!.equals(str)st

21、r = list + str;else str = error; else if (request media data.equals(cmd0) / 請(qǐng)求媒體數(shù)據(jù) /port 發(fā)送數(shù)據(jù)的起始端口號(hào)tryif (cmd1 != null & !.equals(cmd1)& (cmd2 != null & !.equals(cmd2) / 操作目標(biāo)和目的主機(jī)存在者進(jìn)行下一步操作str = media well send + InetAddress.getLocalHost().getHostAddress() +/+port;/ 通知客戶端,媒體數(shù)據(jù)已準(zhǔn)備好,并通知待發(fā)送的端口號(hào)port +=

22、14;/端口自動(dòng)加14catch (ArrayIndexOutOfBoundsException aiobe)str = errorno target;/ 回饋錯(cuò)誤 catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); else if (receive done.equals(cmd0) / 已經(jīng)準(zhǔn)備好接收媒體數(shù)據(jù)try File file;MediaLocator mediaLocator;InetAddress inetAddress;file = new File(medi

23、aPath + cmd1);System.out.println(file.toURI().toURL();mediaLocator = new MediaLocator(file.toURI().toURL();inetAddress = InetAddress.getByName(cmd2);try RTPTransmit rtpTransmit = new RTPTransmit(mediaLocator,inetAddress, Integer.valueOf(cmd3);rtpTransmit.start();str = media is sending + mediaPath;/

24、媒體數(shù)據(jù)正在發(fā)送 catch (Exception e) str = error;/ 媒體數(shù)據(jù)發(fā)送出錯(cuò) catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (MalformedURLException e) / TODO Auto-generated catch blocke.printStackTrace();if (.equals(str) str = error;return str;/* * 解碼 * * param b * return */public

25、String decode(ByteBuffer b,int total) String message = ;String m = Charset.defaultCharset().decode(b).toString();trymessage = m.substring(0, m.indexOf(/r); catch (StringIndexOutOfBoundsException se)message = m.substring(0, total);return message;Overridepublic void run() / TODO Auto-generated method

26、stubtry handle(socket); catch (Exception e) / TODO Auto-generated catch block第四章 運(yùn)行結(jié)果運(yùn)行結(jié)果顯示第五章 測(cè)試分析5.1 程序運(yùn)行情況:程序正常的響應(yīng)按鈕事件,通過(guò)執(zhí)行“文件”菜單“打開(kāi)”命令,找到需要播放的文件。此時(shí),當(dāng)前目錄下所有可支持的文件都會(huì)加入到播放清單里面,但沒(méi)有文件正在播放。在播放列表中選擇一個(gè)文件,單擊即可打開(kāi)并播放。在播放過(guò)程中,可以實(shí)現(xiàn)“暫?!?、“快進(jìn)”、“慢放”、“拖動(dòng)”、“音量調(diào)節(jié)”等常規(guī)播放器功能,而且還能實(shí)現(xiàn)播放過(guò)程中同步截屏的功能。5.2 網(wǎng)絡(luò)功能展示由于我們的成品是一個(gè)可運(yùn)行的j

27、ar文件,問(wèn)了展示網(wǎng)絡(luò)部分的細(xì)節(jié)我們?cè)诿钚兄羞\(yùn)行。java -jar ourplayer.jar 啟動(dòng)程序后界面如下現(xiàn)在我們按下快捷鍵“ctrl + S”或者點(diǎn)擊 開(kāi)啟服務(wù)器。如下圖:通過(guò)文件菜單中的“打開(kāi)”項(xiàng)可以指定服務(wù)目錄,我們選擇E:/My Music目錄,默認(rèn)目錄是D盤(pán)?,F(xiàn)在將窗口切換到播放器窗口,通過(guò)快捷鍵“ctrl + N”或者點(diǎn)擊 來(lái)打開(kāi)網(wǎng)絡(luò)功能。輸入127.0.0.1連接到本機(jī),并且向服務(wù)器請(qǐng)求媒體列表現(xiàn)在已經(jīng)成功連接,并且獲得了媒體列表,下面我們就來(lái)選中 進(jìn)行播放。好,成功。5.3 程序清單/* * 內(nèi)嵌的網(wǎng)絡(luò)客戶端 * * author Administrator * *

28、/class Client private static final int BUFSIZE = 2048;/ 接收緩沖int servPort = 10010;/ 與點(diǎn)點(diǎn)播服務(wù)器連接的默認(rèn)端口-10010OutputStream out;InputStream in;Socket socket;public Client(String server) throws UnknownHostException, IOException / TODO Auto-generated constructor stubsocket = new Socket(server, servPort);in =

29、socket.getInputStream();out = socket.getOutputStream();public String handle(String message) throws UnknownHostException,IOException byte receiveData = new byteBUFSIZE;String temp = message.substring(0, message.indexOf(/n);/* 動(dòng)態(tài)構(gòu)造發(fā)送緩沖數(shù)組-這樣做很重要,因?yàn)橹挥腥绱瞬拍鼙WC傳輸過(guò)程不會(huì)出現(xiàn)錯(cuò)誤* */byte sendData = temp.getBytes();/

30、 因?yàn)橹噶畈豢赡艹^(guò)256個(gè)字符if (sendData = null | sendData.length 操作目標(biāo)目的主機(jī)IP * return 返回處理結(jié)果-若命令出錯(cuò)返回 error */ public String command(String message) String str = error; String cmd = message.split();/ 主要考慮到,文件的路徑中不包含“”字符,因此用作命令間的分隔符 if (get media list.equals(cmd0) / 請(qǐng)求媒體數(shù)據(jù)信息System.out.println(mediaPath); str = Tools.findMedias(mediaPath, true);/ 獲取所用媒體信息,并回饋給客戶機(jī) if(!.equals(str) str = list + str; else str = error; else if (request media data.equals(cmd0) / 請(qǐng)求媒體數(shù)據(jù) /port 發(fā)送數(shù)據(jù)的起始端口號(hào) try if (cmd1 != null & !.equals(cmd1) & (cm

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論