SlideShare a Scribd company logo
1 of 74
Download to read offline
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-1-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

Macromedia Flash Media Server 2
帮助 中文版-译本
说明:因为翻译制作的时间较短,所以里面有部份图片没放上,还有些格式没调整,但很多 Flash 开发者们
早就迫切的想要这份中文版,所以先提早放出了,而不完善的地方会在今后完善,请大家关注,在之后还
会制作成帮助文档便于大家使用,现在就先用这个应付一下吧!谢谢您的支持和谅解!

云南 TT 概念游戏公司整理制作
——全国第一的 Flash 网络游戏专家——
www.TTNo1.com
特别感谢:
Macromedia Flash Media Server 2 开发小组的英文原版
以及在翻译及整理过程中给于帮助所有 Flash 开发者们
特别通告:
TTGame 诚邀各位 Flash 爱好者、开发者们的加入!
希望你与我们一起开创一片 Flash 的新天地!
为不断增强团队实力,实现更大更远的目标!
特招聘:
Flash 游戏开发者
Flash 应用开发者
Flash 动画高手
Flash 艺术设计
及 Flash 各路高手
希望你积极与我们取得联系
不论你是想要加入我们、还是想要与我们交流、
还是因为有共同的目标、还是因为想与我们合作
还是、还是、还是、、、、
、、、、
都希望你通过以下联系方式联系我们
联系方式:
Email:ynttgame@163.com
QQ: 50955577

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-2-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

《开发媒体应用程序》
欢迎来到Macromedia Flash Media Server 2-一个强大的服务器平台,用于在Macromedia Flash中创建富
媒体应用程序,以及
将音频和视频流入Flash客户机端。Flash Media Server(FMS)可以让两个或更多的人们使用文本、音频或
视频参与到一个实时
的会话当中。例如,你可以将FMS用于会议、在线的社区交互、客户支持、销售支持,或是培训。FMS是
为视频消息、视频聊
天,以及视频博客提供动力的一种绝佳方式。FMS也是一种用于流实时数据,以及把Flash视频体验打入各
种网络以进行Internet
呈递的平台。FMS是Macromedia完整的数据库连通性、目录系统,以及现场服务解决方案中的一个组成部
分,是唯一的能够将
音频和视频呈递给流行的Flash Player的服务器。

面对的目标读者
这个手册展示给你-这位Flash开发者-在建立一个开发环境及创建Flash Media Server应用程序中会涉及
到的步骤,包括调试
和测试应用程序。
你应该已经对Flash创作、ActionScript,以及Flash Player很熟悉。熟悉JavaScript、客户机/服务器模式,
以及网络概念将是
非常有帮助的。
Flash Media Server文档配置假定你已经安装了Macromedia Flash并知道如何使用它。

关于Flash Media Server文档
Flash Communication Server文档是被设计为与Flash文档-也就是《使用Flash》和《ActionScript 2.0语言
参考》配合使用的。
所有的Flash Media Server文档都以PDF格式
(可以用Adobe Acrobat Reader来阅读和打印)
在Flash Media
Server光盘中、
Macromedia网站上,以及作为Macromedia Flash应用程序中的Flash帮助可用。Flash Media Server文档也在
Macromedia网站上作为
LiveDoc格式文档可用。
安装Flash Media Server描述了如何安装服务器及Flash创作扩展。
它还列出了在安装期间将被安装
的文件。
开始使用Flash Media Server展示了对Flash Media Server,
以及版本中的新功能的一个简短的概述。
同时还包含了系
统需求和安装指导。
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-3-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

你可以在Flash Media Server光盘中找到本手册的一个可打印版本。
开发媒体应用程序这份手册解释了如何建立你的开发环境,以及如何使用Flash创作环境和Flash
Media Server应用程序
编程接口(API)来创建媒体应用程序。
管理Flash Media Server解释了配置和维护这个服务器及使用管理控制台的细节。
Flash Media Server 2客户机端ActionScript语言参考对你可以用来创建客户机端功能的
ActionScript进行了归档。
服务器端ActionScript语言参考对你可以用来创建服务器端功能的ActionScript进行了归档。
服务器管理ActionScript语言参考对你可以用来扩展管理控制台,或是创建你自己的管理和监视工
具的高级
ActionScript方法进行了归档。

可供学习Flash Media Server的支持

你可能想要探索其他可供学习Flash Media Server的支持。
Flash Media Server Support Center提供了TechNotes及有关Flash Media Server的最新信息。
Flash Media Server Developer Center站点提供了创建Flash Media Server应用程序的提示和范例。
Flash Media Server在线论坛为你与其他Flash Media Server用户聊天提供了一个场所。
要获得软件发布后的最新消息以及目前依然存在的问题的完整列表,访问Flash Media Server
release notes。

第一章开始

本章描述了在你开始利用Macromedia Flash Media Server 2开发应用程序之前所必需做的工作。它描述
了如何建立你的开发
环境,如何部署你的应用程序,以及如何创建一个例子应用程序连接到这个服务器。

安装和系统需求
要获得有关如何安装Flash Media Server,以及有关系统需求的信息,请参看安装Flash Media Server。

配置硬件和软件
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-4-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

要编写Flash Media Server应用程序,你必须安装Macromedia Flash创作软件、Flash Media Server,以及
最新版的Flash
Player。如果你想要编写涉及捕获音频和视频的应用程序,则你还需要安装一个麦克风和摄像头。此外,如
果你的Flash Media
Server应用程序涉及服务器端脚本的编写,则你还需要一个UTF-8 JavaScript编辑器,比如Flash Professional
中的脚本窗口。所有
这些开发环境中的每一个元素都将在这个部分中进行讨论。
Flash创作软件 如果你尚未安装Macromedia Flash,请参看Flash文档。
Flash Media Server软件 如果你尚未安装服务器,请参看安装Flash Media Server,该文档以PDF格式在
产品光盘上可用。
Flash Player 确保你正在使用最新版的Flash Player。你可以从Macromedia网站下载Flash Player。
注意:如果你正在Linux上运行Flash Media Server,则你将需要一台安装有Flash的Windows或Macintosh
计算机来创建你的媒
体应用程序,并且,你需要在你的创作计算机上安装创作扩展。你也会希望在你的UNIX服务器上安装Flash
Player以使用管理工
具。
摄像头和麦克风要安装一个摄像头或麦克风,按照该设备的说明书上所给出的指导操作。要获得一个
已知的与Flash
Media Server兼容的摄像头的列表,参看Macromedia网站中有关摄像头兼容性的文档,网址是:
http://www.macromedia.com/go/tn_16453。不在该列表中的摄像头也可能是与Flash Media Server兼容的,但
它没经过Macromedia
的测试。
很多摄像头包含一个内建的麦克风。你也可以安装一个独立的麦克风,或者最好是一个耳麦。
在你安装了你的设备之后,你可以指定默认情况下Flash将使用哪个摄像头或麦克风。当任何Flash应用
程序播放时,点击鼠
标右键,从上下文菜单中选择设置,点击麦克风或摄像头面板,然后从弹出菜单中选择你首选的设备。
使用JavaScript编辑器 你可以使用任何文本编辑器来编写服务器端ActionScript代码,你需要把这些代
码保存在以.asc或.js
作为扩展名的文件中。
你可能更愿意使用专为开发基于Web的应用程序而设计的软件,
比如Flash Professional
或Dreamweaver。
要在Flash中创建一个.asc文件,选择“文件->新建->动作脚本通信文件”。
要在你的服务器端脚本中包含非ASCII文本,比如亚洲语言中使用的双字节字符,你必须使用一个支持
UTF-8编码的编辑
器。Flash Media Server需要UTF-8编辑的ASC文件把双字节字符从一个客户机传送到另一个客户机。要获得
更多信息,参看“编
写双字节应用程序”。

创建一个开发环境
本部分阐述在你创建你的Flash Media Server应用程序前你所需要知道的事情。
确保服务器正在运行 要发布和测试你的应用程序,Flash Media Server必须处于运行状态。要获得更多
信息,请参看“启
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-5-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

