UMS開發系列之一:用ActionScript和JavaScript開發RTMP網絡實時應用

UMS開發系列之一:用ActionScript和JavaScript開發RTMP網絡實時應用

1.導語

本文介紹如何使用ActionScript和UMS開發實時交互式多媒體應用。RTMP協議是flash/AIR平臺原生支持的實時消息協議。基於RTMP協議,flash/AIR平臺應用能夠和服務端進行雙向數據通訊、傳輸實時音視頻。ActionScript3中的NetConnection對象提供了與RTMP服務端創建鏈接、收發數據包的接口。使用這些原生接口進行應用開發,無疑是最高效和便捷的。javascript

2.AMS介紹

AMS是Adobe Media Server(之前叫FMS)的縮寫,是Adobe官方推出的標準RTMP服務器,支持用服務端js語言編寫服務端擴展,但AMS的js平臺比較封閉,不能加載外部模塊,只能簡單調用服務端的js對象對鏈接指令、受權進行處理。若是要開發與數據業務集成緊密的大型flash網絡應用,則AMS將顯得力不從心,由於AMS服務器跟經常使用的數據庫(如redis/MySQL/MongoDB/Sqlite3等)集成的能力很是有限。java

3.UMS介紹

UMS是Ultrant Media Server的縮寫,是一款多功能高性能流媒體/交互服務器解決方案,基於node.js構建,底層採用高性能C/C++多線程異步框架實現鏈接管理,並將絕大部分可操做功能以javascript接口方式暴露在node.js上下文中,能實現精確的實時流量統計、鏈接管理、權限驗證以及靈活方便的遠程接口擴展,能應對多媒體上層業務的快速變化。業務層邏輯可以徹底經過js進行擴展和控制,支持RTMP協議,支持AMF0/AMF3編碼,支持RTMP命令服務端擴展。node

因爲node.js是一個開放的開發平臺,擁有龐大而活躍的開發者社區,基於node.js開發的模塊達到10萬之多。UMS將RTMP命令擴展到node.js層面,無異於打通了RTMP鏈接和龐大的應用層模塊之間的藩籬,將AS3應用帶入了豐富多彩的接入層,AS3應用能夠輕鬆接入各種數據庫模塊(sqlite3/redis/mysql/mongodb等)。mysql

長話短說,來看一個簡單的AS3和服務端交互的例子。redis

ActionScript代碼:

 1 package
 2 {
 3     import flash.display.Sprite;
 4     import flash.events.Event;
 5     import flash.events.NetStatusEvent;
 6     import flash.net.NetConnection;
 7     import flash.net.ObjectEncoding;
 8     import flash.net.Responder;
 9 
10     public class AS3UMSTutor1 extends Sprite
11     {
12         private var _nc:NetConnection = null;
13         private var _responder:Responder = null;
14 
15         public function AS3UMSTutor1()
16         {
17             this.addEventListener(Event.ADDED_TO_STAGE, setupPlayer);
18             this._nc = new NetConnection();
19             this._nc.objectEncoding = ObjectEncoding.AMF3;
20             this._nc.addEventListener( NetStatusEvent.NET_STATUS, netStatusHandler);
21             //Allow method within the class to be called by the server side script
22             this._nc.client = this;
23             this._responder = new Responder(onResponderReply, onResponderError);
24         }
25 
26         protected function setupPlayer(event:Event=null):void {
27             try {
28                 this.removeEventListener(Event.ADDED_TO_STAGE, setupPlayer);
29                 this._nc.connect("rtmp://127.0.0.1/myApp");
30             } catch (err:Error) {
31                 //
32             }
33         }
34 
35         //Handle NetStatus
36         private function netStatusHandler( event:NetStatusEvent ):void
37         {
38             //trace(event.info.code);
39             switch( event.info.code )
40             {
41                 // Successfully connected to UMS, execute function
42                 case "NetConnection.Connect.Success":
43                     {
44                         this._nc.call("helloFromAS3", this._responder, "hello,ums :)");
45                     }
46                     break;
47                 case "NetConnection.Connect.Rejected":
48                     break;
49                 case "NetConnection.Connect.Closed":
50                     break;
51                 case "NetConnection.Connect.Failed":
52                     break;
53             }
54         }
55         private function onResponderReply(result:Object):void{
56             trace(result.message);
57         }
58         private function onResponderError(result:Object):void{
59             trace(result.message);
60         }
61     }
62 }

 

