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類
ApplicationAdapter類是MultiThreadedApplicationAdapter的子類。ApplicationAdapter使用單線程的方式進行方法調用的消息出來,所以其性能不如MultiThreadedApplicationAdapter。MultiThreadedApplicationAdapter類,是Red5應用程序的基礎類。它提供了操作SharedObjects 和 streams的方法,還有連接和服務列表,是一個應用程序基本的Iscope。通常應用開發,一般會繼承ApplicationAdapter類。
在開發中,我們經常會接觸如下幾個方法,這些方法都是通過MultiThreadedApplicationAdapter實現:
Java代碼  收藏代碼
  1. //Red5應用程序啓動時自動執行此方法  
  2. public boolean appStart(IScope arg0)  
 //Red5應用程序停止時自動執行此方法
Java代碼  收藏代碼
  1. public void appStop(IScope arg0)  

 //flex客戶端連接項目時自動運行的方法

Java代碼  收藏代碼
  1. public boolean appConnect(IConnection arg0, Object[] arg1)  

 //flex客戶端與服務器斷開連接時觸發的方法

Java代碼  收藏代碼
  1. public void appDisconnect(IConnection arg0)  

 //flex客戶端與服務器連接時運行,與appConnect比較類似

Java代碼  收藏代碼
  1. public boolean appJoin(IClient arg0, IScope arg1)  

 //flex客戶端與服務器斷開時運行,與appDisconnect類似

Java代碼  收藏代碼
  1. public void appLeave(IClient arg0, IScope arg1)  

 

 
  • Red5關鍵API

Red5提供了很多接口供開發人員進行二次開發:

IConnection:連接對象。每個連接都有一個關聯的客戶端和域。連接可能是持續型、輪詢型、或短暫型。建立此接口的目的,是爲了給不同的子類,如 RTMPConnection,RemotingConnection,AJAXConnection, HttpConnection 等,提供基礎通用的方法。它提供getClient()方法來獲取客服端對象。

IScope :每個Red5應用程序至少有一個域,用來搭建處理器、環景、服務器之間的連接。域可以構成樹形結構,所有客戶端都可以作爲其節點共享域內的對象(比如流和數據)。所有的客服端(client)通過連接(connection)連接到域中。對於單一域,每個連接對應一個客服端,每個客服端對應一個id,簡單的應用,操作就針對一個id和一個連接進行。

IServiceCapableConnection :獲取有效連接。代碼中先獲取到連接實例,然後判斷是否是有效連接並強制類型轉換,之後調取客戶端相應函數。

IClient :客戶端對象代表某單一客戶端。一個客戶端可以和同一主機下不同的域分別建立連接。客戶端對象和HTTP session 很相像。可以使用IClientRegistry.newClient(Object[])方法來創建IClient對象。

ApplicationAdapter:ApplicationAdapter是應用層級的IScope。若要處理流進程,需實現 IStreamAwareScopeHandler接口中的相應處理方法。ApplicationAdapter還提供了有效的事件處理機制,來進行截取流、確認用戶等操作。同時,其子類中引入的方法均可在客戶端通過 NetConnection 調取。在Aodbe 的FMS 中必須在服務器端維護客戶端對象,與之相較,Red5 爲您的遠程請求提供了更加方便快捷的操作方法。

 
 
 
  • 簡單實例
【flex客戶端連接red5服務器】
 
Actionscript提供了NetConnection與服務器連接,連接之後可以調用red5的方法,也可以指定client對象供red5調用。
下面這段代碼是連接red5中某個自己創建的項目,並且通過事件監聽連接狀況:
Java代碼  收藏代碼
  1. //創建NetConnection實例  
  2. var netConn:NetConnection = new NetConnection();  
  3. //指定rtmp地址,並且向服務器傳遞一個參數值"hello"  
  4. netConn.connect("rtmp://localhost/chatroom","hello");  
  5. //添加NetStatus事件監聽連接  
  6. netConn.addEventListener(NetStatusEvent.NET_STATUS,function connStatus(e:NetStatusEvent):void{  
  7.                         switch(e.info.code){  
  8.                             //連接成功  
  9.                             case "NetConnection.Connect.Success":  
  10.                                 l_connStatus.text = "連接成功";  
  11.                                 break;  
  12.                             //服務器斷開  
  13.                             case "NetConnection.Connect.Closed":  
  14.                                 l_connStatus.text = "連接斷開";  
  15.                                 break;  
  16.                             //能連上,但被拒絕訪問  
  17.                             case "NetConnection.Connect.Failed":  
  18.                                 l_connStatus.text = "連接拒絕";  
  19.                                 break;  
  20.                             default:  
  21.                                 break;  
  22.                         }  
  23.                     });  
把這段代碼放到flex事件中,當觸發事件時就會連接red5.
 
 
【客戶端調用服務器方法】
客戶端調用服務器方法非常常用,有時你會主動向服務器獲取視頻資源,或者向服務器發送消息信息。
NetConnection的call(command:String,responder:Responder,...arguments)用於調用服務器方法,
command  指定被調用的服務器的方法名
responder 可選對象,用於處理服務器的返回值,這是回調的形式,所以需要實例化Responder對象,然後在對象體內創建一個方法獲取服務器返回值,如果沒有返回值,則方法參數爲空即可。
arguments 可選參數,當在遠程應用程序服務器上執行 command 參數中指定的方法時,這些參數將被傳遞給該方法
 