动服务”。
指定服务器URI 使用正运行着Flash Media Server的服务器上的Flash创作环境。如果你的情况不是这
样,则需要把你的服务
器名添加到在这里归档的所有的connect命令中。例如,如果你的服务器正运行在
myServer.myDomain.com.com,则要把下面这
样的一行:
new_nc.connect("rtmp:/doc_record/room_01");
改为:
new_nc.connect("rtmp://myServer.myDomain.com/doc_record/room_01");
注意:确保你在修订后的代码中的rtmp:后使用了双斜线(//)。单斜线用法只有当这个SWF应用程序由
运行着Flash Media
Server的同一台计算机提供时才会被支持。
指定发布格式 配置Flash来发布SWF和HTML文件。要指定在发布期间将要创建的格式,在创作环境中
选择“文件->发布
设置”。
编写客户机端ActionScript代码 除非另有注明,否则,你的客户机端ActionScript代码将被捆绑到你的
FLA文件的第一帧的
某一层上,
而不会被捆绑到个别的对象。
针对Flash Player 7或更新版本发布的文件中的客户机端代码是大小
写敏感的。
编写服务器端ActionScript代码对于使用服务器端ActionScript代码的应用程序来说,
要把代码放置在一
个服务器端。把这
个文件命名为main.asc
(它也可以有一个诸如registered_app_name.asc这样的名字) 并使用Flash ActionScript
,
编辑器或JavaScript
编辑器来编写它。服务器端代码是大小写敏感的。
装载components.asc 要在任何应用程序中使用媒体组件,你必须装载components.asc文件,其位于
scriptlib目录中。要装载
这个文件,为你的应用程序创建一个服务器端脚本文件,假如你还没有这么做的话,那么,现在是适当的
命名它(比如叫做
main.asc)并在其顶端添加下面的代码的时候了:
load("components.asc");
技巧:你可能会发现只要把这个文件拷贝到任何使用了媒体组件的应用程序中就可以了,但要确保适
当的命名了它。
确认用户的隐私权在你记录或广播任何人的影像或声音之前,告知人们你的意图并得到他们的同意或
许可是非常重要
的。
监视运行中的应用程序 如果你有服务器管理权限,当你测试应用程序时你可以查看它的详细信息,比
如它生成的日志消

息、共享对象的值,等等。如果你想这么做的话,打开管理控制台并连接到Flash Media Server。要获得更
多信息,请参看第五
章“调试和监视应用程序”。

开发任务预览

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-6-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

下面的清单提供了一个要使任何应用程序与Flash Media Server协同工作,你所必需完成的所有任务的
一个总揽性的概述。
如果你想要获得本章中所讨论的这些任务的更详细的内容,那你应该阅读完整个这章。
要创建和部署一个Flash Media Server应用程序,完成下面的任务:
1. 为你的新应用程序选择一个名字
(例如,
my_app)
并在服务器上注册这个应用程序:
在Flash Media
Server应用程序目
录中,用你的应用程序的名字创建一个新目录。
这个名字就是你的“已注册应用程序名”(registered application name)。这个目录就是你的“已注册
应用程序目录”
(registered application directory)。
2. 在Flash中,创建一个FLA文件,其中包括一个新的NetConnection语句,该语句带有已注册应用程
序名,并且,如果适
用的话,在URI中还会包括应用程序的实例。
例如:
my_nc = new NetConnection();
my_nc.connect("rtmp://myDomain.com/registered_app_name");
这个语句把客户机连接到这个registered_app_name应用程序。
3. 使用你的已注册应用程序名来保存这个FLA文件。
你可以把这个FLA文件保存在任何地方;它是用来创建SWF文件的源文件,且不是被部署的应用
程序的一部分。
4. 如果你有一个包含服务器端ActionScript的脚本文件,把它放置在Flash Media Server应用程序目录
的已注册应用程序目
录中,或是你在这个已注册应用程序目录中创建的一个/scripts目录中。
你的服务器端脚本文件可以被命名为main.asc或registered_app_name.asc。
5. 在一个你的客户机可访问但Flash Media Server不使用的目录中发布你的应用程序的SWF文件。
例如,你可以把你的SWF文件放置在Web根目录中以便把你的应用程序分发给你的客户们,或者
你可以把SWF文件通
过电子邮件发送给你的客户们并存储在其他一些目录中。
依赖于你的应用程序,一些额外的步骤可能需要;但不管怎么说,这些步骤是所有的应用程序都必需
的,不管它们各自的
功能如何。
技巧:当你要命名配合Flash Media Server及其应用程序使用的目录和文件时,Macromedia推荐你使用
全部小写和没有空格
的名字。这个习惯将有助于确保在开发期间,如果你把文件移动到了不同的计算机或不同的平台上,你的
应用程序能够继续工
作。
本章剩下的部分描述了在建立你的应用程序的过程中会涉及到的事情,介绍了在Flash Media Server应
用程序中使用的对象
和文件,并向你展示了如何创建并连接到你的第一个Flash Media Server应用程序。

部署应用程序和应用程序实例
这个部分讨论你必须把你希望服务器寻找的应用程序数据放置在什么地方,同时也解释了如何以及为
什么要运行应用程序

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-7-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

实例。

保存服务器端和客户机端文件

服务器端应用程序文件的默认位置是C:Program filesMacromediaFlash Media Server 2applications。这
也就是那个被作为
applications目录提及的目录。当你创建一个媒体应用程序时,你必须创建一个已注册应用程序目录,它是
位于applications目录中
针对你的应用程序的一个子目录。
你可以把你的客户机端文件(SWF和HTML)保存在任何位置;但最可能的情况是,你会把它们保存
在你的Web服务器的
发布目录中。你的应用程序的FLA文件可以同SWF和HTML文件保存在一起,直到部署时刻的来临;在生产
时刻到来时,你应
该把这些FLA文件移走并把它们保存到一个安全的位置。
在你的开发工作的进展期间,为了组织的目的,把我们所有的客户机和服务器应用程序文件(FLA、
SWF、HTML或ASC)
保存在同一个子目录中可能是方便的。当你部署你的应用程序时,你可以把你的SWF和HTML文件放置在
任何位置。但不管怎
么说,已注册应用程序目录必需保存在Flash Media Server服务器上,连同应用程序要使用的任何ASC、FSO
和FLV文件。当你部
署服务器和应用程序时,服务器端文件(你的ASC、FLV,以及FSO文件)和你的FLA源文件不应该位于你
的Web根目录中。只
有你的SWF和HTML文件应该保存在Web根目录中。
在任何情况下,你都必须创建一个与你发出NetConnection.connect命令时所要连接到的应用程序同名的
已注册应用程序目
录。
例如,假定你有一个名为chat_App的应用程序,就像下面的例子所展示的这样:
NetConnection.connect("rtmp://myServer.myDomain.com/chat_App");
你必须在applications目录中创建一个名为chat_App的子目录。
再假定你的应用程序还要使用一些服务器
端脚本,这些脚本
被保存在一个名为chat_App.asc的文件中,则你必须把这个chat_App.asc保存到同一个目录中。
注意:即使你还没有什么服务器端脚本要保存到那个已注册应用程序目录中,你也必须创建这样一个
与你的应用程序名相

同的已注册应用程序目录。这是因为Flash Media Server会把任何由你的应用程序创建的流或共享对象文件
保存在你的已注册应
用程序目录中(参看“编码约定”)。同时,这个目录的存在也告诉Flash Media Server,这个应用程序是被授
权的,用户可以
连接到这个应用程序的实例。

保存你的应用程序的服务器端脚本文件

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-8-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

对于你绝大多数的应用程序而言,很可能是会需要用到服务器端脚本的。你可以在Flash ActionScript
编辑器或是在一个
JavaScript文本编辑器中创建你的应用程序的服务器端脚本文件。把这个脚本文件命名为main.asc或main.js
或
registered_app_name.asc或registered_app_name.js,在这里,registered_app_name是已注册应用程序目录的名
字和这个应用程序自
身的名字。把这个脚本文件保存在你的已注册应用程序目录中。例如,如果你为你的聊天应用程序创建了
一
个/applications/chat_app目录的话,则你应该把你的服务器端脚本文件命名为chat_app.asc并把它放置在
chat_app目录中。可选的
另一种方法是,你可以把你的服务器端脚本放置在已注册应用程序目录中的一个名为scripts的子目录中
(/applications/chat_App/scripts)。
注意:为了简化部署,Flash Media Server包含了一个档案编译工具(far.exe),你可以用它来把你的服
务器端脚本文件打
包成一个单独的档案文件。为了加速装载的时间,这个工具也允许你把脚本文件编译成二进制格式。要获
得更多信息,参看
“归档并编译服务器端脚本文件”。

关于应用程序实例

应用程序是通过创建应用程序实例(application instances)来运行的。当一个客户机连接到一个应用程
序时,这个客户机实
际上是被连接到一个应用程序实例。例如,一个客户机连接到一个名为chat_app的应用程序,就像下面的例
子展示的这样:
nc.connect("rtmp://myDomain.com/chat_app);
在这个例子中,
因为没有实例被指定,
因此这个客户机实际上是被连接到这个应用程序的名为_defInst_
的默认实例。客户
机也可以连接到由NetConnection.connect命令中的instanceName值定义的指定的应用程序实例,就像下面的
例子展示的这样:
nc.connect("rtmp://myDomain.com/chat_app/instance1);
在这个例子中,这个客户机被连接到名为instance1的应用程序实例。
你可能会想要把应用程序实例用于特殊的目的。例如,你可能希望不同组的人们可以访问同一个应用
程序,而互相之间又
不会产生影响,比如一个按不同的主题分为不同的“房间”的一个聊天室应用程序。要做到这点,你可以在
同一时刻构造这个
聊天室应用程序的多个实例,就像下面这样:
my_nc.connect("rtmp://myServer.myDomain.com/chatApp/room_01")

my_nc.connect("rtmp://myServer.myDomain.com/chatApp/room_02")
每一个应用程序实例都应该被唯一的命名。不同于其父应用程序,一个实例不需要在服务器上定义它
自己的目录。但不管
怎么说,应用程序的资源,比如流和共享对象,对于每个实例而言都是独立的,并且是被存储在为这个应
用程序配置的流和共

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

-9-
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

享对象存储目录下的它们各自的目录中的。
使用应用程序实例的另一个原因是可以避免由这个应用程序创建的记录流或共享对象的冲突。例如,
在上面的例子中,由
room_01创建的任何流或共享对象与由room_02创建的都是截然不同的,反之亦然,即使这两个实例都是运
行的同一个应用程
序-chat_App。
例如,尽管在下面的代码中,这个support应用程序创建了两个共享对象,都被命名为CustomerInfo,但
这个support应用程
序的每一个实例都只能访问它自己的CustomerInfo对象。同样,由session1使用的CustomerInfo中的数据与由
session2使用的
CustomerInfo中的数据也是不同的,就像下面的例子所展示的这样:
//"support"应用程序的一个实例
first_nc = new NetConnection();
first_nc.connect("myserver.mydomain.com/support/session1");
first_so = SharedObject.getRemote("CustomerInfo", first_nc.URI, false);
first_so.connect(first_nc.URI);
//"support"应用程序的另一个实例
second_nc = new NetConnection();
second_nc.connect("myserver.mydomain.com/support/session2");
second_so = SharedObject.getRemote("CustomerInfo", second_nc.URI, false);
second_so.connect(second_nc.URI);
实例名room_01被非常频繁的使用,但你可以使用任何对你的应用程序有意义的字符串作为实例名。
你可以配置几种与应用程序实例相关的设置。在Application.xml文件中,你可以指定在一个实例被服务
器卸载之前最大的空
闲时间是多少。在Vhost.xml文件中,你可以指定能够连接到虚拟主机宿主的一个应用程序的客户机数,以
及可以由虚拟主机装
载的实例数。
要获得有关使用实例名的更多信息,请看“Flash Media Server 2客户机端ActionScript语言参考”中的
NetStream.publish()条
目。
要获得有关构造可用于多个应用程序的远程共享对象的信息,请看“Flash Media Server 2客户机端
ActionScript语言参考”
中的SharedObject.getRemote()条目。

由Flash Media Server使用的文件类型
除了由Flash创建并使用的文件类型(FLA、SWF和SWD)外,Flash Media Server还使用和创建下列文
件类型:
ASC和JS文件你所编写的或是随Flash Media Server提供的服务器端脚本文件。当你创建服务器端脚本
时,使用Flash
ActionScript编辑器或一个JavaScript编辑器并把这些脚本放置到你的已注册应用程序目录中的你为你的应用
程序创建的子目录
中,例如,/applications/chat_app;或是位于一个scripts子目录中,比如,/application/chat_app/scripts。
Flash Media Server在/scriptlib目录中提供了一个脚本库,
这个脚本库中包含了用于组件和Flash Remoting
服务的服务器端脚
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 10 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

本。
当你在Flash Media Server中使用组件或Flash Remoting时,
来自/scriptlib的适当脚本会被包含或被装载到
你的应用程序的服
务器端脚本文件中。/scriptlib目录的位置是在你的Application.xml配置文件的<ScriptLibPath>标记中被指定
的。要获得有关装载
components.asc文件以使用媒体组件的信息,请参看“创建一个开发环境”。
ASE文件 被编译为二进制文件的服务器端脚本文件。请参看“归档和编译服务器端脚本文件”。
FAR文件 被归档为一个自包含文件的服务器端脚本文件。请参看“归档和编译服务器端脚本文件”。
FLV和IDX文件 记录流及其关联的索引文件。当服务器生成流时,它也会在这个已注册应用程序目录
中生成一个流目录,
并把FLV和IDX文件存储到为这个应用程序实例指定的一个子目录中(例如,
/applications/chat_app/streams/instance2)。
SOL、SOR和FSO文件 共享对象文件。SOL文件会一直维持在客户机上;FSO文件仅维持在服务器上;
SOR文件维持在客
户机上,同时有一个匹配的FSO文件维持在服务器上。共享对象文件的位置依赖于共享对象的种类的不同
而不同。
要获得有关Flash Media Server在何处存储流和共享对象文件的信息,请参看“编码约定”。
要获得有关共享对象的更多信息,请参看“关于共享对象文件”。

连接到服务器
要连接到Flash Media Server的一个实例,你首先需要启动这个服务,然后你还需要在你的客户机端脚
本中发出new
NetConnection和NetConnection.connect()命令。这个部分中就将讨论这些任务。
注意:应用程序可以利用RTMP(Real Time Message Protocol--实时消息协议)或RTMPS(Real Time
Message Protocol over
SSL--安全套接层上的实时消息协议)连接到Flash Media Server。
技巧:尽管你可以使用组件来连接到服务器,但首先要学习如果通过编写ActionScript来进行连接,就
像本部分中所描述的
那样。

启动服务

如果服务器还没有启动,你可以手工启动它。在Windows的“开始”菜单中,选择“程序-> Macromedia ->
Flash Media

Server 2 -> Start Flash Media Server 2和Start Flash Media Admin Server 2”。在Windows中,要确认这个服务是
否正在运行,打开
“任务管理器”,确保FMSAdmin.exe和FMSMaster.exe都存在于进程选项卡的列表中。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 11 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

打开一个至服务器的连接

在Flash创作环境中打开一个新文件,并添加客户机端ActionScript命令以连接到这个服务器。
要连接到Flash Media Server:
1. 在一个新的Flash电影中,通过发出下面的命令打开一个连接:
my_nc = new NetConnection();
2. 在上述命令后跟随一个connect命令:
my_nc.connect(targetURI);
在这个NetConnection.connect(省略可选的参数)的基本语法中,targetURI是Flash Media Server上
的一个应用程序的
Uniform Resource Identifier(URI-统一资源标识符),当这个连接被发出时,这个Flash Media Server应
该是处于运行状态
的。要指定targetURI,使用下列格式中的一个(方括号中的项目是可选的):
rtmp://localhost[:port]/appName[/instanceName]
localhost的使用指出这个服务器正运行于你的本地计算机中。
rtmp://host[:port]/appName[/instanceName]
注意:在targetURI的所有语法例子中,你必须使用rtmp(Real-Time Messaging Protocol-实时消息
协议)作为这个连接
的协议。如果你省略它的话,则Flash Player会假定你想要构造一个通向某个应用程序服务器的HTTP连
接,显然,你的连接
将失败。
如果你想要连接到某个不是默认虚拟主机的虚拟主机,则你需要在host中指定这个虚拟主机的名
字。如果这个服务器
正运行在你的本地计算机中,则你可以在URI中使用“localhost”作为主机名;这在应用程序开发期间通
常是最方便的方
法。
例如,下面的代码使用new NetConnection构造器创建了一个新的连接对象。然后,通过调用
my_nc.connect(),这个对象被
连接到这个服务器。
//创建一个新的连接对象
my_nc = new NetConnection();
//连接到位于Flash Media Server上的名为appName的应用程序的名为appInstance的实例
//这个Flash Media Server正运行于虚拟主机myServer.myDomain.com
my_nc.connect("rtmp://myServer.myDomain.com/appName/appInstance");

第二章Flash Media Server架构

Macromedia Flash Media Server 2平台由两部分构成:服务器和Macromedia Flash Player。建立在这个平
台的应用程序由一个
客户机Macromedia Flash应用程序(SWF文件),其在Flash Player中运行,以及一个与这个客户机进行通讯

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 12 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

的服务器组件构成。
这个服务器组件至少包括一个你在运行着Flash Media Server的服务器上创建的应用程序文件夹。可选的,
这个文件夹可以包含
服务器端通讯ActionScript文件(ASC),以及由这个通讯应用程序使用的其他资源文件。

理解Flash Media Server架构
服务器和Flash客户机应用程序利用实时消息协议(RTMP)在一个持续的连接上进行通讯。在一个典
型的情况中,Web服
务器会经由HTTP把Flash客户机程序递送给Flash Player。然后,Flash客户机程序会利用RTMP建立一个与
Flash Media Server的持
续连接,允许一个不间断的数据流在客户机和服务器之间流动。
多个用户(Flash客户机)可以连接到运行在Flash Media Server上的同一个应用程序,在这种情况下,
Flash Media Server充
当一个连接的用户之间的通讯信道。

注意:你也可以创建安全RTMPS连接。要获得更多信息,参看客户机端和服务器端ActionScript语言参
考的
NetConnection.connect()。

关于流和共享对象
在传统的客户机/服务器应用程序中,服务器通常被用于执行某些事务;客户机端发出一个请求,服务
器就会执行某个数据
库查询或某些基于资源的计算,然后把一个结果返回到客户机。客户机和服务器之间的连接仅被维持用来
完成这个事务所需的
那么长的时间。
尽管你可以使用Flash Media Server来执行事务,但它的核心应用是处理交互-协调多个连接的用户或客
户机的动作,及传送
服务器端的数据。Flash Media Server提供了两个通讯模块-流和共享对象-用来简化用户交互的处理过程。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 13 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

理解流

流是一个时间基
(time-based)
的同步的音频、
视频和/或数据消息流,
这个流或是从客户机流向服务器,
或是从服务器流
向客户机。
流使用一个发布和订阅模块简化了使用流的应用程序的开发。
一个发布流可以被实时的播放
(比
如一个视频聊天应
用程序),或是被记录并在以后进行回放。
记录流可以被保存为Flash视频文件(FLV)。记录流可以包含数据消息,正如它可以包含视频那样。
你也可以利用第三方
的视频编码工具,
比如On2或Sorenson Squeeze,
从现有的数字视频或音频文件中创建FLV文件,
或是从Flash
中输出它们。通过
这种方式,你可以利用Flash Media Server流预先记录好的内容。
实时流

一个记录为FlashVideo(FLV)文件的流的回放

理解共享对象

当创建媒体应用程序时,你可以使用两种基本类型的共享对象:local(本地)和remote(远程)。
你可以把本地共享对象看作是“Flash版的cookie”:
它们可以让你把数据保存在一个用户的计算机中用于
离线访问,或是
用来保存用户偏爱。本地共享对象是Flash Player功能的一部分,不需要Flash Media Server的介入。
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 14 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

Flash Media Server管理远程共享对象(它持有文件)并提供消息、数据同步,以及数据存储服务。Flash
客户机连接或订阅
到一个远程共享对象,任何时候当共享对象发生改变时,客户机就会接收到更新。同样,
消息也会被发送给连接到一个远程共享对象的所有客户机。一个远程共享对象可以在应用程序会话间
维持,或只是临时存
在。
共享对象为客户机提供数据存储和同步服务
要获得有关共享对象是如何工作的更多信息,参看“理解共享对象流”、“共享对象类”,以及“关于共享
对象文件”。

关于连接到外部数据源

除了通过流和共享对象提供的通讯模块外,Flash Media Server也能够与外部数据源进行交互,这些外
部数据源可以是Web
服务、关系型数据库,或是其他的Flash Media Server应用程序。例如,你可以编写服务器端ActionScript来
连接到一个Web服务
(使用WebService类)或ColdFusion应用程序以检索一个名字和电话号码的列表,之后,查询结果可以被放
置到一个共享对象
中。要获得有关Web服务的更多信息,参看“关于Flash Media Server类”。
Flash Media Server与外部数据源的交互
Macromedia Flash Remoting是一个把你的媒体应用程序连接到J2EE应用程序服务器及Microsoft
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 15 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

Windows .NET服务器的网

关。你可以从一个客户机端或服务器端脚本连接到Flash Remoting。Flash Remoting依靠它自己的被称为
NetService的ActionScript
库把Macromedia Flash应用程序链接到一个服务器端网关。
NetService API在Using Flash Remoting中进行了描
述,其作为一个PDF
文件在Macromedia的网站上可用。要获得有关Flash Media Server与Flash Remoting协同工作的更多信息,参
看Macromedia Flash
Media Server开发者中心。

创建和部署应用程序的工作流程
你使用Flash创作工具来创建你的应用程序的客户机组件,这些组件是运行在Flash Player中的。Flash
SWF提供了应用程序
的用户接口,同时也包含了用于连接到Flash Media Server及与Flash Media Server进行交互的ActionScript。
服务器组件至少由一个你在正运行着Flash Media Server的计算机上创建的应用程序文件夹构成。可选
的,这个文件夹可以
包含服务器端ActionScript(ASC)文件,这些ASC文件可以进行共享状态的控制,为在多用户之间仲裁实
时交互提供逻辑,或
是与外部源进行通讯,假如需要的话。
注意:可选的,你可以在应用程序文件夹中包含一个secure.asc或secure.js文件。这个文件会在任何其它
服务器端脚本文件
之前被自动装载,并可以让你实现安全系统调用。要获得更多信息,参看“强制Player Setting面板出现”。
你可以在Flash Professional、文本编辑器或JavaScript编辑器中编写ASC文件。
要部署一个应用程序,客户机和服务器端文件需要被发布到各自适当的位置。对于部署在Web上的应
用程序,客户机文件Flash应用程序(SWF文件)和任何必须的HTML包装代码-需要被发布到位于Web服务器上的一个目录。
注意:你可以通过在本地运行它们来测试SWF文件;要与Flash Media Server进行通讯,它们不必非来
自一个Web服务器。
服务器端文件,包含所有的ASC文件、记录的流(FLV)文件,以及其他服务器端资源文件,被发布
到你已经在服务器上
定义的已注册应用程序目录中。
如果你是一个管理员,你将可以使用管理控制台来配置Flash Media Server、建立系统安全、监视服务
器的启动、使用和停
止,以及添加用户。要获得有关Flash Media Server管理任务的更多信息,请看“管理Flash Media Server

理解应用程序流
这个部分中对Flash客户机是如何连接到服务器、共享对象是如何被访问的,以及远程方法可以怎样进
行调用进行了更详细
的解释。
当用户运行你的Flash SWF文件,并且这个SWF文件连接到了服务器时,服务器就会装载应用程序并创
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 16 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

建这个应用程序的
实例,假如它还没有运行的话。服务器接受这个连接,并创建一个新的服务器端Client对象来代表服务器上
的客户机应用,并会
执行你已经提供的任何服务器端脚本。服务器端Client对象与客户机端NetConnection对象相对应,
NetConnection对象用于连接到
服务器;这个Client对象只能经由服务器端脚本被访问。
客户机也会做它自己的工作,比如,初始化流、共享对象,等等。下面的部分更详细的描述了这一事
件的次序。

理解连接流

客户机连接到服务器,当应用程序被装载时,服务器会调用onAppStart(如果应用程序已经处于运行状
态,则onAppStart不
会被调用)。接下来,服务器端onConnect处理器会由一个新创建的Client对象调用。这个方法中的逻辑会决
定是要接受还是要
拒绝这个连接。回到客户机端,onStatus处理器被调用以报告这个连接是被接受了还是被拒绝了。当客户机
关闭连接时,服务器
端onDisconnect处理器会被调用。当这个应用程序被卸载时,onAppStop被调用。
要接受onConnect处理器中的连接,返回true或调用application.acceptConnection();要拒绝这个连接,返
回false或调用
application.rejectConnection()。如果true或false没有在onConnect处理器中被返回,则客户机会处于未决状态
直到acceptConnection
()或rejectConnection()被调用。
注意:只有客户机应用程序可以启动一个通讯会话。客户机和服务器二者都会发送和接收状态消息、
打开和关闭流、保存
和共享数据,以及终止网络连接。

调用远程方法

在成功连接之后,客户机可以调用由服务器组件定义的远程方法;服务器应用程序也可以远程调用在
Flash客户机应用程序
中定义的ActionScript方法。

从客户机端调用服务器方法

连接到一个服务器应用程序的每一个Flash应用程序都由一个Client对象作为代表,这个Client对象是服
务器端Client类的一个
实例。而每一个Client对象,都有与之关联的由开发者定义的方法,这些方法可以被远程访问。(你也可以
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 17 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

使用prototype属性创
建可以为所有客户机所使用的远程方法。要获得这样的一个范例,请看《服务器端ActionScript语言参考》
中的Client类条目。
然后,一个Flash应用程序可以利用NetConnection.call()方法调用远程定义的方法,并可选的指定一个回
调对象来处理由服务
器返回的结果。在服务器上,与客户机调用相对应的方法会被调用,并且,一个结果会被返回到客户机。

下面的图示展示了从一个客户机调用一个服务器上定义的方法的范例。在这个图示中,客户机经由名
为nc的NetConnection
对象调用远程方法doThis。在这个例子中,这个doThis方法与一个名为clientObj的Client对象相关联,这个
clientObj就是这个客户
机的代表。
从客户机到服务器的远程方法调用流,结果被传回到客户机
下表列出了Flash Media Server客户机状态消息:

NetStream.Failed和NetStream.Play.Failed信息对象还有一个description(描述)属性,该属性是一个字符
串,提供了失败的原
因。
NetStream.Play.Start和NetStream.Play.Failed信息对象还有一个details(详细信息)属性,该属性是一个
字符串,提供了被播
放的流的名字。这对于多个播放是有用的。当从播放列表中的一个元素切换到另一个元素时,这个details
属性能够显示流的名
字。
要获得有关远程调用服务器方法更多信息,请看《服务器端ActionScript语言参考》中的
Client.commandName条目。

从服务器调用客户端方法

从服务器调用客户机定义的方法的过程就像是上述过程的反过程。在客户机上,你可以把一个用户定
义的方法捆绑到用于
连接到服务器的NetConnection对象上。之后,这个方法可以由服务器利用Client.call()方法进行远程调用。
下面的图示展示了从服务器调用一个客户机方法的过程。
在这个图示中,
客户机端方法doThis与名为nc
的一个
NetConnection对象相关联。服务器利用Client.call()方法调用这个doThis方法。服务器端脚本可以可选的指定
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 18 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

一个结果处理器对
象。再一次,客户机可以返回一个结果,当回调对象发送到客户机时,服务器的onResult处理器会被调用。

从服务器到客户机的调用流,结果被传回到服务器
下面的表格列出了Flash Media Server状态消息:
NetStream.Failed和NetStream.Play.Failed信息对象还有一个description(描述)属性,该属性是一个字符
串,提供了失败的原
因。
NetStream.Play.Start和NetStream.Play.Failed信息对象还有一个details(详细信息)属性,该属性是一个
字符串,提供了被播
放的流的名字。这对于多个播放是有用的。当从播放列表中的一个元素切换到另一个元素时,这个details
属性能够显示流的名
字。

理解共享对象流

共享对象简化了开发者在多用户之间共享数据的任务。一个Flash客户机应用程序通过发布一个
SharedObject.getRemote()命
令订阅一个远程共享对象,SharedObject.getRemote()命令会返回一个对这个远程共享对象的引用。之后,客
户机发出一个
SharedObject.connect()命令把这个远程共享对象连接到服务器。调用SharedObject.connect()把SharedObject与
NetConnection对象
(该对象是一个连接,其作用是把数据发送到服务器以及从服务器接收数据)相关联,以便这个共享对象
可以把更新发送到服
务器以及从服务器接收更新。
在客户机连接到这个共享对象之后,服务器就会为这个共享对象发出一个同步消息,这个同步消息可
以被定义在客户机程
序中的SharedObject.onSync事件处理器处理。当客户机、服务器,或是其他的电影实例对这个共享对象作任
何改变时,这个服
务器就会再次为这个共享对象发出一个同步消息。
每一个同步消息都包含一个代码,这个代码指定了发生在共享对象上的改变的种类。依赖于情况的不
同,这个代码也会不
同。
例如,
当一个客户机首次连接到一个共享对象时,
伴随这个同步消息的代码会有一个clear值;
一个success

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 19 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

值指出这个客户
机已经成功的修改了这个共享对象的内容。要获得有关代码及其描述的完整列表,请看《Flash Media Server
2客户机端
ActionScript语言参考》的SharedObject.onSync条目。
下面的图示展示了一种两个客户机-Client1和Client2-连接到同一个远程共享对象obj1的情形。
当每一个
客户机首次连接到这
个共享对象时,服务器会返回一个clear同步消息。之后,Client1修改了obj1的一个名为x的数据属性,把这
个属性的值设置成了
“”。
Client1接收到了一个success同步消息,
指出对这个共享对象的改变是成功的;
Client2接受到了一个change
同步消息,指
出obj1共享对象已经被修改。

第三章使用通讯类

Macromedia Flash Media Server提供了两个应用程序编程接口(API):一个客户机端的API和一个服务
器端的API。本章解
释了客户机端类、服务器端类,以及从这些类创建的对象在通讯期间是如何搭档的。共享对象也会被讨论,
因为它们存储了在
用户间、应用程序实例间,以及应用程序间共享的应用程序和用户的信息。
在Flash Media Server类的核心概述之后,本章也阐述了关于实现一些类的重要信息,比如在优化
Application、Camera、
Microphone、NetStream、Stream、System,以及Video对象,连同保护Client对象和使你的NetConnection对
象更安全方面的建
议。

关于Flash Media Server类
客户机端API提供了下列类:
Camera、
Microphone、
NetConnection、
NetStream、
SharedObject,
以及Video。
要获得有关使用
这些类的更多信息,请看《Flash Media Server 2客户机端ActionScript语言参考》。服务器端API提供了下列
类:Application、
Client、
File、
LoadVars、
NetConnection、
SharedObject、
Stream、
WebService、
XML、
XMLSocket、
XMLStreams。
要获得有关使
用这些类的更多信息,请看《服务器端ActionScript语言参考》。
有些类在两个API中拥有相同的名字,比如NetConnection。但不管怎么说,名字相同的一个客户机端类
和一个服务器端类
并不提供相同的功能。此外,一些客户机端类有服务器端副本,但另一些则没有。下面的部分简要的描述
了每一种客户机端类

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 20 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

和服务器端类,然后解释了要进行客户机/服务器通讯,这些类中的一些是如何协同工作的。

关于客户机端类

这些类仅被用于客户机端ActionScript中。
Camera类 客户机端Camera类可以让你捕获来自捆绑在任何运行Macromedia Flash Player的计算机上
的摄像头中的视频。当
与Flash Media Server一起使用时,这个类可以让你传送、显示,以及可选的记录被捕获的视频。利用这些
能力,你可以开发出
诸如视频会议、视频实时消息这样的通讯应用程序。
Microphone类 客户机端Microphone类可以让你捕获来自捆绑在任何运行Flash Player的计算机上的麦
克风的音频。当与Flash
Media Server一起使用时,这个类可以让你传送、播放,以及可选的记录被捕获的音频。利用这些能力,你
可以开发出诸如音频
实时消息、录制演示文稿以便其他人可以在日后回放它们等等这样的应用。
你也可以单使用一个Microphone对象而不结合服务器-例如,在你的本地系统中经由扬声器传送来自你
的麦克风的声音。
NetConnection类 客户机端NetConnection类允许Flash客户机在Flash Media Server上打开一个TCP套接
字,以便利用实时消
息协议(RTMP)进行连续的数据交换。你也可以使用NetConnection类连接到一个应用程序服务器,但本章
所关注的焦点是利
用NetConnection类与Flash Media Server进行通讯。
NetStream类 通过由一个客户机端NetConection对象建立的连接,客户机端NetStream类打开了一个在
Flash Player和Flash
Media Server之间的一路(one-way)流连接。一个NetStream对象就像是位于NetConnection中的一个信道;
这个信道可以利用
NetStream.publish()方法发布音频、视频和数据,也可以利用NetStream.play()方法订阅一个流并接收数据。
你可以发布或播放实
况(实时)数据及回放先前记录的数据。多个客户机可以播放同一个给定的流,但同一时刻一个流只能有
一个发布者。要获得
有关在服务器上的流的创建和存储,请看“编码约定”。
SharedObject类 客户机端local共享对象可以让你在一个用户的计算机上存储信息,比如一个游戏中的
最高比分,这些信息
可以在日后由运行在这台计算机上的同一个应用程序或一个不同的应用程序所使用。要获得有关local共享
对象的更多信息,请
看“理解共享对象”。
Video类 客户机端Video类可以让你在舞台上显示流视频。要显示一个通过使用NetStream.play()或
Camera.get()命令被播放或
捕获的视频馈送,你需要在舞台上放置一个Video对象,并使用Video.attachVideo()方法将馈送捆绑到这个对
象。
要在Flash中于舞台上放置一个Video对象:
1. 在Flash中,如果库面板没有显示的话,选择“窗口-> 库”打开库面板。
2. 通过在库面板的选项菜单中选择“新建视频”把一个嵌入的视频对象添加到库中。
3. 从库中把这个新建的嵌入的视频对象的一个实例拖放到舞台中,并使用特性面板赋予这个实例一

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 21 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

个唯一的名字。

关于服务器端类

这些类仅被用于服务器端ActionScript中。
Application类 服务器端Application类可以让你创建包含有关一个Flash Media Server应用程序实例信息
的对象;这个对象会
一直维持直至该应用程序实例被卸载。
Application类允许你接受或拒绝客户机连接尝试、
注册或注销类和代
理,以及创建当一个
应用程序启动或停止,或是当一个客户端连接或断开连接时要调用的函数。
Client类 服务器端Client类可以让你创建描述了每一个用户的至一个Flash Media Server应用程序实例
的连接的对象。这个
Client对象可以接收由一个客户机端NetConnection.call()命令发出的消息,并可以调用客户机端
NetConnection对象的方法。你可
以使用Client对象的属性来确定每一个客户机的版本、平台和IP地址。利用Client类,你也可以单独设置不同
的应用程序资源-比
如Stream对象和SharedObject对象-的读写权限。要获得更多信息,请看“实现动态访问控制”。
File类 服务器端File类可以让应用程序写入服务器的文件系统。
LoadVars类 服务器端LoadVars类可以让你从远程或本地位置把变量装入一个服务器端脚本。
NetConnection类 服务器端NetConnection类可以让你在一个Flash Media Server应用程序实例和一个应
用程序服务器、另一
个Flash Media Server,或同一台服务器上的另一个Flash Media Server应用程序实例之间创建一个双路连接。
你也可以使用服务
器端NetConnection对象创建更强大的应用程序;例如,你可以从一个应用程序服务器获得天气信息,或是
共享由其他Flash
Media Server或应用程序实例装载的某个应用程序。
利用NetConnection对象,你可以连接到一个应用程序服务器,使用标准协议(比如HTTP)进行服务器
对服务器的交互,或
是连接到另一个Flash Media Server,使用Macromedia实时消息协议(RTMP)共享音频、视频和数据。
你可以将Macromedia Flash Remoting与Flash Media Server相结合来与诸如Macromedia
ColdFusion、.NET,以及J2EE服务器这
样的应用程序服务器进行通讯。要获得更多信息,请访问Macromedia网站上的Flash Remoting信息。
SharedObject类服务器端共享对象可以让你与客户机端共享对象及与其他Flash Media Server上的对象
进行通讯。
Stream类 服务器端Stream类可以让你处理一个Flash Media Server应用程序中的每一个流。当
NetStream.play()或
NetStream.publish()方法在一个客户机端脚本中被调用时,Flash Media Server会自动创建一个Stream对象。
你也可以通过调用
Stream.get()方法在服务器端ActionScript中创建一个流。一个用户可以在同一时间访问多个流,并且,在同
一时间可以有多个
Stream对象处于活动状态。
WebService类 服务器端WebService类可以让你创建和访问一个WSDL/SOAP Web服务。下列服务器端
类是配合WebService
类使用的:Log类、SOAPFault类,以及SOAPCall类。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 22 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

XML类 服务器端XML类可以让你装载、解析、发送、建立,以及操作XML文档树。
XMLSocket类 服务器端XMLSocket类实现客户机套接字,它可以让Flash Player与一个由IP地址或域名
指定的服务器进行通
讯。
XMLStreams类 服务器端XMLStreams类是XMLSocket类的一个变种-它具有相同的方法、属性,以及
事件,但它是以片段
来传输和接收数据。

关于客户机-服务器的通讯

下面的“对象对”描述了你可以在客户机端和服务器端对象间建立的潜在的连接。例如,当一个客户机
端NetConnection对
象连接到服务器时,一个服务器端Client对象就会被创建;之后,这个Client对象可以调用其NetConnection
对象配对物的方法。
下面的表格展示了彼此关联的客户机端和服务器端对象。

理解共享对象
共享对象是一种在不同的客户机之间,以及运行在Flash Media Server上的一个应用程序的不同实例间,
甚至是运行在多个
Flash Media Server上的跨应用程序的共享数据的手段。
Flash Media Server支持三种类型的共享对象-local
(本
地)、remote(远
程),以及server-side(服务器端)。这些对象会在下面进行简要的讨论。要获得有关使用共享对象的更多
信息,请看“关于共
享对象文件”。

关于Local共享对象

使用共享对象的一种方法是本地的数据存储和获取。数据被存储在终端用户的计算机里,并可以在一
个不同的时间里由一
个或更多的Flash应用程序所访问。Local共享对象也可以是非永久性的-换句话说,只有当这个应用程序正
在运行时才是可用
的。
Local共享对象不需要连接到Flash Media Server,本手册中也不打算进行过多的讨论。要获得有关永久
性local共享对象数据
被存储在何处的内容,请看“关于共享对象文件”。要获得有关local共享对象的更多信息,请看《Flash Media
Server 2客户机端
ActionScript语言参考》的SharedObject.getLocal()条目。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 23 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

关于Remote共享对象

使用客户机端ActionScript,你可以创建和引用对运行在同一或不同客户机上的其他Flash Media Server
应用程序实例可用的
共享对象。
同local共享对象一样,
这些remote共享对象也可以永久性的存在于本地计算机上。
但不管怎么说,
remote共享对象也
可以维持在服务器上,以便任何连接到这个共享对象的用户都可以访问到同样的信息。
例如,你可以打开一个remote共享对象,比如一个电话列表,它维持在服务器上。任何当一个客户机对
共享对象作了任何
改变,则这个修改过的数据对于当前或以后连接到这个对象的所有客户机而言都是可用的。如果这个对象
也被维持在本地,且
一个客户机在未连接到服务器的情况下改变了这个数据,则下次当这个客户机连接到服务器时,这些改变
将会与remote共享对
象同步。
在所有这些种类的共享对象中,你最经常在你的Flash Media Server应用程序中使用的可能就是remote
共享对象了。要获得
有关永久性remote共享对象数据被存储在哪里的信息,请看“关于共享对象文件”。要获得有关remote共享对
象的更多信息,
请看《Flash Media Server 2客户机端ActionScript语言参考》的SharedObject.getRemote()条目。

关于代理共享对象

一个代理共享对象是一个remote共享对象,
但代替在一个客户机和服务器应用程序之间被共享,
代理共
享对象是在两个不
同的Flash Media Server应用程序,或是在同一个应用程序的不同实例间被共享的。例如,考虑同一个聊天
应用程序的两个实
例,/chat_01和/chat_02。在服务器上,/chat_01应用程序实例可以连接到在/chat_02中定义的一个共享对象,
并使用那个共享对
象中的信息,就好像那个共享对象是被定义在/chat_01中一样。
要获得有关代理共享对象的更多信息,请看《服务器端ActionScript语言参考》中的SharedObject.get()
条目。

关于Application类
Application类可以让你接受和拒绝客户机连接尝试、
注册和注销类和代理,
以及创建当一个应用程序启
动或停止时,或当一
个客户机连接或中断连接时要被调用的函数。这个部分包含了有关建立application.OnConnect和
application.OnDisconnect函数的忠
告,
以及在使用媒体组件的应用程序中使用Application.onConnectAccept和Application.onConnectReject函数。
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 24 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

要获得有关Application类的更多信息,参看《服务器端ActionScript语言参考》的Application类条目。

使用application.onConnect处理器

当一个客户机调用NetConnection.connect()方法时,application.onConnect事件处理器会在服务器上被调
用。这个处理器会被
自动地传递以一个对一个服务器端Client对象的引用,这个服务器端Client对象描述了这个正试图连接的客
户机,以及任何由开
发者定义的传递给NetConnection.onConnect处理器的参数。
当你希望基于用户的登录信息建立不同的方法时,在一个被指派给application.onConnect处理器的函数
中建立方法是一个好
主意。但不管怎么说,如果你想要建立一个对所有客户机都可用的方法,你就应该使用Client对象的
ActionScript 1.0中的
prototype属性,就像下面的例子这样:
//一个用户连接了
application.onConnect = function( newClient, userName )
{
if (userName == "admin")
{

if (userName == "admin")
{
newClient.adminFunc= function(param)
{
//某些代码仅对admin才是有用的
newClient.myAdminProperty = param;
}
} else
{
//针对绝大多数情况的代码
}
//允许登录
application.acceptConnection( newClient );
}
//这个部分可以存在于一个单独的文件中

//由于“prototype”的工作方式,每一个客户端(包括admin)都将拥有这个功能。
Client.prototype.commonFunction = function (myColor)
{
//一些代码

//代替newClient,使用this来引用客户端。
this.color = myColor;
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 25 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

}
同样,如果你希望在正进行连接的Client对象上使用call()方法,则应确信你调用
application.acceptConnection(),并知道在发
出任何额外的命令前这个客户机已经连接了。下面的代码建立了这一系列动作:
application.onConnect = function(clientObj,name,passwd)
{
//首次接受连接
application.acceptConnection(clientObj);
//在客户机被注册于这个应用程序实例之后,你可以使用"call"方法。
clientObj.call("onWelcome", "You are now connected!!!");
return;

//一旦你在onConnect中调用acceptConnection()或rejectConnection(),
//则返回值就被忽略了。
}
技巧:如果你正在使用组件,请看“在一个基于组件的应用程序中处理事件”。

利用application.onDisconnect处理器

当一个客户机中断与应用程序的连接时,服务器会调用application.onDisconnect处理器。你可以为这个
处理器添加代码,这
些代码会向所有其他客户机通告关于这个事件的消息,就像下面的例子所展示的这样:
//在服务器端,你可以包含下面这些内容:
application.onConnect = function(newClient, name)
{
newClient.name = name;
return true;
}
application.onDisconnect = function(client)
{
for (var i = 0; i < application.clients.length; i++)
{
application.clients[i].call("userDisconnects", client,name);
}
}
//在客户端,你可以包含下面这些内容:

nc = new NetConnection();
nc.userDisconnects= function (name) {
trace(name + "quits");
}
nc.connect ("rtmp:/app_name", userName);
技巧:如果你使用组件,请参看“在基于组件的应用程序中处理事件”。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 26 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

在基于组件的应用程序中处理事件

当你开发应用程序时,清楚明白的理解有关onConnectAccept和onConnectReject事件的组件介绍是很有
好处的。你需要包含
代码来处理这些事件。当你使用组件时,你必须在你的服务器端代码中修改application.onConnect语句以包
含
application.onConnectAccept和application.onConnectReject事件处理器。
你的onConnect处理器的
(执行顺序中
的)最后一行应该
是application.acceptConnection()或application.rejectConnection()之一。
如果你的应用程序需要额外的代码跟在
显式
acceptConnection()或rejectConnection()方法之后的话,比如一条指出用户已经被授予或拒绝了对应用程序的
权限的消息,你可以
在application.onConnectAccept或application.onConnectReject语句中放置相应的代码。
技巧:如果你不是正在使用媒体组件的话,则你不能使用application.onConnectAccept和
application.onConnectReject。
每一个组件可以有它自己的application.onConnect方法。通过使用onConnectAccept和onConnectReject,
你可以定制一个组件
或是创建一个新的组件以实现身份验证;例如,一个组件中的代码可以查询一个数据库,并根据数据库中
的用户名和密码来决
定是该接受还是该拒绝某个用户。
要获得有关application.onConnectAccept和application.onConnectReject的更多信息,请看《服务器端
ActionScript语言参考》。

Camera类
这个部分中包含的建议将有助于你优化对Camera类的使用,
本部分中也包含了在记录之后关闭摄像头、
将摄像头设置成适
用于带宽,及在多个应用程序中使用同一个摄像头的技巧。

关闭摄像头

如果你的应用程序使用一个捆绑在一个NetStream对象上Camera对象来记录数据的话,则在你完成记录
后这个摄像头会继续
维持原先的状态。要在记录之后关闭摄像头,使用NetStream.attachVideo(false)方法。

针对不同的带宽速度的设置建议
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 27 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

默认的摄像头设置为所有的带宽设置提供了一个不错的视觉体验。但不管怎么说,你可以试验一下对
不同的带宽使用不同
的设置是种什么感觉。
用于设置带宽速度的代码如下所示:
my_cam = Camera.get();
my_cam.setQuality(bandwidthSpeed,quality)
如果你想要在不同的带宽速度下测试摄像头设置的话,可以从下表格开始你的试验。
带宽
效果
代码
Modem
更低的图像质量,更高的运动质量
my_cam.setQuality(4000,0)
更高的图像质量,更低的运动质量
my_cam.setQuality(0,65)
DSL
更低的图像质量,更高的运动质量
my_cam.setQuality(12000,0)
更高的图像质量,更低的运动质量
my_cam.setQuality(0,90)
LAN
更低的图像质量,更高的运动质量
my_cam.setQuality(400000,0)
更高的图像质量,更低的运动质量
my_cam.setQuality(0,100)

在多个应用程序中使用同一个摄像头

在同一时刻,多个应用程序(SWF文件)可以使用同一个摄像头,如果这些应用程序正运行于同一个
进程中的话。通常情
况下,多个浏览器窗口都为位于同一个进程中的,因此,在浏览器环境中这一功能可以工作的很好。
但不管怎么说,一个摄像头不能在运行于两个不同的进程中的应用程序间共享。这样的情况可以是一
个应用程序运行于浏
览器中,另一个应用程序运行于独立的播放器中。

Client类
当在服务器端脚本中将方法捆绑到Client对象时,请记住,在这个client对象中的所有方法都可以由客户
机的SWF文件中的一
个脚本进行调用。你不应该在这个Client对象中包含任何你不希望被某台远程计算机调用的方法。例如,你
不会希望一个客户机
能够调用一个方法来中断一个应用程序的连接。

Microphone类
这个部分包含的建议将有助于你优化对Microphone类的使用,同时也包含了消除音频反馈(啸叫)的
技巧。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 28 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

消除音频反馈

如果你正配合一个外部扬声器来使用一个麦克风,并恰好配置了一个高增益的话,则你将很有可能会
招致音频反馈问题。
为了减小来自扬声器的反馈,Flash Media Server使用了回声抑制,你可以通过使用下列命令来实现回声抑
制:
my_mic.useEchoSuppression(true);
这将维持一个适当的输入级,而不会过量的传输来自你的扬声器的回声。
由于回声抑制只是从用户的输入中剔除了一部分输出信号,因此,如果你的麦克风距离你的扬声器太
近的话,你将仍然可
能会听到啸叫。为了避免反馈,尝试下面这些指导:
调低你的扬声器的音量。
把麦克风移的离扬声器更远些。
检查你的硬件设置对其进行适当的安装和设置。
使用耳机。

保持麦克风打开

为了节省带宽,在其没有被使用的情况下,Flash Media Server默认会关闭麦克风。但不管怎么说,你
可能希望它在你的应
用程序中保持打开的状态-例如,为了确保在麦克风处于激活状态时没有任何延迟。要做到这点,使用命令
my_mic.setSilenceLevel(0)。

NetConnnection类(客户机端)
如果一个包含了一个Flash应用程序(SWF文件)的HTML页面以一个与这个SWF文件用来访问Flash
Media Server的域名不
同的域名被访问的话,则这个至Flash Media Server的连接将不会成功。这是Flash Player的一种安全机制。
但在某些情况下,这
可能会导致一些不必要的麻烦。
例如,如果一个网页包含了一个Flash应用程序,这个Flash应用程序位于一个来自
http://deptserver.mycorp.com的企业内部
网,则这个网页也可以通过简单的http://deptserver被访问。然而,如果这个页面经由
http://deptServer/tcpage.htm被访问,但这个
SWF文件在NetConnection.connect()方法中指定deptServer.mycorp.com作为targetURI参数的话,则这个SWF
文件将无法成功的连
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 29 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

接到Flash Media Server。
类似的,
如果这个网页和SWF文件从http://deptserver.mycorp.com/tcpage.htm被访问,
但这个SWF文件
使用URL rtmp://deptserver作为targetURI参数的话,则这个SWF将无法连接到服务器。
要避免由这一安全政策所带来的不方便,你或你的用户是有几件事情可做的。最容易的方法就是不要
在targetURI中包含一
个服务器名称。
(这只适用于Flash Media Server和Web服务器都运行于同一台计算机上的情况。)要做到这
点,摒弃targetURI
中的第二个斜杠。例如,下面的命令将使Flash Player试图连接到与提供SWF文件的Web服务器相同的主机
和域名。
nc = new NetConnection();
nc.connect("rtmp:/myApp");
避免安全问题的另一个方法是在你的HTML页面中使用一小段JavaScript代码。假定这个SWF文件使用
一个完全限定域名
URL来访问Flash Media Server,则这个JavaScript会把这个网页重定向到一个显式命名的完整的URL,就像
下面这样:
<SCRIPT language="javascript">
//如果这个URL没有域的话
if (document.URL.indexOf("mycorp.com") == -1) {
//重定向到有域的版本
document.URL="http://deptServer.mycorp.com/tcpage.htm";
}
</script>
最后,如果你拥有一个域名,拥有对这个域名的DNS记录的访问权,并且有一个用于你的Flash Media
Server的静态IP地址
的话,则你可以创建一个地址(“A”)记录把一个主机名指向那个IP地址。例如,flashcom.mycorp.com可以
映射到运行Flash
Media Server的计算机,
并且拥有一个由你的IT部门或ISP提供的IP地址。
你的网页可以继续被宿主在你当前
正使用着的无论什
么东西上。(如果你需要转向到一个有一个可访问的DNS主机名但可能有也可能没有一个静态IP地址的服
务器的话,则推荐你
使用“CNAME”记录。)

NetStream类
这个部分包含的建议有助于你优化对NetStream类的使用,同时也包含了有关把数据合并到一个流中、
管理一个流的缓冲
器,以及当一个流完成回放时执行代码的技巧。

在一个流中使用多种数据类型
在一个流中使用多种数据类型

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 30 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

除了流音频和视频外,你还可以在一个流中包含数据,比如一个文本消息。要把多种数据类型添加到
一个流中,使用下面
的方法:
NetStream.send()

用ActionScript得到流的时长

如果你正在缓存你的流,你可以使用NetStream.bufferLength属性来得到缓冲器中当前的秒数。但不管
怎么说,一些时候,
你可能希望得到一个流的总的时长。在这种情况下,Flash Player无法知道流的长度,但Flash Media Server
知道;服务器拥有一
个Stream.length属性,客户机可以经由一个发送给服务器的消息来请求这个属性。
你可以像下面这样使用客户机端ActionScript来请求流的长度:
function getInfo()
{
nc.call("sendInfo", new MyResultSetName(), myStream);
}
function MyResultSetName()
{
this.onResult = function(retVal)
{
_root.streamlength = retVal;
};
this.onStatus = function(info)
{
trace("Level: " + info.level + " Code: " + info.code);
//处理错误对象
};
}
然后,在相应的服务器端ActionScript中,你应该在main.asc文件中编写下面的代码:
application.onAppStart = function()
{
trace("::: 应用程序已经启动:::");

application.onConnect = function(client)
{
application.acceptConnection(client);
//添加方法
client.prototype.sendInfo = function(name) {
var slen = Stream.length(name);
trace("slen: " + slen);
return slen;
};
}

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 31 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

关于缓冲一个流

对于回放流而言,
由NetStream.bufferTime属性返回的值指定了在Flash Player可以开始回放它之前,
Flash
Media Server将缓
冲多少流。例如,如果你的记录流是秒长,并且你的回放速度是你的下载速度的两倍的话,则你可能会考
虑将这个值设置为
秒。这样,你将能够流畅的播放整个流而不会遭遇停顿。
对于发布流而言,这个值指定了在Flash Player考虑停止消息前这个流出队列可以成长到多长。要确定
有多少数据正在当前
队列中,使用NetStream.bufferLength。对于一个快速连接来说,由NetStream.bufferLength返回的值将永远也
不会逼近
NetStream.bufferTime的值,但在一个慢速连接中,这是可能的。
因此,如果你知道你的应用程序正运行在一个慢速连接上,并且你希望将停止消息或停止回放减到最
少的话,你可能会希
望使用NetStream.setBufferTime()方法来增加NetStream.bufferTime的值。

关于一个流的播放状态

当一个NetStream对象完成一个流的播放时,NetStream.onPlayStatus事件处理器会被调用。当一个
NetStream对象从一个播放
列表中的一个流切换到另一个流(NetStream.Play.Switch),或是当一个NetStream对象播放到末尾时
(NetStream.Play.Complete),传递给回调函数的信息对象会提供额外的信息。如果你希望响应这个事件处
理器,则你必须创建
一个函数来处理由服务器发送的信息对象。

SharedObject类
共享对象可以被用于多种目的,并且可以以多种方式被设计和使用。这个部分提供了一些项目,这些
项目可以被视为你在
你的应用程序中利用共享对象的开始。

关于同步共享对象

在试图使用一个remote共享对象之前,你应该首先检查SharedObject.connect()方法是否返回了true,这
个true指出了一个成
功的连接,
然后你应该等待直到你接收到了来自你已经分配给SharedObject.onSync处理器的函数的结果。
如

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 32 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

果你失败于上面所
描述的,则你在本地-在SharedObject.onSync被调用之前-对对象所作的一切改变都将被丢弃。
当remote共享对象的任何SharedObject.data属性被改变时,SharedObject.onSync处理器会被调用。当一
个客户机首次使用
SharedObject.getRemote()命令连接到一个remote共享对象-这个remote共享对象维持在本地或服务器上-时,
这个处理器也会被调
用。在后一种情况中,这个对象的所有属性都会被设置为空字符串,并且SharedObject.onSync会以code属性
的值被设置为
“clear”被调用。之后,SharedObject.onSync再次被调用,这次code的值被设置为“change”,并且remote共享
对象的客户机实
例的属性将被设置为与服务器上的那些相同。
如果你在理解你的共享对象的行为举止上有问题,那么,把一些调试代码放置在你的
SharedObject.onSync处理器中将对你
有所帮助,就像下面的例子中所展示的这样:
my_so.onSync = function(list) {
for (var k in list) {
trace("name = " + list[k].name + ", event = " + list[k].code);
}
//你可以在这里做你想要做的任何其他事情
}

利用共享对象进行有效的跟踪

是该把共享对象数据封装到一个单独的插槽(SharedObject.data属性)中,还是把它延伸到多个插槽中
在一定程度上依赖于
你的应用程序是如何对对象进行改变的。例如,如果你的应用程序需要按指定的时间间隔把一个完整的字
符串数组发送给所有
连接的客户机,则你可以把整个数组存储在一个单独的插槽中。
另一方面,如果你的应用程序仅需要发送那些被改变的信息的话,则你应该把数据划分到多个插槽中。
这种实现会减少网
络传输量并因此能够提升你的应用程序的性能。由于多个插槽可以被同时更新而不会出现数据冲突,这也
使得冲突解决代码的
需求量做到了最少。

刷新remote共享对象

当所有的用户都断开了与共享对象的连接,或是当服务器关闭时,Flash Media Server会自动在客户机
和服务器上将remote
共享对象写入到磁盘。在任何其他的时间里,如果你想要使共享对象在磁盘上被更新,则你必须调用客户
机端
SharedObject.flush()方法。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 33 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

但不管怎么说,在客户机端ActionScript中调用SharedObject.flush()仅仅只是刷新了共享对象的本地版
本。要手工刷新共享对
象的服务器端拷贝,你必须在一个服务器端脚本中调用SharedObject.flush(),就像下面这样:
//用于将一个永久共享对象刷新到服务器的服务器端范例代码
//当应用程序被装载时得到共享对象。
application.onAppStart = function()
{
application.mySO = SharedObject.get("SharedObjName", true);
}
//当一个用户断开连接时刷新共享对象。
application.onDisconnect = function(client)
{
application.mySO.flush();
}

避免共享对象的同步问题

如果在同一时刻有不止一个客户机(或服务器应用程序)可以改变你的共享对象中的某个单独插槽中
的数据,则你必须实
现一个冲突解决策略。下面的例子描述了几种策略:
使用不同的插槽 最简单的策略是为可能改变对象中数据的每一个用户使用一个不同的插槽。例如,在
一个对聊天室中的
用户保持跟踪的共享对象中,为每一个用户提供一个插槽,并使用户只能修改他们自己的插槽。
分配一个拥有者 一个更复杂的策略是在一个有限的时间周期内把一个单独的用户定义成一个共享对
象的某个属性的拥有
者。
你可以通过编写服务器代码来创建一个“锁定”对象,
一个客户机可以在这个“锁定”对象中请求一个插槽
的所有权。如
果服务器报告这个请求是成功的,则这个客户机就会知道它将是改变这个共享对象中的数据的唯一的客户
机。
后面跟随的例子是一个服务器端ActionScript,其作用是锁定和解锁一个共享对象,以确保真正的最高
分被返回到游戏。假
定最近的最高分是,而玩家的分数增加到了,与此同时,玩家的分数增加到了。如果没有锁定发生的话,
则两个玩
家的分数都可以与最近的最高分进行比较,如果两个客户机同时调用updateHighScore的话,则一个冲突就
会发生。你会希望
确保每一个玩家都与最高分进行比较,不管这个最高分是最近的最高分还是任何来自所有其他客户机的当
前分数。如果你锁定
和解锁用于存储最高分的共享对象的话,则你就可以顺序的比较每一个分数,并因此保证了不会丢失任何
比较。
application.onAppStart = function()
{
application.scoreSO = SharedObject.get("high_score_so", true);
application.scoreSO.onSync = function(listVal)
{
trace("got an onSync on scoreSO");

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 34 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

}
}
application.onConnect = function(newClient,name,passwd)
{
newClient.updateHighScore = function(final_score)
{
application.scoreSO.lock();
if (application.scoreSO.getProperty("high_score_so") < final_score)
{
application.scoreSO.setProperty("high_score_so", final_score);
}
application.scoreSO.unlock();
}
}
通告客户机当服务器拒绝一个对共享对象的某个属性的客户机改变请求时,
SharedObject.onSync事件处
理器通告这个客户
机改变已经被拒绝。因此,一个应用程序可以提供一个用户接口来让用户决定这个冲突。如果数据的改变
很少发生的话,则这
种技术会工作的很好,比如一个共享地址簿。如果一个同步冲突发生的话,用户可以决定是否该接受或是
拒绝这个改变。
接受某些改变并拒绝另一些改变一些应用程序可以在一个“先来先服务”的基础上接受改变。当用户可
以通过重新提交
改变(如果某些其他人的改变先于他们的话)来解决冲突时这种方式会工作的最好。
使用send方法来提高你在控制改变对象方面的水平代替完全依赖于SharedObject.onSync来管理同步活
动,你可以在适当

的时候使用SharedObject.send()命令。SharedObject.send()命令会向连接到一个remote共享对象的所有客户机
广播一条消息,包括
发送这个消息的客户机。

Stream类
如果你想要删除与一个记录流关联的FLV和IDX文件,你必须像下面这样使用服务器端代码:
s = Stream.get("foo");
if (s)
{
s.clear();
}

System类
Macromedia Flash Media Server以UTF-8格式发送文本。如果你在你的ActionScript代码中把

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 35 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

System.useCodepage设置为true的
话,则你的媒体应用程序可能无法正常工作。值true将导致Flash Player把所有的文本都视为基于终端用户的
代码页,就像在
Flash Player的早期版本中那样。但不管怎么说,Flash Player将依然会发送UTF-8编码的文本到Flash Media
Server,并且所有从这
个服务器接收的文本也都是UTF-8编码的。在一个Flash Media Server应用程序中设置
System.useCodepage=true将很可能会导致不
可预期的行为并产生的巨大的阻碍。例如,文本可能无法适当的发送到服务器和从服务器接收。要获得有
关
System.useCodepage的更多信息,请参看《ActionScript 2.0语言参考》或Macromedia网站的文章“Unicode in
Macromedia
Flash”。

关于Video类
这个部分包含了有助于你优化对Video类的使用,同时也包含了有关动态创建Video对象的技巧。

关于动态创建Video对象

你只能从Flash创作环境中把Video对象添加到你的应用程序中,
方法是通过把一个嵌入的视频对象从库
中拖放到舞台中。但
不管怎么说,如果你想要从你的ActionScript代码中实现视频对象的话,你可以通过把它们嵌入到一个影片
剪辑中来做到这点。
这个技巧可以让你利用duplicateMovieClip()和removeMovieClip()方法来动态的创建和删除视频对象。

理解帧速率

如果你在一个静态SWF文件的一个Flash应用程序中嵌入了一个FLV文件的话,则其帧速率将与时间线
中帧的回放速率相
同。
当你流一个FLV中的数据时,
经由Flash Media Server的视频播放可以有一个与包含它的SWF不同的帧速
率。
例如,假定你使用另一个应用程序以fps的帧速率来输出一个宽带FLV文件。如果你把这个FLV文件引
入到一个fps的
Flash应用程序(SWF文件)中,则这个视频将不会同步,因为两个帧速率是不同的。但不管怎么说,如果
你使用Flash Media
Server把这个FLV流入到与前述同样的一个fps SWF文件中,则它将被同步到fps,因为流文件不使用基于帧
的回放。

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 36 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

第四章使用媒体文件

Macromedia Flash Media Server可以让你呈递多种多样的媒体体验。本章包括了有关创建实时Web事件
广播、为个别的客户
机定制流的呈递,以及MP3的发布和回放。

使用视频
Flash Media Server可以让你把实时和记录的视频流入Flash Player客户机。一些功能使得Flash Media
Server在视频呈递方面变
得非常强大。
通过均衡服务器的负载,边缘服务器(edge server)让你可以创建大规模的实时Web事件。
定制流呈递让你可以把客户机们作为一个个的个体来对待。你可以基于Flash Player版本来呈递流。使
用一点额外的代码,
你也可以基于客户机的带宽来呈递流。

关于创建实时Web事件

Flash Media Server应用程序客户机可以把一个实时视频流发布到服务器,而多个客户机也可以订阅广
播的流。这让你可以
创建实时Web事件。
如果你需要控制大规模的实时Web事件,有数量很大的订阅者接受这个实时广播,则订阅者们可以经
由边缘服务器(Edge
Server)连接到这个实时流。一个边缘服务器管理自一个源服务器的数据流量,以便这个源服务器可以向数
量极大的客户们进
行广播。要获得有关边缘服务器的更多信息,请参看《使用Flash Media Server边缘服务器》。

定制流的呈递

你可以使用Flash Media Server的定制流呈递功能通过为不同的客户机提供同一个流的不同版本来使每

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 37 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

一个客户机都能得到
最佳的流体验。例如,你可以为使用Flash Player 7的客户机提供用Sorenson Spark编解码器编码的视频,为
使用Flash Player 8的
客户机提供用On2 VP6编解码器编码的视频。你也可以基于客户机的带宽提供以不同比特(bit)率编码的
视频。
Flash Media Server有两个相互配合的功能可以让你呈递定制的流:虚拟目录和虚拟键。
你可以在Flash Media Server中创建多个目录并在每一个目录中存储同一视频内容的不同版本(例如,
一个以不同编解码器
编码或以不同比特率编码的视频)。连接到Flash Media Server的每一个客户机都被赋予一个虚拟键(存储
在服务器端
Client.virtualKey属性中)。默认情况下,虚拟键是基于客户机的Flash Player版本值的。在vhost.xml配置文
件中,你可以在文件
的VirtualKeys和VirtualDirectory部分中把这些键映射到目录以为每一个客户机呈递定制的内容。
要基于带宽
来定制流的呈递,你
必须在一个脚本中检测客户机的带宽并据此来改变客户机的键。
你可以直接在vhost.xml文件中设置键和目录值,或者你也可以使用服务器端ActionScript
(Client.virtualKey属性和
Stream.setVirtualPath()方法)来设置这些值。在你在vhost.xml文件中建立起这种映射后,每一个连接的客户
机就会自动地被提供
以适当的视频内容。
要获得有关vhost.xml配置文件的更多信息,参看《管理Flash Media Server》中的“Vhost.xml文件”。

基于Flash Player版本来呈递视频

Flash Media Server可以编码和呈递On2 V6和Sorenson Spark编码的视频。Flash Player 8支持这两种编解
码器;Flash Player 7
及更早的版本仅支持Sorenson Spark编解码器。你可以在服务器上创建虚拟目录以便分别以两种格式存储视
频流的拷贝;这可以
让你给使用Flash Player 8的客户们呈递最高质量的内容。
考虑下面的例子:一个用户想要播放一个流,Flash Player 8已经安装在他们的计算机中。Flash Player 8
具有播放On2视频的
能力。Flash Media Server请求HappyStream.flv文件。在联络上服务器之后,Flash Player 8决定服务器端
Clinet.virtualKey属性的
值。virtualKey属性映射到On2流目录,代替了默认的流目录,而以On2编解码器编码的HappyStream.flv流就
开始播放了。
要创建一个基于Flash Player版本自动进行流呈递的机制,像下面这样编辑vhost.xml文件:
<VirtualKeys>
<Key from="WIN 7,0,19,0" to="WIN 9,0,0,0">A</Key>
<Key from="WIN 6,0,0,0" to="WIN 7,0,18,0">B</Key>
<Key from="MAC 6,0,0,0" to="MAC 7,0,55,0">B</Key>
</VirtualKeys>
<VirtualDirectory>
<Streams key="A">foo;c:streamson2</Streams>
<Streams key="B">foo;c:streamssorenson</Streams>
<Streams key="">foo;c:streams</Streams>
</VirtualDirectory>

TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 38 -
TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家
TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com

基于带宽呈递视频

要基于客户机的带宽把视频呈递给客户机,以不同的比特率(并可选的可以使用不同的编解码器)编
码这个视频并创建目
录,在目录中存储这些流,就像下面的例子中所展示的这样:
c:streamsSorenson22kmystream.flv
c:streamsSorenson150kmystream.flv
c:streamsSorenson300kmystream.flv
c:streamsVp622kmystream.flv
c:streamsVp6150kmystream.flv
c:streamsVp6300kmystream.flv
在vhost.xml文件的VirtualKeys标签中,把Flash Player 7及以下版本的虚拟键设置为fp7,把Flash Player 7
(.0.19.0)及更新
版本(支持On2编解码器的播放器)的虚拟键设置为fp8,就像下面的例子所展示的这样:
<VirtualKeys>
<Key from="WIN 8,0,0,0" to="WIN 9,0,0,0">fp8</Key>
<Key from="MAC 8,0,0,0" to="MAC 9,0,0,0">fp8</Key>
<Key from="WIN 6,0,0,0" to="WIN 7,0,55,0">fp7</Key>
<Key from="MAC 6,0,0,0" to="MAC 7,0,55,0">fp7</Key>
</VirtualKeys>
配置你的虚拟目录以寻找客户机键“fp7slow”、“fp8slow”等等,就像下面的例子所展示的这样:
<VirtualDirectory>
<Streams key="fp7slow">foo;c:streamsSorenson22k</Streams>
<Streams key="fp7medium">foo;c:streamsSorenson150k</Streams>
<Streams key="fp7fast">foo;c:streamsSorenson300k</Streams>
<Streams key="fp8slow">foo;c:streamsVp622k</Streams>
<Streams key="fp8medium">foo;c:streamsVp6150k</Streams>
<Streams key="fp8fast">foo;c:streamsVp6300k</Streams>
<Streams key="">foo;c:streams</Streams>
</VirtualDirectory>
在你的服务器端脚本中,在application.onConnect处理器中,编写带宽探测例行程序(routine)并把探
测结果追加到每一个
客户机的虚拟键的后面,就像下面的例子中所展示的这样:
client.virtualKey += "slow"
client.virtualKey += "medium"
client.virtualKey += "fast"
Flash Media Server现在可以基于客户机的播放器的版本和带宽来为每一个客户机提供内容了。

把虚拟目录映射到虚拟键

虚拟键和虚拟目录之间的映射是在vhost.xml文件中完成的。vhost.xml文件的<VirtualKeys>部分把虚拟
键映射到一个Flash
Player版本范围,就像下面的例子所展示的这样:
<VirtualKeys>
<Key from="WIN 7,0,19,0" to="WIN 9,0,0,0"></Key>
TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档
感谢Adobe Macromedia Flash Media Server开发小组的英文原版

- 39 -
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop
Develop

More Related Content

Viewers also liked

Auditoria de sistema
Auditoria de sistemaAuditoria de sistema
Auditoria de sistemajersonbb
 
Oportunidades para medios de prensa
Oportunidades para medios de prensaOportunidades para medios de prensa
Oportunidades para medios de prensaBoris Caro
 
Kuliah #1 ; concept map op pak iswandi
Kuliah #1 ; concept map op pak iswandiKuliah #1 ; concept map op pak iswandi
Kuliah #1 ; concept map op pak iswandiMu'amar ad darory
 
Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...
Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...
Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...Ensenyament
 
CLINICAL CHEMISTRY Quo vadis oct 2013
CLINICAL CHEMISTRY Quo vadis oct 2013CLINICAL CHEMISTRY Quo vadis oct 2013
CLINICAL CHEMISTRY Quo vadis oct 2013Moushumi Lodh, MD
 
第5回LOCAL学生部総大会開催告知LTその2
第5回LOCAL学生部総大会開催告知LTその2第5回LOCAL学生部総大会開催告知LTその2
第5回LOCAL学生部総大会開催告知LTその2Arien Kakkowara
 
Κοινωνικά Δίκτυα
Κοινωνικά ΔίκτυαΚοινωνικά Δίκτυα
Κοινωνικά ΔίκτυαEirini Voutskoglou
 
Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013
Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013
Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013Ιωάννα Καλαϊτζίδου
 
Propuesta para la decoración de las aulas escolares
Propuesta para la decoración de las aulas escolaresPropuesta para la decoración de las aulas escolares
Propuesta para la decoración de las aulas escolaresstevenska98
 
Samorząd Uczniowski Ośrodka w Otwocku
Samorząd Uczniowski Ośrodka w OtwockuSamorząd Uczniowski Ośrodka w Otwocku
Samorząd Uczniowski Ośrodka w OtwockuMariusz Woronko
 
Medios sociales de comunicación
Medios sociales de comunicaciónMedios sociales de comunicación
Medios sociales de comunicaciónsilvia0208
 
대신리포트_모닝미팅_131106
대신리포트_모닝미팅_131106대신리포트_모닝미팅_131106
대신리포트_모닝미팅_131106DaishinSecurities
 

Viewers also liked (20)

Slot 4 perkakasan multimedia
Slot 4   perkakasan multimediaSlot 4   perkakasan multimedia
Slot 4 perkakasan multimedia
 
Auditoria de sistema
Auditoria de sistemaAuditoria de sistema
Auditoria de sistema
 
Test 1
Test 1Test 1
Test 1
 
Slide 2
Slide 2Slide 2
Slide 2
 
Oportunidades para medios de prensa
Oportunidades para medios de prensaOportunidades para medios de prensa
Oportunidades para medios de prensa
 
Kuliah #1 ; concept map op pak iswandi
Kuliah #1 ; concept map op pak iswandiKuliah #1 ; concept map op pak iswandi
Kuliah #1 ; concept map op pak iswandi
 
Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...
Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...
Esquerda: 3 setmanes de vaga indefinida. Elements de reflexió. Entrevistem a ...
 
14
1414
14
 
PA
PAPA
PA
 
CLINICAL CHEMISTRY Quo vadis oct 2013
CLINICAL CHEMISTRY Quo vadis oct 2013CLINICAL CHEMISTRY Quo vadis oct 2013
CLINICAL CHEMISTRY Quo vadis oct 2013
 
第5回LOCAL学生部総大会開催告知LTその2
第5回LOCAL学生部総大会開催告知LTその2第5回LOCAL学生部総大会開催告知LTその2
第5回LOCAL学生部総大会開催告知LTその2
 
Κοινωνικά Δίκτυα
Κοινωνικά ΔίκτυαΚοινωνικά Δίκτυα
Κοινωνικά Δίκτυα
 
Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013
Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013
Tηλεθέρμανση Πτολεμαϊδας_ΣΥΝΤΟΜΗ ΠΑΡΟΥΣΙΑΣΗ_Νοε 2013
 
財務承諾
財務承諾財務承諾
財務承諾
 
Propuesta para la decoración de las aulas escolares
Propuesta para la decoración de las aulas escolaresPropuesta para la decoración de las aulas escolares
Propuesta para la decoración de las aulas escolares
 
Samorząd Uczniowski Ośrodka w Otwocku
Samorząd Uczniowski Ośrodka w OtwockuSamorząd Uczniowski Ośrodka w Otwocku
Samorząd Uczniowski Ośrodka w Otwocku
 
3 work assessment and feedback
3 work assessment and feedback3 work assessment and feedback
3 work assessment and feedback
 
Medios sociales de comunicación
Medios sociales de comunicaciónMedios sociales de comunicación
Medios sociales de comunicación
 
Relato cuidar 1
Relato cuidar 1Relato cuidar 1
Relato cuidar 1
 
대신리포트_모닝미팅_131106
대신리포트_모닝미팅_131106대신리포트_모닝미팅_131106
대신리포트_모닝미팅_131106
 

Similar to Develop

Introduction of Adobe Flash Lite
Introduction of Adobe Flash LiteIntroduction of Adobe Flash Lite
Introduction of Adobe Flash LiteMaso Lin
 
Koubei banquet 28
Koubei banquet 28Koubei banquet 28
Koubei banquet 28Koubei UED
 
Firmware download
Firmware downloadFirmware download
Firmware downloadcri fan
 
老成之CreateJS與Flash
老成之CreateJS與Flash老成之CreateJS與Flash
老成之CreateJS與Flash智遠 成
 
Tfs配置及使用手册
Tfs配置及使用手册Tfs配置及使用手册
Tfs配置及使用手册chenguangxi
 
互動設計技術現況 20121205
互動設計技術現況 20121205互動設計技術現況 20121205
互動設計技術現況 20121205亭惠 王亭惠
 
Camtasia講義
Camtasia講義Camtasia講義
Camtasia講義dearken
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guidephantoxe
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guidephantoxe
 
Mochimedia's Success Story - Case Study I (Python-based Company)
Mochimedia's Success Story - Case Study I (Python-based Company)Mochimedia's Success Story - Case Study I (Python-based Company)
Mochimedia's Success Story - Case Study I (Python-based Company)Sting Chen
 
Hacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarPranav Hivarekar
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置wangkangluo1
 
Vcon90 Final
Vcon90 FinalVcon90 Final
Vcon90 Finalxobo
 
Mpeg vbr
Mpeg vbrMpeg vbr
Mpeg vbrcri fan
 
online video for game
online video for gameonline video for game
online video for gamedianming.song
 
New FileMaker 13 Platform (Chinese)
New FileMaker 13 Platform (Chinese)New FileMaker 13 Platform (Chinese)
New FileMaker 13 Platform (Chinese)Chong-Bing Liu
 
Dalet電視數位製播系統 Dalet 數位片庫
Dalet電視數位製播系統  Dalet 數位片庫Dalet電視數位製播系統  Dalet 數位片庫
Dalet電視數位製播系統 Dalet 數位片庫bradeley
 
分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版
分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版
分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版ITband
 

Similar to Develop (20)

Introduction of Adobe Flash Lite
Introduction of Adobe Flash LiteIntroduction of Adobe Flash Lite
Introduction of Adobe Flash Lite
 
FLASH8 動態設計
FLASH8 動態設計FLASH8 動態設計
FLASH8 動態設計
 
Koubei banquet 28
Koubei banquet 28Koubei banquet 28
Koubei banquet 28
 
Firmware download
Firmware downloadFirmware download
Firmware download
 
老成之CreateJS與Flash
老成之CreateJS與Flash老成之CreateJS與Flash
老成之CreateJS與Flash
 
Tfs配置及使用手册
Tfs配置及使用手册Tfs配置及使用手册
Tfs配置及使用手册
 
互動設計技術現況 20121205
互動設計技術現況 20121205互動設計技術現況 20121205
互動設計技術現況 20121205
 
Camtasia講義
Camtasia講義Camtasia講義
Camtasia講義
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guide
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guide
 
Mochimedia's Success Story - Case Study I (Python-based Company)
Mochimedia's Success Story - Case Study I (Python-based Company)Mochimedia's Success Story - Case Study I (Python-based Company)
Mochimedia's Success Story - Case Study I (Python-based Company)
 
Hacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav Hivarekar
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置
 
Vcon90 Final
Vcon90 FinalVcon90 Final
Vcon90 Final
 
Mpeg vbr
Mpeg vbrMpeg vbr
Mpeg vbr
 
OSMF 介紹
OSMF 介紹OSMF 介紹
OSMF 介紹
 
online video for game
online video for gameonline video for game
online video for game
 
New FileMaker 13 Platform (Chinese)
New FileMaker 13 Platform (Chinese)New FileMaker 13 Platform (Chinese)
New FileMaker 13 Platform (Chinese)
 
Dalet電視數位製播系統 Dalet 數位片庫
Dalet電視數位製播系統  Dalet 數位片庫Dalet電視數位製播系統  Dalet 數位片庫
Dalet電視數位製播系統 Dalet 數位片庫
 
分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版
分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版
分会场六利用赛门铁克的Sort工具降低风险,提高应用的持续运行时间 中文版
 

Develop

  • 1. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -1-
  • 2. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com Macromedia Flash Media Server 2 帮助 中文版-译本 说明:因为翻译制作的时间较短,所以里面有部份图片没放上,还有些格式没调整,但很多 Flash 开发者们 早就迫切的想要这份中文版,所以先提早放出了,而不完善的地方会在今后完善,请大家关注,在之后还 会制作成帮助文档便于大家使用,现在就先用这个应付一下吧!谢谢您的支持和谅解! 云南 TT 概念游戏公司整理制作 ——全国第一的 Flash 网络游戏专家—— www.TTNo1.com 特别感谢: Macromedia Flash Media Server 2 开发小组的英文原版 以及在翻译及整理过程中给于帮助所有 Flash 开发者们 特别通告: TTGame 诚邀各位 Flash 爱好者、开发者们的加入! 希望你与我们一起开创一片 Flash 的新天地! 为不断增强团队实力,实现更大更远的目标! 特招聘: Flash 游戏开发者 Flash 应用开发者 Flash 动画高手 Flash 艺术设计 及 Flash 各路高手 希望你积极与我们取得联系 不论你是想要加入我们、还是想要与我们交流、 还是因为有共同的目标、还是因为想与我们合作 还是、还是、还是、、、、 、、、、 都希望你通过以下联系方式联系我们 联系方式: Email:ynttgame@163.com QQ: 50955577 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -2-
  • 3. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 《开发媒体应用程序》 欢迎来到Macromedia Flash Media Server 2-一个强大的服务器平台,用于在Macromedia Flash中创建富 媒体应用程序,以及 将音频和视频流入Flash客户机端。Flash Media Server(FMS)可以让两个或更多的人们使用文本、音频或 视频参与到一个实时 的会话当中。例如,你可以将FMS用于会议、在线的社区交互、客户支持、销售支持,或是培训。FMS是 为视频消息、视频聊 天,以及视频博客提供动力的一种绝佳方式。FMS也是一种用于流实时数据,以及把Flash视频体验打入各 种网络以进行Internet 呈递的平台。FMS是Macromedia完整的数据库连通性、目录系统,以及现场服务解决方案中的一个组成部 分,是唯一的能够将 音频和视频呈递给流行的Flash Player的服务器。 面对的目标读者 这个手册展示给你-这位Flash开发者-在建立一个开发环境及创建Flash Media Server应用程序中会涉及 到的步骤,包括调试 和测试应用程序。 你应该已经对Flash创作、ActionScript,以及Flash Player很熟悉。熟悉JavaScript、客户机/服务器模式, 以及网络概念将是 非常有帮助的。 Flash Media Server文档配置假定你已经安装了Macromedia Flash并知道如何使用它。 关于Flash Media Server文档 Flash Communication Server文档是被设计为与Flash文档-也就是《使用Flash》和《ActionScript 2.0语言 参考》配合使用的。 所有的Flash Media Server文档都以PDF格式 (可以用Adobe Acrobat Reader来阅读和打印) 在Flash Media Server光盘中、 Macromedia网站上,以及作为Macromedia Flash应用程序中的Flash帮助可用。Flash Media Server文档也在 Macromedia网站上作为 LiveDoc格式文档可用。 安装Flash Media Server描述了如何安装服务器及Flash创作扩展。 它还列出了在安装期间将被安装 的文件。 开始使用Flash Media Server展示了对Flash Media Server, 以及版本中的新功能的一个简短的概述。 同时还包含了系 统需求和安装指导。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -3-
  • 4. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 你可以在Flash Media Server光盘中找到本手册的一个可打印版本。 开发媒体应用程序这份手册解释了如何建立你的开发环境,以及如何使用Flash创作环境和Flash Media Server应用程序 编程接口(API)来创建媒体应用程序。 管理Flash Media Server解释了配置和维护这个服务器及使用管理控制台的细节。 Flash Media Server 2客户机端ActionScript语言参考对你可以用来创建客户机端功能的 ActionScript进行了归档。 服务器端ActionScript语言参考对你可以用来创建服务器端功能的ActionScript进行了归档。 服务器管理ActionScript语言参考对你可以用来扩展管理控制台,或是创建你自己的管理和监视工 具的高级 ActionScript方法进行了归档。 可供学习Flash Media Server的支持 你可能想要探索其他可供学习Flash Media Server的支持。 Flash Media Server Support Center提供了TechNotes及有关Flash Media Server的最新信息。 Flash Media Server Developer Center站点提供了创建Flash Media Server应用程序的提示和范例。 Flash Media Server在线论坛为你与其他Flash Media Server用户聊天提供了一个场所。 要获得软件发布后的最新消息以及目前依然存在的问题的完整列表,访问Flash Media Server release notes。 第一章开始 本章描述了在你开始利用Macromedia Flash Media Server 2开发应用程序之前所必需做的工作。它描述 了如何建立你的开发 环境,如何部署你的应用程序,以及如何创建一个例子应用程序连接到这个服务器。 安装和系统需求 要获得有关如何安装Flash Media Server,以及有关系统需求的信息,请参看安装Flash Media Server。 配置硬件和软件 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -4-
  • 5. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 要编写Flash Media Server应用程序,你必须安装Macromedia Flash创作软件、Flash Media Server,以及 最新版的Flash Player。如果你想要编写涉及捕获音频和视频的应用程序,则你还需要安装一个麦克风和摄像头。此外,如 果你的Flash Media Server应用程序涉及服务器端脚本的编写,则你还需要一个UTF-8 JavaScript编辑器,比如Flash Professional 中的脚本窗口。所有 这些开发环境中的每一个元素都将在这个部分中进行讨论。 Flash创作软件 如果你尚未安装Macromedia Flash,请参看Flash文档。 Flash Media Server软件 如果你尚未安装服务器,请参看安装Flash Media Server,该文档以PDF格式在 产品光盘上可用。 Flash Player 确保你正在使用最新版的Flash Player。你可以从Macromedia网站下载Flash Player。 注意:如果你正在Linux上运行Flash Media Server,则你将需要一台安装有Flash的Windows或Macintosh 计算机来创建你的媒 体应用程序,并且,你需要在你的创作计算机上安装创作扩展。你也会希望在你的UNIX服务器上安装Flash Player以使用管理工 具。 摄像头和麦克风要安装一个摄像头或麦克风,按照该设备的说明书上所给出的指导操作。要获得一个 已知的与Flash Media Server兼容的摄像头的列表,参看Macromedia网站中有关摄像头兼容性的文档,网址是: http://www.macromedia.com/go/tn_16453。不在该列表中的摄像头也可能是与Flash Media Server兼容的,但 它没经过Macromedia 的测试。 很多摄像头包含一个内建的麦克风。你也可以安装一个独立的麦克风,或者最好是一个耳麦。 在你安装了你的设备之后,你可以指定默认情况下Flash将使用哪个摄像头或麦克风。当任何Flash应用 程序播放时,点击鼠 标右键,从上下文菜单中选择设置,点击麦克风或摄像头面板,然后从弹出菜单中选择你首选的设备。 使用JavaScript编辑器 你可以使用任何文本编辑器来编写服务器端ActionScript代码,你需要把这些代 码保存在以.asc或.js 作为扩展名的文件中。 你可能更愿意使用专为开发基于Web的应用程序而设计的软件, 比如Flash Professional 或Dreamweaver。 要在Flash中创建一个.asc文件,选择“文件->新建->动作脚本通信文件”。 要在你的服务器端脚本中包含非ASCII文本,比如亚洲语言中使用的双字节字符,你必须使用一个支持 UTF-8编码的编辑 器。Flash Media Server需要UTF-8编辑的ASC文件把双字节字符从一个客户机传送到另一个客户机。要获得 更多信息,参看“编 写双字节应用程序”。 创建一个开发环境 本部分阐述在你创建你的Flash Media Server应用程序前你所需要知道的事情。 确保服务器正在运行 要发布和测试你的应用程序,Flash Media Server必须处于运行状态。要获得更多 信息,请参看“启 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -5-
  • 6. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 动服务”。 指定服务器URI 使用正运行着Flash Media Server的服务器上的Flash创作环境。如果你的情况不是这 样,则需要把你的服务 器名添加到在这里归档的所有的connect命令中。例如,如果你的服务器正运行在 myServer.myDomain.com.com,则要把下面这 样的一行: new_nc.connect("rtmp:/doc_record/room_01"); 改为: new_nc.connect("rtmp://myServer.myDomain.com/doc_record/room_01"); 注意:确保你在修订后的代码中的rtmp:后使用了双斜线(//)。单斜线用法只有当这个SWF应用程序由 运行着Flash Media Server的同一台计算机提供时才会被支持。 指定发布格式 配置Flash来发布SWF和HTML文件。要指定在发布期间将要创建的格式,在创作环境中 选择“文件->发布 设置”。 编写客户机端ActionScript代码 除非另有注明,否则,你的客户机端ActionScript代码将被捆绑到你的 FLA文件的第一帧的 某一层上, 而不会被捆绑到个别的对象。 针对Flash Player 7或更新版本发布的文件中的客户机端代码是大小 写敏感的。 编写服务器端ActionScript代码对于使用服务器端ActionScript代码的应用程序来说, 要把代码放置在一 个服务器端。把这 个文件命名为main.asc (它也可以有一个诸如registered_app_name.asc这样的名字) 并使用Flash ActionScript , 编辑器或JavaScript 编辑器来编写它。服务器端代码是大小写敏感的。 装载components.asc 要在任何应用程序中使用媒体组件,你必须装载components.asc文件,其位于 scriptlib目录中。要装载 这个文件,为你的应用程序创建一个服务器端脚本文件,假如你还没有这么做的话,那么,现在是适当的 命名它(比如叫做 main.asc)并在其顶端添加下面的代码的时候了: load("components.asc"); 技巧:你可能会发现只要把这个文件拷贝到任何使用了媒体组件的应用程序中就可以了,但要确保适 当的命名了它。 确认用户的隐私权在你记录或广播任何人的影像或声音之前,告知人们你的意图并得到他们的同意或 许可是非常重要 的。 监视运行中的应用程序 如果你有服务器管理权限,当你测试应用程序时你可以查看它的详细信息,比 如它生成的日志消 息、共享对象的值,等等。如果你想这么做的话,打开管理控制台并连接到Flash Media Server。要获得更 多信息,请参看第五 章“调试和监视应用程序”。 开发任务预览 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -6-
  • 7. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 下面的清单提供了一个要使任何应用程序与Flash Media Server协同工作,你所必需完成的所有任务的 一个总揽性的概述。 如果你想要获得本章中所讨论的这些任务的更详细的内容,那你应该阅读完整个这章。 要创建和部署一个Flash Media Server应用程序,完成下面的任务: 1. 为你的新应用程序选择一个名字 (例如, my_app) 并在服务器上注册这个应用程序: 在Flash Media Server应用程序目 录中,用你的应用程序的名字创建一个新目录。 这个名字就是你的“已注册应用程序名”(registered application name)。这个目录就是你的“已注册 应用程序目录” (registered application directory)。 2. 在Flash中,创建一个FLA文件,其中包括一个新的NetConnection语句,该语句带有已注册应用程 序名,并且,如果适 用的话,在URI中还会包括应用程序的实例。 例如: my_nc = new NetConnection(); my_nc.connect("rtmp://myDomain.com/registered_app_name"); 这个语句把客户机连接到这个registered_app_name应用程序。 3. 使用你的已注册应用程序名来保存这个FLA文件。 你可以把这个FLA文件保存在任何地方;它是用来创建SWF文件的源文件,且不是被部署的应用 程序的一部分。 4. 如果你有一个包含服务器端ActionScript的脚本文件,把它放置在Flash Media Server应用程序目录 的已注册应用程序目 录中,或是你在这个已注册应用程序目录中创建的一个/scripts目录中。 你的服务器端脚本文件可以被命名为main.asc或registered_app_name.asc。 5. 在一个你的客户机可访问但Flash Media Server不使用的目录中发布你的应用程序的SWF文件。 例如,你可以把你的SWF文件放置在Web根目录中以便把你的应用程序分发给你的客户们,或者 你可以把SWF文件通 过电子邮件发送给你的客户们并存储在其他一些目录中。 依赖于你的应用程序,一些额外的步骤可能需要;但不管怎么说,这些步骤是所有的应用程序都必需 的,不管它们各自的 功能如何。 技巧:当你要命名配合Flash Media Server及其应用程序使用的目录和文件时,Macromedia推荐你使用 全部小写和没有空格 的名字。这个习惯将有助于确保在开发期间,如果你把文件移动到了不同的计算机或不同的平台上,你的 应用程序能够继续工 作。 本章剩下的部分描述了在建立你的应用程序的过程中会涉及到的事情,介绍了在Flash Media Server应 用程序中使用的对象 和文件,并向你展示了如何创建并连接到你的第一个Flash Media Server应用程序。 部署应用程序和应用程序实例 这个部分讨论你必须把你希望服务器寻找的应用程序数据放置在什么地方,同时也解释了如何以及为 什么要运行应用程序 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -7-
  • 8. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 实例。 保存服务器端和客户机端文件 服务器端应用程序文件的默认位置是C:Program filesMacromediaFlash Media Server 2applications。这 也就是那个被作为 applications目录提及的目录。当你创建一个媒体应用程序时,你必须创建一个已注册应用程序目录,它是 位于applications目录中 针对你的应用程序的一个子目录。 你可以把你的客户机端文件(SWF和HTML)保存在任何位置;但最可能的情况是,你会把它们保存 在你的Web服务器的 发布目录中。你的应用程序的FLA文件可以同SWF和HTML文件保存在一起,直到部署时刻的来临;在生产 时刻到来时,你应 该把这些FLA文件移走并把它们保存到一个安全的位置。 在你的开发工作的进展期间,为了组织的目的,把我们所有的客户机和服务器应用程序文件(FLA、 SWF、HTML或ASC) 保存在同一个子目录中可能是方便的。当你部署你的应用程序时,你可以把你的SWF和HTML文件放置在 任何位置。但不管怎 么说,已注册应用程序目录必需保存在Flash Media Server服务器上,连同应用程序要使用的任何ASC、FSO 和FLV文件。当你部 署服务器和应用程序时,服务器端文件(你的ASC、FLV,以及FSO文件)和你的FLA源文件不应该位于你 的Web根目录中。只 有你的SWF和HTML文件应该保存在Web根目录中。 在任何情况下,你都必须创建一个与你发出NetConnection.connect命令时所要连接到的应用程序同名的 已注册应用程序目 录。 例如,假定你有一个名为chat_App的应用程序,就像下面的例子所展示的这样: NetConnection.connect("rtmp://myServer.myDomain.com/chat_App"); 你必须在applications目录中创建一个名为chat_App的子目录。 再假定你的应用程序还要使用一些服务器 端脚本,这些脚本 被保存在一个名为chat_App.asc的文件中,则你必须把这个chat_App.asc保存到同一个目录中。 注意:即使你还没有什么服务器端脚本要保存到那个已注册应用程序目录中,你也必须创建这样一个 与你的应用程序名相 同的已注册应用程序目录。这是因为Flash Media Server会把任何由你的应用程序创建的流或共享对象文件 保存在你的已注册应 用程序目录中(参看“编码约定”)。同时,这个目录的存在也告诉Flash Media Server,这个应用程序是被授 权的,用户可以 连接到这个应用程序的实例。 保存你的应用程序的服务器端脚本文件 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -8-
  • 9. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 对于你绝大多数的应用程序而言,很可能是会需要用到服务器端脚本的。你可以在Flash ActionScript 编辑器或是在一个 JavaScript文本编辑器中创建你的应用程序的服务器端脚本文件。把这个脚本文件命名为main.asc或main.js 或 registered_app_name.asc或registered_app_name.js,在这里,registered_app_name是已注册应用程序目录的名 字和这个应用程序自 身的名字。把这个脚本文件保存在你的已注册应用程序目录中。例如,如果你为你的聊天应用程序创建了 一 个/applications/chat_app目录的话,则你应该把你的服务器端脚本文件命名为chat_app.asc并把它放置在 chat_app目录中。可选的 另一种方法是,你可以把你的服务器端脚本放置在已注册应用程序目录中的一个名为scripts的子目录中 (/applications/chat_App/scripts)。 注意:为了简化部署,Flash Media Server包含了一个档案编译工具(far.exe),你可以用它来把你的服 务器端脚本文件打 包成一个单独的档案文件。为了加速装载的时间,这个工具也允许你把脚本文件编译成二进制格式。要获 得更多信息,参看 “归档并编译服务器端脚本文件”。 关于应用程序实例 应用程序是通过创建应用程序实例(application instances)来运行的。当一个客户机连接到一个应用程 序时,这个客户机实 际上是被连接到一个应用程序实例。例如,一个客户机连接到一个名为chat_app的应用程序,就像下面的例 子展示的这样: nc.connect("rtmp://myDomain.com/chat_app); 在这个例子中, 因为没有实例被指定, 因此这个客户机实际上是被连接到这个应用程序的名为_defInst_ 的默认实例。客户 机也可以连接到由NetConnection.connect命令中的instanceName值定义的指定的应用程序实例,就像下面的 例子展示的这样: nc.connect("rtmp://myDomain.com/chat_app/instance1); 在这个例子中,这个客户机被连接到名为instance1的应用程序实例。 你可能会想要把应用程序实例用于特殊的目的。例如,你可能希望不同组的人们可以访问同一个应用 程序,而互相之间又 不会产生影响,比如一个按不同的主题分为不同的“房间”的一个聊天室应用程序。要做到这点,你可以在 同一时刻构造这个 聊天室应用程序的多个实例,就像下面这样: my_nc.connect("rtmp://myServer.myDomain.com/chatApp/room_01") my_nc.connect("rtmp://myServer.myDomain.com/chatApp/room_02") 每一个应用程序实例都应该被唯一的命名。不同于其父应用程序,一个实例不需要在服务器上定义它 自己的目录。但不管 怎么说,应用程序的资源,比如流和共享对象,对于每个实例而言都是独立的,并且是被存储在为这个应 用程序配置的流和共 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 -9-
  • 10. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 享对象存储目录下的它们各自的目录中的。 使用应用程序实例的另一个原因是可以避免由这个应用程序创建的记录流或共享对象的冲突。例如, 在上面的例子中,由 room_01创建的任何流或共享对象与由room_02创建的都是截然不同的,反之亦然,即使这两个实例都是运 行的同一个应用程 序-chat_App。 例如,尽管在下面的代码中,这个support应用程序创建了两个共享对象,都被命名为CustomerInfo,但 这个support应用程 序的每一个实例都只能访问它自己的CustomerInfo对象。同样,由session1使用的CustomerInfo中的数据与由 session2使用的 CustomerInfo中的数据也是不同的,就像下面的例子所展示的这样: //"support"应用程序的一个实例 first_nc = new NetConnection(); first_nc.connect("myserver.mydomain.com/support/session1"); first_so = SharedObject.getRemote("CustomerInfo", first_nc.URI, false); first_so.connect(first_nc.URI); //"support"应用程序的另一个实例 second_nc = new NetConnection(); second_nc.connect("myserver.mydomain.com/support/session2"); second_so = SharedObject.getRemote("CustomerInfo", second_nc.URI, false); second_so.connect(second_nc.URI); 实例名room_01被非常频繁的使用,但你可以使用任何对你的应用程序有意义的字符串作为实例名。 你可以配置几种与应用程序实例相关的设置。在Application.xml文件中,你可以指定在一个实例被服务 器卸载之前最大的空 闲时间是多少。在Vhost.xml文件中,你可以指定能够连接到虚拟主机宿主的一个应用程序的客户机数,以 及可以由虚拟主机装 载的实例数。 要获得有关使用实例名的更多信息,请看“Flash Media Server 2客户机端ActionScript语言参考”中的 NetStream.publish()条 目。 要获得有关构造可用于多个应用程序的远程共享对象的信息,请看“Flash Media Server 2客户机端 ActionScript语言参考” 中的SharedObject.getRemote()条目。 由Flash Media Server使用的文件类型 除了由Flash创建并使用的文件类型(FLA、SWF和SWD)外,Flash Media Server还使用和创建下列文 件类型: ASC和JS文件你所编写的或是随Flash Media Server提供的服务器端脚本文件。当你创建服务器端脚本 时,使用Flash ActionScript编辑器或一个JavaScript编辑器并把这些脚本放置到你的已注册应用程序目录中的你为你的应用 程序创建的子目录 中,例如,/applications/chat_app;或是位于一个scripts子目录中,比如,/application/chat_app/scripts。 Flash Media Server在/scriptlib目录中提供了一个脚本库, 这个脚本库中包含了用于组件和Flash Remoting 服务的服务器端脚 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 10 -
  • 11. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 本。 当你在Flash Media Server中使用组件或Flash Remoting时, 来自/scriptlib的适当脚本会被包含或被装载到 你的应用程序的服 务器端脚本文件中。/scriptlib目录的位置是在你的Application.xml配置文件的<ScriptLibPath>标记中被指定 的。要获得有关装载 components.asc文件以使用媒体组件的信息,请参看“创建一个开发环境”。 ASE文件 被编译为二进制文件的服务器端脚本文件。请参看“归档和编译服务器端脚本文件”。 FAR文件 被归档为一个自包含文件的服务器端脚本文件。请参看“归档和编译服务器端脚本文件”。 FLV和IDX文件 记录流及其关联的索引文件。当服务器生成流时,它也会在这个已注册应用程序目录 中生成一个流目录, 并把FLV和IDX文件存储到为这个应用程序实例指定的一个子目录中(例如, /applications/chat_app/streams/instance2)。 SOL、SOR和FSO文件 共享对象文件。SOL文件会一直维持在客户机上;FSO文件仅维持在服务器上; SOR文件维持在客 户机上,同时有一个匹配的FSO文件维持在服务器上。共享对象文件的位置依赖于共享对象的种类的不同 而不同。 要获得有关Flash Media Server在何处存储流和共享对象文件的信息,请参看“编码约定”。 要获得有关共享对象的更多信息,请参看“关于共享对象文件”。 连接到服务器 要连接到Flash Media Server的一个实例,你首先需要启动这个服务,然后你还需要在你的客户机端脚 本中发出new NetConnection和NetConnection.connect()命令。这个部分中就将讨论这些任务。 注意:应用程序可以利用RTMP(Real Time Message Protocol--实时消息协议)或RTMPS(Real Time Message Protocol over SSL--安全套接层上的实时消息协议)连接到Flash Media Server。 技巧:尽管你可以使用组件来连接到服务器,但首先要学习如果通过编写ActionScript来进行连接,就 像本部分中所描述的 那样。 启动服务 如果服务器还没有启动,你可以手工启动它。在Windows的“开始”菜单中,选择“程序-> Macromedia -> Flash Media Server 2 -> Start Flash Media Server 2和Start Flash Media Admin Server 2”。在Windows中,要确认这个服务是 否正在运行,打开 “任务管理器”,确保FMSAdmin.exe和FMSMaster.exe都存在于进程选项卡的列表中。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 11 -
  • 12. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 打开一个至服务器的连接 在Flash创作环境中打开一个新文件,并添加客户机端ActionScript命令以连接到这个服务器。 要连接到Flash Media Server: 1. 在一个新的Flash电影中,通过发出下面的命令打开一个连接: my_nc = new NetConnection(); 2. 在上述命令后跟随一个connect命令: my_nc.connect(targetURI); 在这个NetConnection.connect(省略可选的参数)的基本语法中,targetURI是Flash Media Server上 的一个应用程序的 Uniform Resource Identifier(URI-统一资源标识符),当这个连接被发出时,这个Flash Media Server应 该是处于运行状态 的。要指定targetURI,使用下列格式中的一个(方括号中的项目是可选的): rtmp://localhost[:port]/appName[/instanceName] localhost的使用指出这个服务器正运行于你的本地计算机中。 rtmp://host[:port]/appName[/instanceName] 注意:在targetURI的所有语法例子中,你必须使用rtmp(Real-Time Messaging Protocol-实时消息 协议)作为这个连接 的协议。如果你省略它的话,则Flash Player会假定你想要构造一个通向某个应用程序服务器的HTTP连 接,显然,你的连接 将失败。 如果你想要连接到某个不是默认虚拟主机的虚拟主机,则你需要在host中指定这个虚拟主机的名 字。如果这个服务器 正运行在你的本地计算机中,则你可以在URI中使用“localhost”作为主机名;这在应用程序开发期间通 常是最方便的方 法。 例如,下面的代码使用new NetConnection构造器创建了一个新的连接对象。然后,通过调用 my_nc.connect(),这个对象被 连接到这个服务器。 //创建一个新的连接对象 my_nc = new NetConnection(); //连接到位于Flash Media Server上的名为appName的应用程序的名为appInstance的实例 //这个Flash Media Server正运行于虚拟主机myServer.myDomain.com my_nc.connect("rtmp://myServer.myDomain.com/appName/appInstance"); 第二章Flash Media Server架构 Macromedia Flash Media Server 2平台由两部分构成:服务器和Macromedia Flash Player。建立在这个平 台的应用程序由一个 客户机Macromedia Flash应用程序(SWF文件),其在Flash Player中运行,以及一个与这个客户机进行通讯 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 12 -
  • 13. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 的服务器组件构成。 这个服务器组件至少包括一个你在运行着Flash Media Server的服务器上创建的应用程序文件夹。可选的, 这个文件夹可以包含 服务器端通讯ActionScript文件(ASC),以及由这个通讯应用程序使用的其他资源文件。 理解Flash Media Server架构 服务器和Flash客户机应用程序利用实时消息协议(RTMP)在一个持续的连接上进行通讯。在一个典 型的情况中,Web服 务器会经由HTTP把Flash客户机程序递送给Flash Player。然后,Flash客户机程序会利用RTMP建立一个与 Flash Media Server的持 续连接,允许一个不间断的数据流在客户机和服务器之间流动。 多个用户(Flash客户机)可以连接到运行在Flash Media Server上的同一个应用程序,在这种情况下, Flash Media Server充 当一个连接的用户之间的通讯信道。 注意:你也可以创建安全RTMPS连接。要获得更多信息,参看客户机端和服务器端ActionScript语言参 考的 NetConnection.connect()。 关于流和共享对象 在传统的客户机/服务器应用程序中,服务器通常被用于执行某些事务;客户机端发出一个请求,服务 器就会执行某个数据 库查询或某些基于资源的计算,然后把一个结果返回到客户机。客户机和服务器之间的连接仅被维持用来 完成这个事务所需的 那么长的时间。 尽管你可以使用Flash Media Server来执行事务,但它的核心应用是处理交互-协调多个连接的用户或客 户机的动作,及传送 服务器端的数据。Flash Media Server提供了两个通讯模块-流和共享对象-用来简化用户交互的处理过程。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 13 -
  • 14. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 理解流 流是一个时间基 (time-based) 的同步的音频、 视频和/或数据消息流, 这个流或是从客户机流向服务器, 或是从服务器流 向客户机。 流使用一个发布和订阅模块简化了使用流的应用程序的开发。 一个发布流可以被实时的播放 (比 如一个视频聊天应 用程序),或是被记录并在以后进行回放。 记录流可以被保存为Flash视频文件(FLV)。记录流可以包含数据消息,正如它可以包含视频那样。 你也可以利用第三方 的视频编码工具, 比如On2或Sorenson Squeeze, 从现有的数字视频或音频文件中创建FLV文件, 或是从Flash 中输出它们。通过 这种方式,你可以利用Flash Media Server流预先记录好的内容。 实时流 一个记录为FlashVideo(FLV)文件的流的回放 理解共享对象 当创建媒体应用程序时,你可以使用两种基本类型的共享对象:local(本地)和remote(远程)。 你可以把本地共享对象看作是“Flash版的cookie”: 它们可以让你把数据保存在一个用户的计算机中用于 离线访问,或是 用来保存用户偏爱。本地共享对象是Flash Player功能的一部分,不需要Flash Media Server的介入。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 14 -
  • 15. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com Flash Media Server管理远程共享对象(它持有文件)并提供消息、数据同步,以及数据存储服务。Flash 客户机连接或订阅 到一个远程共享对象,任何时候当共享对象发生改变时,客户机就会接收到更新。同样, 消息也会被发送给连接到一个远程共享对象的所有客户机。一个远程共享对象可以在应用程序会话间 维持,或只是临时存 在。 共享对象为客户机提供数据存储和同步服务 要获得有关共享对象是如何工作的更多信息,参看“理解共享对象流”、“共享对象类”,以及“关于共享 对象文件”。 关于连接到外部数据源 除了通过流和共享对象提供的通讯模块外,Flash Media Server也能够与外部数据源进行交互,这些外 部数据源可以是Web 服务、关系型数据库,或是其他的Flash Media Server应用程序。例如,你可以编写服务器端ActionScript来 连接到一个Web服务 (使用WebService类)或ColdFusion应用程序以检索一个名字和电话号码的列表,之后,查询结果可以被放 置到一个共享对象 中。要获得有关Web服务的更多信息,参看“关于Flash Media Server类”。 Flash Media Server与外部数据源的交互 Macromedia Flash Remoting是一个把你的媒体应用程序连接到J2EE应用程序服务器及Microsoft TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 15 -
  • 16. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com Windows .NET服务器的网 关。你可以从一个客户机端或服务器端脚本连接到Flash Remoting。Flash Remoting依靠它自己的被称为 NetService的ActionScript 库把Macromedia Flash应用程序链接到一个服务器端网关。 NetService API在Using Flash Remoting中进行了描 述,其作为一个PDF 文件在Macromedia的网站上可用。要获得有关Flash Media Server与Flash Remoting协同工作的更多信息,参 看Macromedia Flash Media Server开发者中心。 创建和部署应用程序的工作流程 你使用Flash创作工具来创建你的应用程序的客户机组件,这些组件是运行在Flash Player中的。Flash SWF提供了应用程序 的用户接口,同时也包含了用于连接到Flash Media Server及与Flash Media Server进行交互的ActionScript。 服务器组件至少由一个你在正运行着Flash Media Server的计算机上创建的应用程序文件夹构成。可选 的,这个文件夹可以 包含服务器端ActionScript(ASC)文件,这些ASC文件可以进行共享状态的控制,为在多用户之间仲裁实 时交互提供逻辑,或 是与外部源进行通讯,假如需要的话。 注意:可选的,你可以在应用程序文件夹中包含一个secure.asc或secure.js文件。这个文件会在任何其它 服务器端脚本文件 之前被自动装载,并可以让你实现安全系统调用。要获得更多信息,参看“强制Player Setting面板出现”。 你可以在Flash Professional、文本编辑器或JavaScript编辑器中编写ASC文件。 要部署一个应用程序,客户机和服务器端文件需要被发布到各自适当的位置。对于部署在Web上的应 用程序,客户机文件Flash应用程序(SWF文件)和任何必须的HTML包装代码-需要被发布到位于Web服务器上的一个目录。 注意:你可以通过在本地运行它们来测试SWF文件;要与Flash Media Server进行通讯,它们不必非来 自一个Web服务器。 服务器端文件,包含所有的ASC文件、记录的流(FLV)文件,以及其他服务器端资源文件,被发布 到你已经在服务器上 定义的已注册应用程序目录中。 如果你是一个管理员,你将可以使用管理控制台来配置Flash Media Server、建立系统安全、监视服务 器的启动、使用和停 止,以及添加用户。要获得有关Flash Media Server管理任务的更多信息,请看“管理Flash Media Server 理解应用程序流 这个部分中对Flash客户机是如何连接到服务器、共享对象是如何被访问的,以及远程方法可以怎样进 行调用进行了更详细 的解释。 当用户运行你的Flash SWF文件,并且这个SWF文件连接到了服务器时,服务器就会装载应用程序并创 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 16 -
  • 17. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 建这个应用程序的 实例,假如它还没有运行的话。服务器接受这个连接,并创建一个新的服务器端Client对象来代表服务器上 的客户机应用,并会 执行你已经提供的任何服务器端脚本。服务器端Client对象与客户机端NetConnection对象相对应, NetConnection对象用于连接到 服务器;这个Client对象只能经由服务器端脚本被访问。 客户机也会做它自己的工作,比如,初始化流、共享对象,等等。下面的部分更详细的描述了这一事 件的次序。 理解连接流 客户机连接到服务器,当应用程序被装载时,服务器会调用onAppStart(如果应用程序已经处于运行状 态,则onAppStart不 会被调用)。接下来,服务器端onConnect处理器会由一个新创建的Client对象调用。这个方法中的逻辑会决 定是要接受还是要 拒绝这个连接。回到客户机端,onStatus处理器被调用以报告这个连接是被接受了还是被拒绝了。当客户机 关闭连接时,服务器 端onDisconnect处理器会被调用。当这个应用程序被卸载时,onAppStop被调用。 要接受onConnect处理器中的连接,返回true或调用application.acceptConnection();要拒绝这个连接,返 回false或调用 application.rejectConnection()。如果true或false没有在onConnect处理器中被返回,则客户机会处于未决状态 直到acceptConnection ()或rejectConnection()被调用。 注意:只有客户机应用程序可以启动一个通讯会话。客户机和服务器二者都会发送和接收状态消息、 打开和关闭流、保存 和共享数据,以及终止网络连接。 调用远程方法 在成功连接之后,客户机可以调用由服务器组件定义的远程方法;服务器应用程序也可以远程调用在 Flash客户机应用程序 中定义的ActionScript方法。 从客户机端调用服务器方法 连接到一个服务器应用程序的每一个Flash应用程序都由一个Client对象作为代表,这个Client对象是服 务器端Client类的一个 实例。而每一个Client对象,都有与之关联的由开发者定义的方法,这些方法可以被远程访问。(你也可以 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 17 -
  • 18. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 使用prototype属性创 建可以为所有客户机所使用的远程方法。要获得这样的一个范例,请看《服务器端ActionScript语言参考》 中的Client类条目。 然后,一个Flash应用程序可以利用NetConnection.call()方法调用远程定义的方法,并可选的指定一个回 调对象来处理由服务 器返回的结果。在服务器上,与客户机调用相对应的方法会被调用,并且,一个结果会被返回到客户机。 下面的图示展示了从一个客户机调用一个服务器上定义的方法的范例。在这个图示中,客户机经由名 为nc的NetConnection 对象调用远程方法doThis。在这个例子中,这个doThis方法与一个名为clientObj的Client对象相关联,这个 clientObj就是这个客户 机的代表。 从客户机到服务器的远程方法调用流,结果被传回到客户机 下表列出了Flash Media Server客户机状态消息: NetStream.Failed和NetStream.Play.Failed信息对象还有一个description(描述)属性,该属性是一个字符 串,提供了失败的原 因。 NetStream.Play.Start和NetStream.Play.Failed信息对象还有一个details(详细信息)属性,该属性是一个 字符串,提供了被播 放的流的名字。这对于多个播放是有用的。当从播放列表中的一个元素切换到另一个元素时,这个details 属性能够显示流的名 字。 要获得有关远程调用服务器方法更多信息,请看《服务器端ActionScript语言参考》中的 Client.commandName条目。 从服务器调用客户端方法 从服务器调用客户机定义的方法的过程就像是上述过程的反过程。在客户机上,你可以把一个用户定 义的方法捆绑到用于 连接到服务器的NetConnection对象上。之后,这个方法可以由服务器利用Client.call()方法进行远程调用。 下面的图示展示了从服务器调用一个客户机方法的过程。 在这个图示中, 客户机端方法doThis与名为nc 的一个 NetConnection对象相关联。服务器利用Client.call()方法调用这个doThis方法。服务器端脚本可以可选的指定 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 18 -
  • 19. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 一个结果处理器对 象。再一次,客户机可以返回一个结果,当回调对象发送到客户机时,服务器的onResult处理器会被调用。 从服务器到客户机的调用流,结果被传回到服务器 下面的表格列出了Flash Media Server状态消息: NetStream.Failed和NetStream.Play.Failed信息对象还有一个description(描述)属性,该属性是一个字符 串,提供了失败的原 因。 NetStream.Play.Start和NetStream.Play.Failed信息对象还有一个details(详细信息)属性,该属性是一个 字符串,提供了被播 放的流的名字。这对于多个播放是有用的。当从播放列表中的一个元素切换到另一个元素时,这个details 属性能够显示流的名 字。 理解共享对象流 共享对象简化了开发者在多用户之间共享数据的任务。一个Flash客户机应用程序通过发布一个 SharedObject.getRemote()命 令订阅一个远程共享对象,SharedObject.getRemote()命令会返回一个对这个远程共享对象的引用。之后,客 户机发出一个 SharedObject.connect()命令把这个远程共享对象连接到服务器。调用SharedObject.connect()把SharedObject与 NetConnection对象 (该对象是一个连接,其作用是把数据发送到服务器以及从服务器接收数据)相关联,以便这个共享对象 可以把更新发送到服 务器以及从服务器接收更新。 在客户机连接到这个共享对象之后,服务器就会为这个共享对象发出一个同步消息,这个同步消息可 以被定义在客户机程 序中的SharedObject.onSync事件处理器处理。当客户机、服务器,或是其他的电影实例对这个共享对象作任 何改变时,这个服 务器就会再次为这个共享对象发出一个同步消息。 每一个同步消息都包含一个代码,这个代码指定了发生在共享对象上的改变的种类。依赖于情况的不 同,这个代码也会不 同。 例如, 当一个客户机首次连接到一个共享对象时, 伴随这个同步消息的代码会有一个clear值; 一个success TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 19 -
  • 20. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 值指出这个客户 机已经成功的修改了这个共享对象的内容。要获得有关代码及其描述的完整列表,请看《Flash Media Server 2客户机端 ActionScript语言参考》的SharedObject.onSync条目。 下面的图示展示了一种两个客户机-Client1和Client2-连接到同一个远程共享对象obj1的情形。 当每一个 客户机首次连接到这 个共享对象时,服务器会返回一个clear同步消息。之后,Client1修改了obj1的一个名为x的数据属性,把这 个属性的值设置成了 “”。 Client1接收到了一个success同步消息, 指出对这个共享对象的改变是成功的; Client2接受到了一个change 同步消息,指 出obj1共享对象已经被修改。 第三章使用通讯类 Macromedia Flash Media Server提供了两个应用程序编程接口(API):一个客户机端的API和一个服务 器端的API。本章解 释了客户机端类、服务器端类,以及从这些类创建的对象在通讯期间是如何搭档的。共享对象也会被讨论, 因为它们存储了在 用户间、应用程序实例间,以及应用程序间共享的应用程序和用户的信息。 在Flash Media Server类的核心概述之后,本章也阐述了关于实现一些类的重要信息,比如在优化 Application、Camera、 Microphone、NetStream、Stream、System,以及Video对象,连同保护Client对象和使你的NetConnection对 象更安全方面的建 议。 关于Flash Media Server类 客户机端API提供了下列类: Camera、 Microphone、 NetConnection、 NetStream、 SharedObject, 以及Video。 要获得有关使用 这些类的更多信息,请看《Flash Media Server 2客户机端ActionScript语言参考》。服务器端API提供了下列 类:Application、 Client、 File、 LoadVars、 NetConnection、 SharedObject、 Stream、 WebService、 XML、 XMLSocket、 XMLStreams。 要获得有关使 用这些类的更多信息,请看《服务器端ActionScript语言参考》。 有些类在两个API中拥有相同的名字,比如NetConnection。但不管怎么说,名字相同的一个客户机端类 和一个服务器端类 并不提供相同的功能。此外,一些客户机端类有服务器端副本,但另一些则没有。下面的部分简要的描述 了每一种客户机端类 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 20 -
  • 21. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 和服务器端类,然后解释了要进行客户机/服务器通讯,这些类中的一些是如何协同工作的。 关于客户机端类 这些类仅被用于客户机端ActionScript中。 Camera类 客户机端Camera类可以让你捕获来自捆绑在任何运行Macromedia Flash Player的计算机上 的摄像头中的视频。当 与Flash Media Server一起使用时,这个类可以让你传送、显示,以及可选的记录被捕获的视频。利用这些 能力,你可以开发出 诸如视频会议、视频实时消息这样的通讯应用程序。 Microphone类 客户机端Microphone类可以让你捕获来自捆绑在任何运行Flash Player的计算机上的麦 克风的音频。当与Flash Media Server一起使用时,这个类可以让你传送、播放,以及可选的记录被捕获的音频。利用这些能力,你 可以开发出诸如音频 实时消息、录制演示文稿以便其他人可以在日后回放它们等等这样的应用。 你也可以单使用一个Microphone对象而不结合服务器-例如,在你的本地系统中经由扬声器传送来自你 的麦克风的声音。 NetConnection类 客户机端NetConnection类允许Flash客户机在Flash Media Server上打开一个TCP套接 字,以便利用实时消 息协议(RTMP)进行连续的数据交换。你也可以使用NetConnection类连接到一个应用程序服务器,但本章 所关注的焦点是利 用NetConnection类与Flash Media Server进行通讯。 NetStream类 通过由一个客户机端NetConection对象建立的连接,客户机端NetStream类打开了一个在 Flash Player和Flash Media Server之间的一路(one-way)流连接。一个NetStream对象就像是位于NetConnection中的一个信道; 这个信道可以利用 NetStream.publish()方法发布音频、视频和数据,也可以利用NetStream.play()方法订阅一个流并接收数据。 你可以发布或播放实 况(实时)数据及回放先前记录的数据。多个客户机可以播放同一个给定的流,但同一时刻一个流只能有 一个发布者。要获得 有关在服务器上的流的创建和存储,请看“编码约定”。 SharedObject类 客户机端local共享对象可以让你在一个用户的计算机上存储信息,比如一个游戏中的 最高比分,这些信息 可以在日后由运行在这台计算机上的同一个应用程序或一个不同的应用程序所使用。要获得有关local共享 对象的更多信息,请 看“理解共享对象”。 Video类 客户机端Video类可以让你在舞台上显示流视频。要显示一个通过使用NetStream.play()或 Camera.get()命令被播放或 捕获的视频馈送,你需要在舞台上放置一个Video对象,并使用Video.attachVideo()方法将馈送捆绑到这个对 象。 要在Flash中于舞台上放置一个Video对象: 1. 在Flash中,如果库面板没有显示的话,选择“窗口-> 库”打开库面板。 2. 通过在库面板的选项菜单中选择“新建视频”把一个嵌入的视频对象添加到库中。 3. 从库中把这个新建的嵌入的视频对象的一个实例拖放到舞台中,并使用特性面板赋予这个实例一 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 21 -
  • 22. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 个唯一的名字。 关于服务器端类 这些类仅被用于服务器端ActionScript中。 Application类 服务器端Application类可以让你创建包含有关一个Flash Media Server应用程序实例信息 的对象;这个对象会 一直维持直至该应用程序实例被卸载。 Application类允许你接受或拒绝客户机连接尝试、 注册或注销类和代 理,以及创建当一个 应用程序启动或停止,或是当一个客户端连接或断开连接时要调用的函数。 Client类 服务器端Client类可以让你创建描述了每一个用户的至一个Flash Media Server应用程序实例 的连接的对象。这个 Client对象可以接收由一个客户机端NetConnection.call()命令发出的消息,并可以调用客户机端 NetConnection对象的方法。你可 以使用Client对象的属性来确定每一个客户机的版本、平台和IP地址。利用Client类,你也可以单独设置不同 的应用程序资源-比 如Stream对象和SharedObject对象-的读写权限。要获得更多信息,请看“实现动态访问控制”。 File类 服务器端File类可以让应用程序写入服务器的文件系统。 LoadVars类 服务器端LoadVars类可以让你从远程或本地位置把变量装入一个服务器端脚本。 NetConnection类 服务器端NetConnection类可以让你在一个Flash Media Server应用程序实例和一个应 用程序服务器、另一 个Flash Media Server,或同一台服务器上的另一个Flash Media Server应用程序实例之间创建一个双路连接。 你也可以使用服务 器端NetConnection对象创建更强大的应用程序;例如,你可以从一个应用程序服务器获得天气信息,或是 共享由其他Flash Media Server或应用程序实例装载的某个应用程序。 利用NetConnection对象,你可以连接到一个应用程序服务器,使用标准协议(比如HTTP)进行服务器 对服务器的交互,或 是连接到另一个Flash Media Server,使用Macromedia实时消息协议(RTMP)共享音频、视频和数据。 你可以将Macromedia Flash Remoting与Flash Media Server相结合来与诸如Macromedia ColdFusion、.NET,以及J2EE服务器这 样的应用程序服务器进行通讯。要获得更多信息,请访问Macromedia网站上的Flash Remoting信息。 SharedObject类服务器端共享对象可以让你与客户机端共享对象及与其他Flash Media Server上的对象 进行通讯。 Stream类 服务器端Stream类可以让你处理一个Flash Media Server应用程序中的每一个流。当 NetStream.play()或 NetStream.publish()方法在一个客户机端脚本中被调用时,Flash Media Server会自动创建一个Stream对象。 你也可以通过调用 Stream.get()方法在服务器端ActionScript中创建一个流。一个用户可以在同一时间访问多个流,并且,在同 一时间可以有多个 Stream对象处于活动状态。 WebService类 服务器端WebService类可以让你创建和访问一个WSDL/SOAP Web服务。下列服务器端 类是配合WebService 类使用的:Log类、SOAPFault类,以及SOAPCall类。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 22 -
  • 23. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com XML类 服务器端XML类可以让你装载、解析、发送、建立,以及操作XML文档树。 XMLSocket类 服务器端XMLSocket类实现客户机套接字,它可以让Flash Player与一个由IP地址或域名 指定的服务器进行通 讯。 XMLStreams类 服务器端XMLStreams类是XMLSocket类的一个变种-它具有相同的方法、属性,以及 事件,但它是以片段 来传输和接收数据。 关于客户机-服务器的通讯 下面的“对象对”描述了你可以在客户机端和服务器端对象间建立的潜在的连接。例如,当一个客户机 端NetConnection对 象连接到服务器时,一个服务器端Client对象就会被创建;之后,这个Client对象可以调用其NetConnection 对象配对物的方法。 下面的表格展示了彼此关联的客户机端和服务器端对象。 理解共享对象 共享对象是一种在不同的客户机之间,以及运行在Flash Media Server上的一个应用程序的不同实例间, 甚至是运行在多个 Flash Media Server上的跨应用程序的共享数据的手段。 Flash Media Server支持三种类型的共享对象-local (本 地)、remote(远 程),以及server-side(服务器端)。这些对象会在下面进行简要的讨论。要获得有关使用共享对象的更多 信息,请看“关于共 享对象文件”。 关于Local共享对象 使用共享对象的一种方法是本地的数据存储和获取。数据被存储在终端用户的计算机里,并可以在一 个不同的时间里由一 个或更多的Flash应用程序所访问。Local共享对象也可以是非永久性的-换句话说,只有当这个应用程序正 在运行时才是可用 的。 Local共享对象不需要连接到Flash Media Server,本手册中也不打算进行过多的讨论。要获得有关永久 性local共享对象数据 被存储在何处的内容,请看“关于共享对象文件”。要获得有关local共享对象的更多信息,请看《Flash Media Server 2客户机端 ActionScript语言参考》的SharedObject.getLocal()条目。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 23 -
  • 24. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 关于Remote共享对象 使用客户机端ActionScript,你可以创建和引用对运行在同一或不同客户机上的其他Flash Media Server 应用程序实例可用的 共享对象。 同local共享对象一样, 这些remote共享对象也可以永久性的存在于本地计算机上。 但不管怎么说, remote共享对象也 可以维持在服务器上,以便任何连接到这个共享对象的用户都可以访问到同样的信息。 例如,你可以打开一个remote共享对象,比如一个电话列表,它维持在服务器上。任何当一个客户机对 共享对象作了任何 改变,则这个修改过的数据对于当前或以后连接到这个对象的所有客户机而言都是可用的。如果这个对象 也被维持在本地,且 一个客户机在未连接到服务器的情况下改变了这个数据,则下次当这个客户机连接到服务器时,这些改变 将会与remote共享对 象同步。 在所有这些种类的共享对象中,你最经常在你的Flash Media Server应用程序中使用的可能就是remote 共享对象了。要获得 有关永久性remote共享对象数据被存储在哪里的信息,请看“关于共享对象文件”。要获得有关remote共享对 象的更多信息, 请看《Flash Media Server 2客户机端ActionScript语言参考》的SharedObject.getRemote()条目。 关于代理共享对象 一个代理共享对象是一个remote共享对象, 但代替在一个客户机和服务器应用程序之间被共享, 代理共 享对象是在两个不 同的Flash Media Server应用程序,或是在同一个应用程序的不同实例间被共享的。例如,考虑同一个聊天 应用程序的两个实 例,/chat_01和/chat_02。在服务器上,/chat_01应用程序实例可以连接到在/chat_02中定义的一个共享对象, 并使用那个共享对 象中的信息,就好像那个共享对象是被定义在/chat_01中一样。 要获得有关代理共享对象的更多信息,请看《服务器端ActionScript语言参考》中的SharedObject.get() 条目。 关于Application类 Application类可以让你接受和拒绝客户机连接尝试、 注册和注销类和代理, 以及创建当一个应用程序启 动或停止时,或当一 个客户机连接或中断连接时要被调用的函数。这个部分包含了有关建立application.OnConnect和 application.OnDisconnect函数的忠 告, 以及在使用媒体组件的应用程序中使用Application.onConnectAccept和Application.onConnectReject函数。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 24 -
  • 25. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 要获得有关Application类的更多信息,参看《服务器端ActionScript语言参考》的Application类条目。 使用application.onConnect处理器 当一个客户机调用NetConnection.connect()方法时,application.onConnect事件处理器会在服务器上被调 用。这个处理器会被 自动地传递以一个对一个服务器端Client对象的引用,这个服务器端Client对象描述了这个正试图连接的客 户机,以及任何由开 发者定义的传递给NetConnection.onConnect处理器的参数。 当你希望基于用户的登录信息建立不同的方法时,在一个被指派给application.onConnect处理器的函数 中建立方法是一个好 主意。但不管怎么说,如果你想要建立一个对所有客户机都可用的方法,你就应该使用Client对象的 ActionScript 1.0中的 prototype属性,就像下面的例子这样: //一个用户连接了 application.onConnect = function( newClient, userName ) { if (userName == "admin") { if (userName == "admin") { newClient.adminFunc= function(param) { //某些代码仅对admin才是有用的 newClient.myAdminProperty = param; } } else { //针对绝大多数情况的代码 } //允许登录 application.acceptConnection( newClient ); } //这个部分可以存在于一个单独的文件中 //由于“prototype”的工作方式,每一个客户端(包括admin)都将拥有这个功能。 Client.prototype.commonFunction = function (myColor) { //一些代码 //代替newClient,使用this来引用客户端。 this.color = myColor; TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 25 -
  • 26. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com } 同样,如果你希望在正进行连接的Client对象上使用call()方法,则应确信你调用 application.acceptConnection(),并知道在发 出任何额外的命令前这个客户机已经连接了。下面的代码建立了这一系列动作: application.onConnect = function(clientObj,name,passwd) { //首次接受连接 application.acceptConnection(clientObj); //在客户机被注册于这个应用程序实例之后,你可以使用"call"方法。 clientObj.call("onWelcome", "You are now connected!!!"); return; //一旦你在onConnect中调用acceptConnection()或rejectConnection(), //则返回值就被忽略了。 } 技巧:如果你正在使用组件,请看“在一个基于组件的应用程序中处理事件”。 利用application.onDisconnect处理器 当一个客户机中断与应用程序的连接时,服务器会调用application.onDisconnect处理器。你可以为这个 处理器添加代码,这 些代码会向所有其他客户机通告关于这个事件的消息,就像下面的例子所展示的这样: //在服务器端,你可以包含下面这些内容: application.onConnect = function(newClient, name) { newClient.name = name; return true; } application.onDisconnect = function(client) { for (var i = 0; i < application.clients.length; i++) { application.clients[i].call("userDisconnects", client,name); } } //在客户端,你可以包含下面这些内容: nc = new NetConnection(); nc.userDisconnects= function (name) { trace(name + "quits"); } nc.connect ("rtmp:/app_name", userName); 技巧:如果你使用组件,请参看“在基于组件的应用程序中处理事件”。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 26 -
  • 27. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 在基于组件的应用程序中处理事件 当你开发应用程序时,清楚明白的理解有关onConnectAccept和onConnectReject事件的组件介绍是很有 好处的。你需要包含 代码来处理这些事件。当你使用组件时,你必须在你的服务器端代码中修改application.onConnect语句以包 含 application.onConnectAccept和application.onConnectReject事件处理器。 你的onConnect处理器的 (执行顺序中 的)最后一行应该 是application.acceptConnection()或application.rejectConnection()之一。 如果你的应用程序需要额外的代码跟在 显式 acceptConnection()或rejectConnection()方法之后的话,比如一条指出用户已经被授予或拒绝了对应用程序的 权限的消息,你可以 在application.onConnectAccept或application.onConnectReject语句中放置相应的代码。 技巧:如果你不是正在使用媒体组件的话,则你不能使用application.onConnectAccept和 application.onConnectReject。 每一个组件可以有它自己的application.onConnect方法。通过使用onConnectAccept和onConnectReject, 你可以定制一个组件 或是创建一个新的组件以实现身份验证;例如,一个组件中的代码可以查询一个数据库,并根据数据库中 的用户名和密码来决 定是该接受还是该拒绝某个用户。 要获得有关application.onConnectAccept和application.onConnectReject的更多信息,请看《服务器端 ActionScript语言参考》。 Camera类 这个部分中包含的建议将有助于你优化对Camera类的使用, 本部分中也包含了在记录之后关闭摄像头、 将摄像头设置成适 用于带宽,及在多个应用程序中使用同一个摄像头的技巧。 关闭摄像头 如果你的应用程序使用一个捆绑在一个NetStream对象上Camera对象来记录数据的话,则在你完成记录 后这个摄像头会继续 维持原先的状态。要在记录之后关闭摄像头,使用NetStream.attachVideo(false)方法。 针对不同的带宽速度的设置建议 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 27 -
  • 28. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 默认的摄像头设置为所有的带宽设置提供了一个不错的视觉体验。但不管怎么说,你可以试验一下对 不同的带宽使用不同 的设置是种什么感觉。 用于设置带宽速度的代码如下所示: my_cam = Camera.get(); my_cam.setQuality(bandwidthSpeed,quality) 如果你想要在不同的带宽速度下测试摄像头设置的话,可以从下表格开始你的试验。 带宽 效果 代码 Modem 更低的图像质量,更高的运动质量 my_cam.setQuality(4000,0) 更高的图像质量,更低的运动质量 my_cam.setQuality(0,65) DSL 更低的图像质量,更高的运动质量 my_cam.setQuality(12000,0) 更高的图像质量,更低的运动质量 my_cam.setQuality(0,90) LAN 更低的图像质量,更高的运动质量 my_cam.setQuality(400000,0) 更高的图像质量,更低的运动质量 my_cam.setQuality(0,100) 在多个应用程序中使用同一个摄像头 在同一时刻,多个应用程序(SWF文件)可以使用同一个摄像头,如果这些应用程序正运行于同一个 进程中的话。通常情 况下,多个浏览器窗口都为位于同一个进程中的,因此,在浏览器环境中这一功能可以工作的很好。 但不管怎么说,一个摄像头不能在运行于两个不同的进程中的应用程序间共享。这样的情况可以是一 个应用程序运行于浏 览器中,另一个应用程序运行于独立的播放器中。 Client类 当在服务器端脚本中将方法捆绑到Client对象时,请记住,在这个client对象中的所有方法都可以由客户 机的SWF文件中的一 个脚本进行调用。你不应该在这个Client对象中包含任何你不希望被某台远程计算机调用的方法。例如,你 不会希望一个客户机 能够调用一个方法来中断一个应用程序的连接。 Microphone类 这个部分包含的建议将有助于你优化对Microphone类的使用,同时也包含了消除音频反馈(啸叫)的 技巧。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 28 -
  • 29. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 消除音频反馈 如果你正配合一个外部扬声器来使用一个麦克风,并恰好配置了一个高增益的话,则你将很有可能会 招致音频反馈问题。 为了减小来自扬声器的反馈,Flash Media Server使用了回声抑制,你可以通过使用下列命令来实现回声抑 制: my_mic.useEchoSuppression(true); 这将维持一个适当的输入级,而不会过量的传输来自你的扬声器的回声。 由于回声抑制只是从用户的输入中剔除了一部分输出信号,因此,如果你的麦克风距离你的扬声器太 近的话,你将仍然可 能会听到啸叫。为了避免反馈,尝试下面这些指导: 调低你的扬声器的音量。 把麦克风移的离扬声器更远些。 检查你的硬件设置对其进行适当的安装和设置。 使用耳机。 保持麦克风打开 为了节省带宽,在其没有被使用的情况下,Flash Media Server默认会关闭麦克风。但不管怎么说,你 可能希望它在你的应 用程序中保持打开的状态-例如,为了确保在麦克风处于激活状态时没有任何延迟。要做到这点,使用命令 my_mic.setSilenceLevel(0)。 NetConnnection类(客户机端) 如果一个包含了一个Flash应用程序(SWF文件)的HTML页面以一个与这个SWF文件用来访问Flash Media Server的域名不 同的域名被访问的话,则这个至Flash Media Server的连接将不会成功。这是Flash Player的一种安全机制。 但在某些情况下,这 可能会导致一些不必要的麻烦。 例如,如果一个网页包含了一个Flash应用程序,这个Flash应用程序位于一个来自 http://deptserver.mycorp.com的企业内部 网,则这个网页也可以通过简单的http://deptserver被访问。然而,如果这个页面经由 http://deptServer/tcpage.htm被访问,但这个 SWF文件在NetConnection.connect()方法中指定deptServer.mycorp.com作为targetURI参数的话,则这个SWF 文件将无法成功的连 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 29 -
  • 30. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 接到Flash Media Server。 类似的, 如果这个网页和SWF文件从http://deptserver.mycorp.com/tcpage.htm被访问, 但这个SWF文件 使用URL rtmp://deptserver作为targetURI参数的话,则这个SWF将无法连接到服务器。 要避免由这一安全政策所带来的不方便,你或你的用户是有几件事情可做的。最容易的方法就是不要 在targetURI中包含一 个服务器名称。 (这只适用于Flash Media Server和Web服务器都运行于同一台计算机上的情况。)要做到这 点,摒弃targetURI 中的第二个斜杠。例如,下面的命令将使Flash Player试图连接到与提供SWF文件的Web服务器相同的主机 和域名。 nc = new NetConnection(); nc.connect("rtmp:/myApp"); 避免安全问题的另一个方法是在你的HTML页面中使用一小段JavaScript代码。假定这个SWF文件使用 一个完全限定域名 URL来访问Flash Media Server,则这个JavaScript会把这个网页重定向到一个显式命名的完整的URL,就像 下面这样: <SCRIPT language="javascript"> //如果这个URL没有域的话 if (document.URL.indexOf("mycorp.com") == -1) { //重定向到有域的版本 document.URL="http://deptServer.mycorp.com/tcpage.htm"; } </script> 最后,如果你拥有一个域名,拥有对这个域名的DNS记录的访问权,并且有一个用于你的Flash Media Server的静态IP地址 的话,则你可以创建一个地址(“A”)记录把一个主机名指向那个IP地址。例如,flashcom.mycorp.com可以 映射到运行Flash Media Server的计算机, 并且拥有一个由你的IT部门或ISP提供的IP地址。 你的网页可以继续被宿主在你当前 正使用着的无论什 么东西上。(如果你需要转向到一个有一个可访问的DNS主机名但可能有也可能没有一个静态IP地址的服 务器的话,则推荐你 使用“CNAME”记录。) NetStream类 这个部分包含的建议有助于你优化对NetStream类的使用,同时也包含了有关把数据合并到一个流中、 管理一个流的缓冲 器,以及当一个流完成回放时执行代码的技巧。 在一个流中使用多种数据类型 在一个流中使用多种数据类型 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 30 -
  • 31. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 除了流音频和视频外,你还可以在一个流中包含数据,比如一个文本消息。要把多种数据类型添加到 一个流中,使用下面 的方法: NetStream.send() 用ActionScript得到流的时长 如果你正在缓存你的流,你可以使用NetStream.bufferLength属性来得到缓冲器中当前的秒数。但不管 怎么说,一些时候, 你可能希望得到一个流的总的时长。在这种情况下,Flash Player无法知道流的长度,但Flash Media Server 知道;服务器拥有一 个Stream.length属性,客户机可以经由一个发送给服务器的消息来请求这个属性。 你可以像下面这样使用客户机端ActionScript来请求流的长度: function getInfo() { nc.call("sendInfo", new MyResultSetName(), myStream); } function MyResultSetName() { this.onResult = function(retVal) { _root.streamlength = retVal; }; this.onStatus = function(info) { trace("Level: " + info.level + " Code: " + info.code); //处理错误对象 }; } 然后,在相应的服务器端ActionScript中,你应该在main.asc文件中编写下面的代码: application.onAppStart = function() { trace("::: 应用程序已经启动:::"); application.onConnect = function(client) { application.acceptConnection(client); //添加方法 client.prototype.sendInfo = function(name) { var slen = Stream.length(name); trace("slen: " + slen); return slen; }; } TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 31 -
  • 32. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 关于缓冲一个流 对于回放流而言, 由NetStream.bufferTime属性返回的值指定了在Flash Player可以开始回放它之前, Flash Media Server将缓 冲多少流。例如,如果你的记录流是秒长,并且你的回放速度是你的下载速度的两倍的话,则你可能会考 虑将这个值设置为 秒。这样,你将能够流畅的播放整个流而不会遭遇停顿。 对于发布流而言,这个值指定了在Flash Player考虑停止消息前这个流出队列可以成长到多长。要确定 有多少数据正在当前 队列中,使用NetStream.bufferLength。对于一个快速连接来说,由NetStream.bufferLength返回的值将永远也 不会逼近 NetStream.bufferTime的值,但在一个慢速连接中,这是可能的。 因此,如果你知道你的应用程序正运行在一个慢速连接上,并且你希望将停止消息或停止回放减到最 少的话,你可能会希 望使用NetStream.setBufferTime()方法来增加NetStream.bufferTime的值。 关于一个流的播放状态 当一个NetStream对象完成一个流的播放时,NetStream.onPlayStatus事件处理器会被调用。当一个 NetStream对象从一个播放 列表中的一个流切换到另一个流(NetStream.Play.Switch),或是当一个NetStream对象播放到末尾时 (NetStream.Play.Complete),传递给回调函数的信息对象会提供额外的信息。如果你希望响应这个事件处 理器,则你必须创建 一个函数来处理由服务器发送的信息对象。 SharedObject类 共享对象可以被用于多种目的,并且可以以多种方式被设计和使用。这个部分提供了一些项目,这些 项目可以被视为你在 你的应用程序中利用共享对象的开始。 关于同步共享对象 在试图使用一个remote共享对象之前,你应该首先检查SharedObject.connect()方法是否返回了true,这 个true指出了一个成 功的连接, 然后你应该等待直到你接收到了来自你已经分配给SharedObject.onSync处理器的函数的结果。 如 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 32 -
  • 33. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 果你失败于上面所 描述的,则你在本地-在SharedObject.onSync被调用之前-对对象所作的一切改变都将被丢弃。 当remote共享对象的任何SharedObject.data属性被改变时,SharedObject.onSync处理器会被调用。当一 个客户机首次使用 SharedObject.getRemote()命令连接到一个remote共享对象-这个remote共享对象维持在本地或服务器上-时, 这个处理器也会被调 用。在后一种情况中,这个对象的所有属性都会被设置为空字符串,并且SharedObject.onSync会以code属性 的值被设置为 “clear”被调用。之后,SharedObject.onSync再次被调用,这次code的值被设置为“change”,并且remote共享 对象的客户机实 例的属性将被设置为与服务器上的那些相同。 如果你在理解你的共享对象的行为举止上有问题,那么,把一些调试代码放置在你的 SharedObject.onSync处理器中将对你 有所帮助,就像下面的例子中所展示的这样: my_so.onSync = function(list) { for (var k in list) { trace("name = " + list[k].name + ", event = " + list[k].code); } //你可以在这里做你想要做的任何其他事情 } 利用共享对象进行有效的跟踪 是该把共享对象数据封装到一个单独的插槽(SharedObject.data属性)中,还是把它延伸到多个插槽中 在一定程度上依赖于 你的应用程序是如何对对象进行改变的。例如,如果你的应用程序需要按指定的时间间隔把一个完整的字 符串数组发送给所有 连接的客户机,则你可以把整个数组存储在一个单独的插槽中。 另一方面,如果你的应用程序仅需要发送那些被改变的信息的话,则你应该把数据划分到多个插槽中。 这种实现会减少网 络传输量并因此能够提升你的应用程序的性能。由于多个插槽可以被同时更新而不会出现数据冲突,这也 使得冲突解决代码的 需求量做到了最少。 刷新remote共享对象 当所有的用户都断开了与共享对象的连接,或是当服务器关闭时,Flash Media Server会自动在客户机 和服务器上将remote 共享对象写入到磁盘。在任何其他的时间里,如果你想要使共享对象在磁盘上被更新,则你必须调用客户 机端 SharedObject.flush()方法。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 33 -
  • 34. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 但不管怎么说,在客户机端ActionScript中调用SharedObject.flush()仅仅只是刷新了共享对象的本地版 本。要手工刷新共享对 象的服务器端拷贝,你必须在一个服务器端脚本中调用SharedObject.flush(),就像下面这样: //用于将一个永久共享对象刷新到服务器的服务器端范例代码 //当应用程序被装载时得到共享对象。 application.onAppStart = function() { application.mySO = SharedObject.get("SharedObjName", true); } //当一个用户断开连接时刷新共享对象。 application.onDisconnect = function(client) { application.mySO.flush(); } 避免共享对象的同步问题 如果在同一时刻有不止一个客户机(或服务器应用程序)可以改变你的共享对象中的某个单独插槽中 的数据,则你必须实 现一个冲突解决策略。下面的例子描述了几种策略: 使用不同的插槽 最简单的策略是为可能改变对象中数据的每一个用户使用一个不同的插槽。例如,在 一个对聊天室中的 用户保持跟踪的共享对象中,为每一个用户提供一个插槽,并使用户只能修改他们自己的插槽。 分配一个拥有者 一个更复杂的策略是在一个有限的时间周期内把一个单独的用户定义成一个共享对 象的某个属性的拥有 者。 你可以通过编写服务器代码来创建一个“锁定”对象, 一个客户机可以在这个“锁定”对象中请求一个插槽 的所有权。如 果服务器报告这个请求是成功的,则这个客户机就会知道它将是改变这个共享对象中的数据的唯一的客户 机。 后面跟随的例子是一个服务器端ActionScript,其作用是锁定和解锁一个共享对象,以确保真正的最高 分被返回到游戏。假 定最近的最高分是,而玩家的分数增加到了,与此同时,玩家的分数增加到了。如果没有锁定发生的话, 则两个玩 家的分数都可以与最近的最高分进行比较,如果两个客户机同时调用updateHighScore的话,则一个冲突就 会发生。你会希望 确保每一个玩家都与最高分进行比较,不管这个最高分是最近的最高分还是任何来自所有其他客户机的当 前分数。如果你锁定 和解锁用于存储最高分的共享对象的话,则你就可以顺序的比较每一个分数,并因此保证了不会丢失任何 比较。 application.onAppStart = function() { application.scoreSO = SharedObject.get("high_score_so", true); application.scoreSO.onSync = function(listVal) { trace("got an onSync on scoreSO"); TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 34 -
  • 35. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com } } application.onConnect = function(newClient,name,passwd) { newClient.updateHighScore = function(final_score) { application.scoreSO.lock(); if (application.scoreSO.getProperty("high_score_so") < final_score) { application.scoreSO.setProperty("high_score_so", final_score); } application.scoreSO.unlock(); } } 通告客户机当服务器拒绝一个对共享对象的某个属性的客户机改变请求时, SharedObject.onSync事件处 理器通告这个客户 机改变已经被拒绝。因此,一个应用程序可以提供一个用户接口来让用户决定这个冲突。如果数据的改变 很少发生的话,则这 种技术会工作的很好,比如一个共享地址簿。如果一个同步冲突发生的话,用户可以决定是否该接受或是 拒绝这个改变。 接受某些改变并拒绝另一些改变一些应用程序可以在一个“先来先服务”的基础上接受改变。当用户可 以通过重新提交 改变(如果某些其他人的改变先于他们的话)来解决冲突时这种方式会工作的最好。 使用send方法来提高你在控制改变对象方面的水平代替完全依赖于SharedObject.onSync来管理同步活 动,你可以在适当 的时候使用SharedObject.send()命令。SharedObject.send()命令会向连接到一个remote共享对象的所有客户机 广播一条消息,包括 发送这个消息的客户机。 Stream类 如果你想要删除与一个记录流关联的FLV和IDX文件,你必须像下面这样使用服务器端代码: s = Stream.get("foo"); if (s) { s.clear(); } System类 Macromedia Flash Media Server以UTF-8格式发送文本。如果你在你的ActionScript代码中把 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 35 -
  • 36. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com System.useCodepage设置为true的 话,则你的媒体应用程序可能无法正常工作。值true将导致Flash Player把所有的文本都视为基于终端用户的 代码页,就像在 Flash Player的早期版本中那样。但不管怎么说,Flash Player将依然会发送UTF-8编码的文本到Flash Media Server,并且所有从这 个服务器接收的文本也都是UTF-8编码的。在一个Flash Media Server应用程序中设置 System.useCodepage=true将很可能会导致不 可预期的行为并产生的巨大的阻碍。例如,文本可能无法适当的发送到服务器和从服务器接收。要获得有 关 System.useCodepage的更多信息,请参看《ActionScript 2.0语言参考》或Macromedia网站的文章“Unicode in Macromedia Flash”。 关于Video类 这个部分包含了有助于你优化对Video类的使用,同时也包含了有关动态创建Video对象的技巧。 关于动态创建Video对象 你只能从Flash创作环境中把Video对象添加到你的应用程序中, 方法是通过把一个嵌入的视频对象从库 中拖放到舞台中。但 不管怎么说,如果你想要从你的ActionScript代码中实现视频对象的话,你可以通过把它们嵌入到一个影片 剪辑中来做到这点。 这个技巧可以让你利用duplicateMovieClip()和removeMovieClip()方法来动态的创建和删除视频对象。 理解帧速率 如果你在一个静态SWF文件的一个Flash应用程序中嵌入了一个FLV文件的话,则其帧速率将与时间线 中帧的回放速率相 同。 当你流一个FLV中的数据时, 经由Flash Media Server的视频播放可以有一个与包含它的SWF不同的帧速 率。 例如,假定你使用另一个应用程序以fps的帧速率来输出一个宽带FLV文件。如果你把这个FLV文件引 入到一个fps的 Flash应用程序(SWF文件)中,则这个视频将不会同步,因为两个帧速率是不同的。但不管怎么说,如果 你使用Flash Media Server把这个FLV流入到与前述同样的一个fps SWF文件中,则它将被同步到fps,因为流文件不使用基于帧 的回放。 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 36 -
  • 37. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 第四章使用媒体文件 Macromedia Flash Media Server可以让你呈递多种多样的媒体体验。本章包括了有关创建实时Web事件 广播、为个别的客户 机定制流的呈递,以及MP3的发布和回放。 使用视频 Flash Media Server可以让你把实时和记录的视频流入Flash Player客户机。一些功能使得Flash Media Server在视频呈递方面变 得非常强大。 通过均衡服务器的负载,边缘服务器(edge server)让你可以创建大规模的实时Web事件。 定制流呈递让你可以把客户机们作为一个个的个体来对待。你可以基于Flash Player版本来呈递流。使 用一点额外的代码, 你也可以基于客户机的带宽来呈递流。 关于创建实时Web事件 Flash Media Server应用程序客户机可以把一个实时视频流发布到服务器,而多个客户机也可以订阅广 播的流。这让你可以 创建实时Web事件。 如果你需要控制大规模的实时Web事件,有数量很大的订阅者接受这个实时广播,则订阅者们可以经 由边缘服务器(Edge Server)连接到这个实时流。一个边缘服务器管理自一个源服务器的数据流量,以便这个源服务器可以向数 量极大的客户们进 行广播。要获得有关边缘服务器的更多信息,请参看《使用Flash Media Server边缘服务器》。 定制流的呈递 你可以使用Flash Media Server的定制流呈递功能通过为不同的客户机提供同一个流的不同版本来使每 TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 37 -
  • 38. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 一个客户机都能得到 最佳的流体验。例如,你可以为使用Flash Player 7的客户机提供用Sorenson Spark编解码器编码的视频,为 使用Flash Player 8的 客户机提供用On2 VP6编解码器编码的视频。你也可以基于客户机的带宽提供以不同比特(bit)率编码的 视频。 Flash Media Server有两个相互配合的功能可以让你呈递定制的流:虚拟目录和虚拟键。 你可以在Flash Media Server中创建多个目录并在每一个目录中存储同一视频内容的不同版本(例如, 一个以不同编解码器 编码或以不同比特率编码的视频)。连接到Flash Media Server的每一个客户机都被赋予一个虚拟键(存储 在服务器端 Client.virtualKey属性中)。默认情况下,虚拟键是基于客户机的Flash Player版本值的。在vhost.xml配置文 件中,你可以在文件 的VirtualKeys和VirtualDirectory部分中把这些键映射到目录以为每一个客户机呈递定制的内容。 要基于带宽 来定制流的呈递,你 必须在一个脚本中检测客户机的带宽并据此来改变客户机的键。 你可以直接在vhost.xml文件中设置键和目录值,或者你也可以使用服务器端ActionScript (Client.virtualKey属性和 Stream.setVirtualPath()方法)来设置这些值。在你在vhost.xml文件中建立起这种映射后,每一个连接的客户 机就会自动地被提供 以适当的视频内容。 要获得有关vhost.xml配置文件的更多信息,参看《管理Flash Media Server》中的“Vhost.xml文件”。 基于Flash Player版本来呈递视频 Flash Media Server可以编码和呈递On2 V6和Sorenson Spark编码的视频。Flash Player 8支持这两种编解 码器;Flash Player 7 及更早的版本仅支持Sorenson Spark编解码器。你可以在服务器上创建虚拟目录以便分别以两种格式存储视 频流的拷贝;这可以 让你给使用Flash Player 8的客户们呈递最高质量的内容。 考虑下面的例子:一个用户想要播放一个流,Flash Player 8已经安装在他们的计算机中。Flash Player 8 具有播放On2视频的 能力。Flash Media Server请求HappyStream.flv文件。在联络上服务器之后,Flash Player 8决定服务器端 Clinet.virtualKey属性的 值。virtualKey属性映射到On2流目录,代替了默认的流目录,而以On2编解码器编码的HappyStream.flv流就 开始播放了。 要创建一个基于Flash Player版本自动进行流呈递的机制,像下面这样编辑vhost.xml文件: <VirtualKeys> <Key from="WIN 7,0,19,0" to="WIN 9,0,0,0">A</Key> <Key from="WIN 6,0,0,0" to="WIN 7,0,18,0">B</Key> <Key from="MAC 6,0,0,0" to="MAC 7,0,55,0">B</Key> </VirtualKeys> <VirtualDirectory> <Streams key="A">foo;c:streamson2</Streams> <Streams key="B">foo;c:streamssorenson</Streams> <Streams key="">foo;c:streams</Streams> </VirtualDirectory> TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 38 -
  • 39. TTGame(TT 概念游戏) - 全国第一的 Flash 网络游戏专家 TT 友情推出技术支持 - 更多技术、更多游戏、更多动画请访问 www.TTNo1.com 基于带宽呈递视频 要基于客户机的带宽把视频呈递给客户机,以不同的比特率(并可选的可以使用不同的编解码器)编 码这个视频并创建目 录,在目录中存储这些流,就像下面的例子中所展示的这样: c:streamsSorenson22kmystream.flv c:streamsSorenson150kmystream.flv c:streamsSorenson300kmystream.flv c:streamsVp622kmystream.flv c:streamsVp6150kmystream.flv c:streamsVp6300kmystream.flv 在vhost.xml文件的VirtualKeys标签中,把Flash Player 7及以下版本的虚拟键设置为fp7,把Flash Player 7 (.0.19.0)及更新 版本(支持On2编解码器的播放器)的虚拟键设置为fp8,就像下面的例子所展示的这样: <VirtualKeys> <Key from="WIN 8,0,0,0" to="WIN 9,0,0,0">fp8</Key> <Key from="MAC 8,0,0,0" to="MAC 9,0,0,0">fp8</Key> <Key from="WIN 6,0,0,0" to="WIN 7,0,55,0">fp7</Key> <Key from="MAC 6,0,0,0" to="MAC 7,0,55,0">fp7</Key> </VirtualKeys> 配置你的虚拟目录以寻找客户机键“fp7slow”、“fp8slow”等等,就像下面的例子所展示的这样: <VirtualDirectory> <Streams key="fp7slow">foo;c:streamsSorenson22k</Streams> <Streams key="fp7medium">foo;c:streamsSorenson150k</Streams> <Streams key="fp7fast">foo;c:streamsSorenson300k</Streams> <Streams key="fp8slow">foo;c:streamsVp622k</Streams> <Streams key="fp8medium">foo;c:streamsVp6150k</Streams> <Streams key="fp8fast">foo;c:streamsVp6300k</Streams> <Streams key="">foo;c:streams</Streams> </VirtualDirectory> 在你的服务器端脚本中,在application.onConnect处理器中,编写带宽探测例行程序(routine)并把探 测结果追加到每一个 客户机的虚拟键的后面,就像下面的例子中所展示的这样: client.virtualKey += "slow" client.virtualKey += "medium" client.virtualKey += "fast" Flash Media Server现在可以基于客户机的播放器的版本和带宽来为每一个客户机提供内容了。 把虚拟目录映射到虚拟键 虚拟键和虚拟目录之间的映射是在vhost.xml文件中完成的。vhost.xml文件的<VirtualKeys>部分把虚拟 键映射到一个Flash Player版本范围,就像下面的例子所展示的这样: <VirtualKeys> <Key from="WIN 7,0,19,0" to="WIN 9,0,0,0"></Key> TTGame出品 Flash Media Server 2.0 中文翻译版帮助文档 感谢Adobe Macromedia Flash Media Server开发小组的英文原版 - 39 -