生活随笔
收集整理的這篇文章主要介紹了
red5简介及基础知识
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
?
Red5的主要功能和Macromedia公司的FMS類似,提供基于Flash的流媒體服務(wù)的一款基于Java的開源流媒體服務(wù)器。它由Java語言編寫,使用RTMP作為流媒體傳輸協(xié)議,這與FMS完全兼容。它具有流化FLV、MP3文件,實(shí)時(shí)錄制客戶端流為FLV文件,共享對象,實(shí)時(shí)視頻播放、Remoting等功能。用Red5替換FMS后,客戶端不用更改可正常運(yùn)行。
提供red5相關(guān)的鏈接:
官網(wǎng):http://www.red5.org/
下載地址:http://www.red5.org/downloads/
相關(guān)實(shí)例:http://trac.red5.org/wiki/Examples
相關(guān)文檔:http://trac.red5.org/wiki/Documentation
?
?
?
目前red5最高版本是1.0RC1,我用的是0.9.1Final版,red5具體使用例子網(wǎng)上有很多,在這我推薦一個(gè)網(wǎng)址,作者做了一個(gè)red5入門的視頻,非常適合新手入門:http://plter.com/archives/524
注:如果red5還未入門,不建議看后面的內(nèi)容。 ApplicationAdapter類是MultiThreadedApplicationAdapter的子類。ApplicationAdapter使用單線程的方式進(jìn)行方法調(diào)用的消息出來,所以其性能不如MultiThreadedApplicationAdapter。MultiThreadedApplicationAdapter類,是Red5應(yīng)用程序的基礎(chǔ)類。它提供了操作SharedObjects 和 streams的方法,還有連接和服務(wù)列表,是一個(gè)應(yīng)用程序基本的Iscope。通常應(yīng)用開發(fā),一般會繼承ApplicationAdapter類。 在開發(fā)中,我們經(jīng)常會接觸如下幾個(gè)方法,這些方法都是通過MultiThreadedApplicationAdapter實(shí)現(xiàn): //Red5應(yīng)用程序啟動時(shí)自動執(zhí)行此方法
public boolean appStart(IScope arg0) ?//Red5應(yīng)用程序停止時(shí)自動執(zhí)行此方法 public void appStop(IScope arg0)
?//flex客戶端連接項(xiàng)目時(shí)自動運(yùn)行的方法
public boolean appConnect(IConnection arg0, Object[] arg1)
?//flex客戶端與服務(wù)器斷開連接時(shí)觸發(fā)的方法
public void appDisconnect(IConnection arg0)
?//flex客戶端與服務(wù)器連接時(shí)運(yùn)行,與appConnect比較類似
public boolean appJoin(IClient arg0, IScope arg1)
?//flex客戶端與服務(wù)器斷開時(shí)運(yùn)行,與appDisconnect類似
public void appLeave(IClient arg0, IScope arg1)
?
Red5提供了很多接口供開發(fā)人員進(jìn)行二次開發(fā):
IConnection:連接對象。每個(gè)連接都有一個(gè)關(guān)聯(lián)的客戶端和域。連接可能是持續(xù)型、輪詢型、或短暫型。建立此接口的目的,是為了給不同的子類,如 RTMPConnection,RemotingConnection,AJAXConnection, HttpConnection 等,提供基礎(chǔ)通用的方法。它提供getClient()方法來獲取客服端對象。
IScope?:每個(gè)Red5應(yīng)用程序至少有一個(gè)域,用來搭建處理器、環(huán)景、服務(wù)器之間的連接。域可以構(gòu)成樹形結(jié)構(gòu),所有客戶端都可以作為其節(jié)點(diǎn)共享域內(nèi)的對象(比如流和數(shù)據(jù))。所有的客服端(client)通過連接(connection)連接到域中。對于單一域,每個(gè)連接對應(yīng)一個(gè)客服端,每個(gè)客服端對應(yīng)一個(gè)id,簡單的應(yīng)用,操作就針對一個(gè)id和一個(gè)連接進(jìn)行。
IServiceCapableConnection?:獲取有效連接。代碼中先獲取到連接實(shí)例,然后判斷是否是有效連接并強(qiáng)制類型轉(zhuǎn)換,之后調(diào)取客戶端相應(yīng)函數(shù)。
IClient?:客戶端對象代表某單一客戶端。一個(gè)客戶端可以和同一主機(jī)下不同的域分別建立連接。客戶端對象和HTTP session 很相像。可以使用IClientRegistry.newClient(Object[])方法來創(chuàng)建IClient對象。
ApplicationAdapter:ApplicationAdapter是應(yīng)用層級的IScope。若要處理流進(jìn)程,需實(shí)現(xiàn) IStreamAwareScopeHandler接口中的相應(yīng)處理方法。ApplicationAdapter還提供了有效的事件處理機(jī)制,來進(jìn)行截取流、確認(rèn)用戶等操作。同時(shí),其子類中引入的方法均可在客戶端通過 NetConnection 調(diào)取。在Aodbe 的FMS 中必須在服務(wù)器端維護(hù)客戶端對象,與之相較,Red5 為您的遠(yuǎn)程請求提供了更加方便快捷的操作方法。
【flex客戶端連接red5服務(wù)器】 Actionscript提供了NetConnection與服務(wù)器連接,連接之后可以調(diào)用red5的方法,也可以指定client對象供red5調(diào)用。 下面這段代碼是連接red5中某個(gè)自己創(chuàng)建的項(xiàng)目,并且通過事件監(jiān)聽連接狀況: //創(chuàng)建NetConnection實(shí)例
var netConn:NetConnection = new NetConnection();
//指定rtmp地址,并且向服務(wù)器傳遞一個(gè)參數(shù)值"hello"
netConn.connect("rtmp://localhost/chatroom","hello");
//添加NetStatus事件監(jiān)聽連接
netConn.addEventListener(NetStatusEvent.NET_STATUS,function connStatus(e:NetStatusEvent):void{switch(e.info.code){//連接成功case "NetConnection.Connect.Success":l_connStatus.text = "連接成功";break;//服務(wù)器斷開case "NetConnection.Connect.Closed":l_connStatus.text = "連接斷開";break;//能連上,但被拒絕訪問case "NetConnection.Connect.Failed":l_connStatus.text = "連接拒絕";break;default:break;}}); 把這段代碼放到flex事件中,當(dāng)觸發(fā)事件時(shí)就會連接red5. 【客戶端調(diào)用服務(wù)器方法】 客戶端調(diào)用服務(wù)器方法非常常用,有時(shí)你會主動向服務(wù)器獲取視頻資源,或者向服務(wù)器發(fā)送消息信息。 NetConnection的call(command:String,responder:Responder,...arguments)用于調(diào)用服務(wù)器方法, command ?指定被調(diào)用的服務(wù)器的方法名 responder 可選對象,用于處理服務(wù)器的返回值,這是回調(diào)的形式,所以需要實(shí)例化Responder對象,然后在對象體內(nèi)創(chuàng)建一個(gè)方法獲取服務(wù)器返回值,如果沒有返回值,則方法參數(shù)為空即可。 arguments 可選參數(shù),當(dāng)在遠(yuǎn)程應(yīng)用程序服務(wù)器上執(zhí)行 command 參數(shù)中指定的方法時(shí),這些參數(shù)將被傳遞給該方法 下面這段代碼介紹向服務(wù)器發(fā)送消息的方法: /*** 發(fā)送消息* */protected function sendMsg():void{netConn.call("sendMessage",new Responder(function result():void{}),uName,txt_msg.text);} 服務(wù)器必須有一個(gè)sendMessage方法,并且?guī)蓚€(gè)參數(shù),以獲取客戶端傳入的參數(shù)值: public void sendMessage(String userName,String message){....
} 因?yàn)楫?dāng)前方法沒有返回值,所以Responder內(nèi)的result方法參數(shù)為空,假如sendMessage方法返回String,則需要把Responder改成這樣: new Responder(function result(str:String):void{....
}) ? 【服務(wù)器調(diào)用客戶端】 比如一個(gè)會議系統(tǒng),某個(gè)客戶端下線,服務(wù)器必須及時(shí)通知其它客戶端該客戶下線的通知,所以必須主動訪問客戶端。 客戶端為了允許服務(wù)器調(diào)用,需要在NetConnnection中指定client屬性,該屬性就是指定服務(wù)器能訪問客戶端的對象范圍,可以指定某個(gè)方法,也就是服務(wù)器只能訪問那個(gè)方法,也可以把整個(gè)mxml對象都指定為client,這樣服務(wù)器就可以訪問mxml對象內(nèi)的元素了。 通常指定client是在連接服務(wù)器的時(shí)候: //指定連接client,方便red5調(diào)用當(dāng)前客戶端的方法
netConn.client = this; 在flex中創(chuàng)建一個(gè)普通的方法: /*** 【供red5調(diào)用的方法】* 客戶端與red5連接時(shí),red5向客戶端返回的消息* */public function connection_msg(str:String):void{Alert.show(str);} red5服務(wù)器端需要IServiceCapableConnection.invoke調(diào)用客戶端,它是IConnection的子接口,所以只要找到IConnection就可以調(diào)用IServiceCapableConnection了: invoke(String str,Object[] objs)方法第一個(gè)參數(shù)表示客戶端的方法名,第二個(gè)參數(shù)表示客戶端方法中必須傳入的參數(shù)值。 public boolean appConnect(IConnection arg0, Object[] arg1) {callClient(arg0,"通知客戶端連接成功");return super.appConnect(arg0, arg1);
}/*** Function : red5調(diào)用客戶端connection_msg方法,返回相應(yīng)信息* @author : bless<505629625@qq.com>* @param conn* @param str*/private void callClient(IConnection conn,String str){if(conn instanceof IServiceCapableConnection){IServiceCapableConnection sc = (IServiceCapableConnection) conn;sc.invoke("connection_msg", new Object[]{str});}} ? 【通知其它在線用戶】 通過IConnection.getScope()獲取域中其它用戶,再一次迭代通知每一個(gè)域中的客戶 public boolean appConnect(IConnection arg0, Object[] arg1) {//通知其它用戶該用戶上線notifyAppConnect(arg0.getScope(),"用戶A上線啦");
}/*** Function : 通知其它客戶,用戶上線信息* @author : bless<505629625@qq.com>* @param scope*/private void notifyAppConnect(IScope scope,String userName){//遍歷所有鏈接到服務(wù)器的客戶端Collection<Set<IConnection>> col = scope.getConnections();for (Set<IConnection> set : col) {for (IConnection iConnection : set) {//通知有所客戶端上線用戶信息if(iConnection instanceof IServiceCapableConnection){IServiceCapableConnection sc = (IServiceCapableConnection) iConnection;sc.invoke("otherConnection_msg", new Object[]{userName});}}}} 【服務(wù)器指定計(jì)劃任務(wù)】 計(jì)劃任務(wù)可以讓服務(wù)器定時(shí)循環(huán)做一些事,比如定時(shí)向客戶端發(fā)送消息提示之類的。 MultiThreadedApplicationAdapter.addScheduledJob(int interval, IScheduledJob job) interval表示多少毫秒運(yùn)行一次該計(jì)劃,但是是毫秒哦 job是IScheduledJob接口,你必須實(shí)現(xiàn)IScheduledJob接口 比較常用的方式是在當(dāng)前服務(wù)器核心類實(shí)現(xiàn)IScheduledJob接口并且重寫execute(ISchedulingService arg0)方法: public class HelloRed5 extends ApplicationAdapter implements IScheduledJob{public boolean appStart(IScope arg0) {System.out.println("啟動 appStart");//添加計(jì)劃任務(wù)this.addScheduledJob(10000, this);return super.appStart(arg0);}/*** IScheduledJob接口實(shí)現(xiàn)方法*/@Overridepublic void execute(ISchedulingService arg0)throws CloneNotSupportedException {//運(yùn)行定時(shí)任務(wù)的實(shí)際方法callEvery(this.getScope(),"運(yùn)行下計(jì)劃任務(wù)...");}
} ? 把這幾種交互方式和基本概念掌握清楚,就能編寫一個(gè)簡單的聊天程序了。
總結(jié)
以上是生活随笔為你收集整理的red5简介及基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。