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 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服务端代码注册的函数,并从服务端返回消息的方法。更多复杂接口和高级用法,将在后续系列教程里面陆续推出,敬请期待。

时间: 2024-10-05 09:07:08

UMS开发系列之一:用as3和js开发网络实时应用的相关文章

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneGap.ionic.AngularJS这些框架或库的关系,我个人理解是这样,PhoneGap是一个商业项目,用来实现HTML5式的跨平台开发,后来Adobe公司将其中的核心代码开源,就是Cordova,Cordova只负责实现JavaScript调用原生代码的功能,是一个壳,而壳里具体用什么样式,在H

Chrome浏览器扩展开发系列之十九:扩展开发示例

翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深股票价格变化实时追踪提醒”软件能够实时获取用户指定的股票的价格等参数,并根据用户设置的价格区间进行越界提醒.该软件目前只实现了两部分,一个是options页面,用以配置用户要监听的股票及股票的价格区间.另一个是browser action类型的popup页面,供用户查看股票当前价格,并通过图标的Ba

Android开发系列(十二):获得网络上的图片

获得网络上图片的过程: 获得图片的Url->通过Url连接图片对象->把读到的图片的二进制数据写入内存->返回内存中的数据->显示出来 首先,我们要添加权限 因为我们要访问网络,所以我们要在AndroidManifest.xml文件总添加网络访问权限: <!-- 访问internet权限 --> <uses-permission android:name="android.permission.INTERNET"/> 然后就是设置界面:m

Node.js开发入门—使用jade模板引擎

在"Node.js开发入门--Express安装与使用"里,我们曾经使用express generator创建了一个HelloExpress网站,express工具为我们生成了基本的目录结构.模板.stylesheet.routers等.虽然那只是一个简单的HelloWorld类的小东西,可里面包含的内容还是有些多了,为了更好的理解Express所支持的jade模板引擎的用法,我们这次提供一个手动创建的小网站,可以显示来访者的IP,并对访问进行计数. 安装jade npm instal

iOS开发系列文章(持续更新……)

iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大家交流,新建一个iOS技术交流群,欢迎大家加入:64555322 C语言 IOS开发系列--C语言之基础知识 IOS开发系列--C语言之数组和字符串 IOS开发系列--C语言之指针 IOS开发系列--C语言之预处理 IOS开发系列--C语言之存储方式和作用域 IOS开发系列--C语言之构造类型 Ob

Node.js开发入门—语音合成示例

出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice. 我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/file.php. 直接上代码吧,okVoiceTts.js,内容如下: var http = require('http'); var fs =require('fs'); var crypto = require('crypto'); var util = require('util'); va

Node.js开发入门—使用对话框ngDialog

做网站经常会遇到弹出对话框获取用户输入或弹出对话框让用户确认某个操作之类的情景,有一个基于AngularJS的扩展模块可以帮我们优雅地完成这类事情:ngDialog. ngDialog在github上提供了一个示例网页,演示了它的各种用法,在这里:https://github.com/likeastore/ngDialog/blob/master/example/index.html.ngDialog的github主页的readme也对常用的指令和服务做了较为详细的介绍,可以参考.我这篇就纯粹是

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R

Node.js开发入门—Angular简单示例

在"使用AngularJS"中,我们提到了如何在Node.js项目中引入AngularJS,这次提供一个非常简单的示例,演示AngularJS里的指令.数据绑定.服务等内容. 我准备做Web后台管理系统,不同的管理员会有不同的权限,管理员登录后看到的菜单和他的权限有关,能看到什么,是动态生成的(类似RBAC).本文的示例从这个项目而来,当然,现在还是最简单的. 如果没有特别说明,后面我们用到的示例都使用express generator生成. Angular小demo 先搞起来吧. 第