node.js代碼:

  1 ///////////////////////////////////////////////////////////////////////////////
  2 // file : as3tutor1.js
  3 // author : IMMAAC Co.,Ltd.
  4 // description : example file to demonstrate how to use ums
  5 ///////////////////////////////////////////////////////////////////////////////
  6 
  7 var ums = require('umsjs');
  8 
  9 /**
 10  * global options
 11  */
 12 
 13 var rtmpPort = 1935;
 14 
 15 ///////////////////////////////////////////////////////////////////////////////
 16 // @function : main
 17 // @params : server - (RTMPServer, RTMPServer實例)
 18 // @return : 無
 19 // @brief : 用戶程序入口,在這裏添加相關業務邏輯操做。
 20 // @remark : 進入該入口前,RTMPServer並未添加任何服務端應用程序(server-side
 21 //   application),只是開始在相應端口上監聽新鏈接,但任何新創建的鏈接
 22 //   都會被拒絕。因此必須爲server添加至少一個服務端應用程序,服務才能
 23 //   正常工做。
 24 ///////////////////////////////////////////////////////////////////////////////
 25 function main(server){
 26     // 訂閱TCP鏈接創建的時間通知
 27     server.on('connection', function(conn){
 28         // 接受一個TCP鏈接
 29         this.accept(conn, true); // 拒絕鏈接用法 : this.accept(conn, false);
 30     });
 31     // 訂閱RTMPServer出錯通知
 32     server.on('error', function(err){
 33         console.dir(err);
 34     });
 35     // 訂閱RTMPServer關閉通知
 36     server.on('close', function(){
 37         console.log('server closed.');
 38     });
 39     // 載入服務端應用程序'myApp'
 40     loadmyApp(server);
 41 }
 42 
 43 ///////////////////////////////////////////////////////////////////////////////
 44 // @function : loadmyApp
 45 // @params : server - (RTMPServer, 一個已經成功建立並運行的RTMPServer實例)
 46 // @brief : 加載一個名爲'myApp'的服務端應用程序。
 47 // @remark : 該示例將完成以下操做:
 48 //   1.建立一個名爲'myApp'的服務端應用程序;
 49 //   2.訂閱相關事件。
 50 ///////////////////////////////////////////////////////////////////////////////
 51 function loadmyApp(server){
 52     // 建立一個名爲'myApp'的服務端應用程序ums.Application的實例
 53     var app = ums.createApplication("myApp");
 54     // 訂閱出錯事件
 55     app.on('error', function(err){
 56         console.log('error : ', err);
 57     })
 58     // 添加'connect'事件的監聽處理函數
 59     app.on('connect', function(cmd, client){
 60         // 接受新鏈接
 61         app.accept(cmd, client, true);// 拒絕鏈接用法 : app.accept(cmd, client, false);
 62         // 訂閱錯誤事件
 63         client.on('error', function(err){
 64             console.dir(err);
 65         });
 66         // 訂閱關閉事件
 67         client.on('close', function(){
 68             console.log("client[",this.clientId,"] closed. Total time :", 
 69             (new Date()).getTime() - client.connectedTime.getTime());
 70         });
 71         // 訂閱helloFromAS3事件
 72         client.on('helloFromAS3', function(cmd, message){
 73             console.dir(message); // hello,ums :)
 74             cmd.echoResult({
 75                 message : 'hello, as3 :)'
 76             });
 77         });
 78     });
 79     // 將服務端應用實例註冊到RTMPServer實例中
 80     server.register(app);
 81 }
 82 
 83 ///////////////////////////////////////////////////////////////////////////////
 84 // @function : entryPoint
 85 // @params : 無
 86 // @brief : 主程序入口,在這裏完成RTMPServer的初始化工做
 87 ///////////////////////////////////////////////////////////////////////////////
 88 function entryPoint(){
 89     // 建立一個RTMPServer選項集合,構造參數指定爲服務器選項集合
 90     var serverOpt = ums.createRTMPOptions(true);
 91     serverOpt.rtmpPort = rtmpPort;
 92     // 建立RTMPServer實例
 93     var server = ums.createRTMPServer(serverOpt);
 94     server.start(function(err){
 95         if (err) {
 96             console.log(err);
 97             return;
 98         }
 99         // 進入用戶入口
100         main(server);
101     });
102 }
103 
104 ///////////////////////////////////////////////////////////////////////////////
105 // 進入主程序入口
106 // Every thing starts form here
107 ///////////////////////////////////////////////////////////////////////////////
108 
109 entryPoint();
110 
111 ///////////////////////////////////////////////////////////////////////////////
112 // End of file : as3tutor1.js
113 ///////////////////////////////////////////////////////////////////////////////

 

4.總結

本文介紹瞭如何使用AS3原生NetConnection對象與UMS創建RTMP鏈接,以及經過RTMP調用UMS服務端代碼註冊的函數,並從服務端返回消息的方法。更多複雜接口和高級用法,將在後續系列教程裏面陸續推出,敬請期待。sql

相關文章
相關標籤/搜索