UMS开发系列之一:用ActionScript和服务端JavaScript开发RTMP网络实时应用
来源:互联网 发布:360软件管家有安卓版 编辑:程序博客网 时间:2024/06/05 04:11
本文介绍如何使用ActionScript和UMS交互服务器开发实时交互式多媒体应用。RTMP协议是flash/AIR平台原生支持的实时消息协议。基于RTMP协议,flash/AIR平台应用可以和服务端进行双向数据通信、传输实时音视频。ActionScript3中的NetConnection对象提供了与RTMP服务端建立连接、收发数据包的接口。使用这些原生接口进行应用开发,无疑是最高效和便捷的。本文介绍如何使用ActionScript3和UMS服务器开发RTMP网络实时应用。
2.AMS介绍AMS是Adobe Media Server(以前叫FMS)的缩写,是Adobe官方推出的标准RTMP服务器,支持用服务端js语言编写服务端扩展,但AMS的js平台比较封闭,不能加载外部模块,只能简单调用服务端的js对象对连接指令、授权进行处理。如果要开发与数据业务集成紧密的大型flash网络应用,则AMS将显得力不从心,因为AMS服务器跟常用的数据库(如redis/MySQL/MongoDB/Sqlite3等)集成的能力非常有限。
3.UMS介绍UMS是Ultrant Media Server的缩写,是一款多功能流媒体/交互服务器解决方案,基于node.js构建,底层采用高性能C/C++多线程异步框架实现连接管理,并将绝大部分可操作功能以javascript接口方式暴露在node.js上下文中,能实现精确的实时流量统计、连接管理、权限验证以及灵活方便的远程接口扩展,能应对多媒体上层业务的快速变化。业务层逻辑能够完全通过js进行扩展和控制,支持RTMP协议,支持AMF0/AMF3编码,支持RTMP命令服务端扩展。
UMS性能优异,单机RTMP数据连接可以达到5-10万并发,一台服务器就可以支撑一个中型规模的网络游戏。对于音视频数据,在带宽饱和、保证播放质量的前提下,单台服务器可以支持3000-12000并发并发(视频3000+,纯音频12000)。UMS支持单机多进程、多机、多级集群部署。
由于node.js是一个开放的开发平台,拥有庞大而活跃的开发者社区,基于node.js开发的模块达到10万之多。UMS将RTMP命令扩展到node.js层面,无异于打破了RTMP连接和庞大的应用层模块社区之间的藩篱,将ActionScript3应用带入了丰富多彩的数据接入层,AS3应用可以轻松接入各类数据库模块(sqlite3/redis/mysql/mongodb等)。
长话短说,来看一个简单的ActionScript3和UMS服务器交互的例子。
ActionScript3代码:
<span style="font-size:14px;">package{ import flash.display.Sprite; import flash.events.Event; import flash.events.NetStatusEvent; import flash.net.NetConnection; import flash.net.ObjectEncoding; import flash.net.Responder; public class AS3UMSTutor1 extends Sprite { private var _nc:NetConnection = null; private var _responder:Responder = null; public function AS3UMSTutor1() { this.addEventListener(Event.ADDED_TO_STAGE, setupPlayer); this._nc = new NetConnection(); this._nc.objectEncoding = ObjectEncoding.AMF3; this._nc.addEventListener( NetStatusEvent.NET_STATUS, netStatusHandler); //Allow method within the class to be called by the server side script this._nc.client = this; this._responder = new Responder(onResponderReply, onResponderError); } protected function setupPlayer(event:Event=null):void { try { this.removeEventListener(Event.ADDED_TO_STAGE, setupPlayer); this._nc.connect("rtmp://127.0.0.1/myApp"); } catch (err:Error) { // } } //Handle NetStatus private function netStatusHandler( event:NetStatusEvent ):void { //trace(event.info.code); switch( event.info.code ) { // Successfully connected to UMS, execute function case "NetConnection.Connect.Success": { this._nc.call("helloFromAS3", this._responder, "hello,ums :)"); } break; case "NetConnection.Connect.Rejected": break; case "NetConnection.Connect.Closed": break; case "NetConnection.Connect.Failed": break; } } private function onResponderReply(result:Object):void{ trace(result.message); } private function onResponderError(result:Object):void{ trace(result.message); } }}</span>
node.js代码:
<span style="font-size:14px;">///////////////////////////////////////////////////////////////////////////////// file : as3tutor1.js// author : IMMAAC Co.,Ltd.// description : example file to demonstrate how to use ums/////////////////////////////////////////////////////////////////////////////// var ums = require('umsjs'); /** * global options */ var rtmpPort = 1935; ///////////////////////////////////////////////////////////////////////////////// @function : main// @params : server - (RTMPServer, RTMPServer实例)// @return : 无// @brief : 用户程序入口,在这里添加相关业务逻辑操作。// @remark : 进入该入口前,RTMPServer并未添加任何服务端应用程序(server-side// application),只是开始在相应端口上监听新连接,但任何新建立的连接// 都会被拒绝。所以必须为server添加至少一个服务端应用程序,服务才能// 正常工作。///////////////////////////////////////////////////////////////////////////////function main(server){ // 订阅TCP连接建立的时间通知 server.on('connection', function(conn){ // 接受一个TCP连接 this.accept(conn, true); // 拒绝连接用法 : this.accept(conn, false); }); // 订阅RTMPServer出错通知 server.on('error', function(err){ console.dir(err); }); // 订阅RTMPServer关闭通知 server.on('close', function(){ console.log('server closed.'); }); // 载入服务端应用程序'myApp' loadmyApp(server);} ///////////////////////////////////////////////////////////////////////////////// @function : loadmyApp// @params : server - (RTMPServer, 一个已经成功创建并运行的RTMPServer实例)// @brief : 加载一个名为'myApp'的服务端应用程序。// @remark : 该示例将完成如下操作:// 1.创建一个名为'myApp'的服务端应用程序;// 2.订阅相关事件。///////////////////////////////////////////////////////////////////////////////function loadmyApp(server){ // 创建一个名为'myApp'的服务端应用程序ums.Application的实例 var app = ums.createApplication("myApp"); // 订阅出错事件 app.on('error', function(err){ console.log('error : ', err); }) // 添加'connect'事件的监听处理函数 app.on('connect', function(cmd, client){ // 接受新连接 app.accept(cmd, client, true);// 拒绝连接用法 : app.accept(cmd, client, false); // 订阅错误事件 client.on('error', function(err){ console.dir(err); }); // 订阅关闭事件 client.on('close', function(){ console.log("client[",this.clientId,"] closed. Total time :", (new Date()).getTime() - client.connectedTime.getTime()); }); // 订阅helloFromAS3事件 client.on('helloFromAS3', function(cmd, message){ console.dir(message); // hello,ums :) cmd.echoResult({ message : 'hello, as3 :)' }); }); }); // 将服务端应用实例注册到RTMPServer实例中 server.register(app);} ///////////////////////////////////////////////////////////////////////////////// @function : entryPoint// @params : 无// @brief : 主程序入口,在这里完成RTMPServer的初始化工作///////////////////////////////////////////////////////////////////////////////function entryPoint(){ // 创建一个RTMPServer选项集合,构造参数指定为服务器选项集合 var serverOpt = ums.createRTMPOptions(true); serverOpt.rtmpPort = rtmpPort; // 创建RTMPServer实例 var server = ums.createRTMPServer(serverOpt); server.start(function(err){ if (err) { console.log(err); return; } // 进入用户入口 main(server); });} ///////////////////////////////////////////////////////////////////////////////// 进入主程序入口// Every thing starts form here/////////////////////////////////////////////////////////////////////////////// entryPoint(); ///////////////////////////////////////////////////////////////////////////////// End of file : as3tutor1.js///////////////////////////////////////////////////////////////////////////////</span>
本文介绍了如何使用ActionScript3原生NetConnection对象与UMS建立RTMP连接,以及通过RTMP调用UMS服务端用户自定义的命令处理函数,并从服务端返回数据的方法。而这些功能仅是UMS强大的实时交互能力的一部分,更多UMS服务端接口和高级用法,将在后续系列文章里面陆续通过demo的方式演示,敬请期待。
- UMS开发系列之一:用ActionScript和服务端JavaScript开发RTMP网络实时应用
- Qt 简介--Qt 应用开发系列之一
- [facebook开发系列之一]开始一个应用
- 实时开发框架Meteor 实际应用系列<一>---文件的上传和下载
- 实时开发框架Meteor 实际应用系列<一>---文件的上传和下载[补充]
- android视频开发之一Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
- Google App Engine应用开发系列之一 - 什么是App Engine
- iOS 开发 网络实时监测
- 使用Flex和Actionscript开发Flash游戏
- WEB 开发技术系列之一
- 嵌入式Linux开发系列之一
- MyEclipse 应用程序开发系列之一:
- Android开发系列笔记 之一
- Magento开发系列之一 基础知识
- 复合控件开发系列之一
- UCMA(OCS) 开发系列之一
- 开发小细节系列之一
- 神话系列之一 C# 开发的操作系统和数据库
- python实现对excel表的读写操作(一)
- LINUX文件系统详解
- zoj 3790
- 396经济类联考数学真题分析
- java第一节课笔记(随笔)
- UMS开发系列之一:用ActionScript和服务端JavaScript开发RTMP网络实时应用
- web.xml 配置 contextConfigLocation
- 通过案例学调优之--和 SHARED POOL 相关的主要 Latch
- C++获取浏览器浏览历史(兼容谷歌、IE、火狐)
- VMware投资10亿于中国并启动Linux开发项目
- 也许一个人成熟的标志,就是对别人的痛苦毫不关心
- PAT(A) 1084
- 什么是挂载?
- java基础-各种规则