下面這段代碼介紹向服務器發送消息的方法:
Java代碼  收藏代碼
  1. /** 
  2.              * 發送消息 
  3.              * */  
  4.             protected function sendMsg():void  
  5.             {  
  6.                 netConn.call("sendMessage",new Responder(function result():void{  
  7.                 }),uName,txt_msg.text);  
  8.             }  
 服務器必須有一個sendMessage方法,並且帶兩個參數,以獲取客戶端傳入的參數值:
Java代碼  收藏代碼
  1. public void sendMessage(String userName,String message){  
  2.    ....  
  3. }  
 因爲當前方法沒有返回值,所以Responder內的result方法參數爲空,假如sendMessage方法返回String,則需要把Responder改成這樣:
Java代碼  收藏代碼
  1. new Responder(function result(str:String):void{  
  2.    ....  
  3. })  
 
 
【服務器調用客戶端】
比如一個會議系統,某個客戶端下線,服務器必須及時通知其它客戶端該客戶下線的通知,所以必須主動訪問客戶端。
客戶端爲了允許服務器調用,需要在NetConnnection中指定client屬性,該屬性就是指定服務器能訪問客戶端的對象範圍,可以指定某個方法,也就是服務器只能訪問那個方法,也可以把整個mxml對象都指定爲client,這樣服務器就可以訪問mxml對象內的元素了。
通常指定client是在連接服務器的時候:
Xml代碼  收藏代碼
  1. //指定連接client,方便red5調用當前客戶端的方法  
  2. netConn.client = this;  
 在flex中創建一個普通的方法:
Java代碼  收藏代碼
  1. /** 
  2.              * 【供red5調用的方法】 
  3.              * 客戶端與red5連接時,red5向客戶端返回的消息 
  4.              * */  
  5.             public function connection_msg(str:String):void{  
  6.                 Alert.show(str);  
  7.             }  
 
red5服務器端需要IServiceCapableConnection.invoke調用客戶端,它是IConnection的子接口,所以只要找到IConnection就可以調用IServiceCapableConnection了:
invoke(String str,Object[] objs)方法第一個參數表示客戶端的方法名,第二個參數表示客戶端方法中必須傳入的參數值。
Java代碼  收藏代碼
  1. public boolean appConnect(IConnection arg0, Object[] arg1) {  
  2.     callClient(arg0,"通知客戶端連接成功");  
  3.     return super.appConnect(arg0, arg1);  
  4. }  
  5.   
  6. /** 
  7.      * Function  : red5調用客戶端connection_msg方法,返回相應信息 
  8.      * @author   : bless<[email protected]> 
  9.      * @param conn 
  10.      * @param str 
  11.      */  
  12.     private void callClient(IConnection conn,String str){  
  13.         if(conn instanceof IServiceCapableConnection){  
  14.             IServiceCapableConnection sc = (IServiceCapableConnection) conn;  
  15.             sc.invoke("connection_msg"new Object[]{str});  
  16.         }  
  17.     }  
 
 
【通知其它在線用戶】
通過IConnection.getScope()獲取域中其它用戶,再一次迭代通知每一個域中的客戶
Java代碼  收藏代碼
  1. public boolean appConnect(IConnection arg0, Object[] arg1) {  
  2.      //通知其它用戶該用戶上線  
  3.      notifyAppConnect(arg0.getScope(),"用戶A上線啦");  
  4. }  
  5.   
  6. /** 
  7.      * Function  : 通知其它客戶,用戶上線信息 
  8.      * @author   : bless<[email protected]> 
  9.      * @param scope 
  10.      */  
  11.     private void notifyAppConnect(IScope scope,String userName){  
  12.         //遍歷所有鏈接到服務器的客戶端  
  13.         Collection<Set<IConnection>> col = scope.getConnections();  
  14.         for (Set<IConnection> set : col) {  
  15.             for (IConnection iConnection : set) {  
  16.                 //通知有所客戶端上線用戶信息  
  17.                 if(iConnection instanceof IServiceCapableConnection){  
  18.                     IServiceCapableConnection sc = (IServiceCapableConnection) iConnection;  
  19.                     sc.invoke("otherConnection_msg"new Object[]{userName});  
  20.                 }  
  21.             }  
  22.         }  
  23.     }  
 
【服務器指定計劃任務】
計劃任務可以讓服務器定時循環做一些事,比如定時向客戶端發送消息提示之類的。
MultiThreadedApplicationAdapter.addScheduledJob(int interval, IScheduledJob job)
interval表示多少毫秒運行一次該計劃,但是是毫秒哦
job是IScheduledJob接口,你必須實現IScheduledJob接口
比較常用的方式是在當前服務器核心類實現IScheduledJob接口並且重寫execute(ISchedulingService arg0)方法:
Java代碼  收藏代碼
  1. public class HelloRed5 extends ApplicationAdapter implements IScheduledJob{  
  2.           public boolean appStart(IScope arg0) {  
  3.         System.out.println("啓動 appStart");  
  4.         //添加計劃任務  
  5.         this.addScheduledJob(10000this);  
  6.         return super.appStart(arg0);  
  7.       }  
  8.             
  9.            /** 
  10.      * IScheduledJob接口實現方法 
  11.      */  
  12.     @Override  
  13.     public void execute(ISchedulingService arg0)  
  14.             throws CloneNotSupportedException {  
  15.                 //運行定時任務的實際方法  
  16.         callEvery(this.getScope(),"運行下計劃任務...");  
  17.     }  
  18. }  
 
 
把這幾種交互方式和基本概念掌握清楚,就能編寫一個簡單的聊天程序了。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章