首页 > 代码库 > UMS开发系列之一:用as3和js开发网络实时应用

UMS开发系列之一:用as3和js开发网络实时应用

AS3与UMS交互开发系列之一:用as3和js开发网络实时应用

1.导语

RTMP协议是flash/AIR平台原生支持的实时消息协议。基于RTMP协议,flash/AIR平台应用可以和服务端进行双向数据通信、传输实时音视频。ActionScript3中的NetConnection对象提供了与RTMP服务端建立连接、收发数据包的接口。使用这些原生接口进行应用开发,无疑是最高效和便捷的。本文介绍如何使用ActionScript和UMS开发实时交互式多媒体应用。

2.AMS介绍

AMS是Adobe Media Server(以前叫FMS)的缩写,是Adobe官方推出的标准RTMP服务器,支持用服务端js语言编写服务端扩展,但AMS的js平台比较封闭,不能加载外部模块,只能简单调用服务端的js对象对连接指令、授权进行处理。如果要开发大型flash网络应用,则AMF将显得力不从心。

3.UMS介绍

UMS是Ultrant Media Server的缩写,是IMMAAC公司推出的多功能高性能流媒体/交互服务器解决方案,基于node.js构建,底层采用高性能C/C++多线程异步框架实现连接管理,并将绝大部分可操作功能以javascript接口方式暴露在node.js上下文中,能实现精确的实时流量统计、连接管理、权限验证以及灵活方便的远程接口扩展,能应对多媒体上层业务的快速变化。业务层逻辑能够完全通过js进行扩展和控制,支持RTMP协议,支持AMF0/AMF3编码,支持RTMP命令服务端扩展。

由于node.js是一个开放的开发平台,拥有庞大而活跃的开发者社区,基于node.js开发的模块达到10万之多。UMS将RTMP命令扩展到node.js层面,无异于打通了RTMP连接和庞大的应用层模块之间的藩篱,将AS3应用带入了丰富多彩的接入层,AS3应用可以轻松接入各类数据库模块(sqlite3/redis/mysql/mongodb等)。

长话短说,来看一个简单的AS3和服务端交互的例子。

AS3代码:

 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 Sprite11     {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 script22             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 NetStatus36         private function netStatusHandler( event:NetStatusEvent ):void37         {38             //trace(event.info.code);39             switch( event.info.code )40             {41                 // Successfully connected to UMS, execute function42                 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 here107 ///////////////////////////////////////////////////////////////////////////////108 109 entryPoint();110 111 ///////////////////////////////////////////////////////////////////////////////112 // End of file : as3tutor1.js113 ///////////////////////////////////////////////////////////////////////////////

 

4.总结

本文介绍了如何使用AS3原生NetConnection对象与UMS建立RTMP连接,以及通过RTMP调用UMS服务端代码注册的函数,并从服务端返回消息的方法。更多复杂接口和高级用法,将在后续系列教程里面陆续推出,敬请期待。

 

UMS开发系列之一:用as3和js开发网络实时应用