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