`
bufanliu
  • 浏览: 197456 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flash客户端间的交互

    博客分类:
  • FLEX
阅读更多
Flash有着天生非凡的动画和交互能力, 在RIA (富互联网应用程序)中有着天生的优势. 有些时候, flash客户端之间, 以及与其他客户程序如javascript (js)需要进行交互, 以提供更好的用户体验. 本文将对当前常用的多种flash客户端相关的交互方式进行归纳, 这些交互与服务器端无关.

Flash中使用的是actionscript (as)脚本, as脚本是一门基于ECMAScript的脚本语言, 在AVM(ActionScript Virtual Machine)上执行, 目前AVM分为AVM1和AVM2. 另一个著名的基于ECMAScript语言是javascript, 所以两者有很多共同特性. 不妨先来看一下as的发展历程:

as1: 2000年5月, 出现在flash player 5, 是一门弱类型, 基于prototype继承基制的语言, 这点和目前的js是一样的.
as2: 2003年9月, 出现在flash player 7, 支持编译时类型检查, 支持基于class继续的语法(实质上只是在已存在的基于prototype继承基制上增加了一层). 能够编译为as1的字节码, 所以与AS1是兼容的.
as3: 2006年6月, 出现在flash player 9, 随Adobe Flex 2一起发布. 它是AS的一次完全重构, 已经成为完全的面向对象的语言, 与as1/as2不再兼容, 运行于一个全新的虚拟机AVM2, 随之as1/as2运行的虚拟机被称为AVM1. as3的重新设计主要包括语言核心和flash player API两部分, 具体可查阅官方文档wikipedia. flash player 9同时包含AVM1和AVM2, 所以它支持三个as版本的flash, 只是会使用不同的虚拟机去运行它们.
下面切入主题, 分析一下flash客户端间的交互.
Flash中实现页面跳转
在flash中, actionscript 2 (as2)脚本可以通过getUrl发送一个url请求, 而actionscript 3 (as3)以flash.net.navigateToURL代替. navigateToURL在某些浏览器(比如firefox, ie 7等)下, 会被当弹出窗口拦截, 可以对特定的浏览器用ExternalInterface.call(window.open, url, “_blank”, “”)代替, 这实际上是在调用javascript函数.

另flash判断用户使用的浏览器, 也可以通过调用js实现, 如ExternalInterface.call(”function getBrowser(){return navigator.userAgent;}”).

Flash与Javascript交互
在flash player 8之前(不包括8), flash使用fscommand与js交互. 之后被ExternalInterface取代, 可见as2和as3都支持ExtenalInterface. ExternalInterface.call可以调用js代码, ExternalInterface.addCallBack可注册as2/as3函数供js调用. 在as3中, ExternalInterface位于包flash.external中.

ExternalInterface需要一个条件: “The ExternalInterface class requires the user’s web browser to support either ActiveX® or the NPRuntime API that is exposed by some browsers for plug-in scripting”.

注意在js中调用as函数, 取swf的引用时, ie6/7使用object的id, firefox使用embed的id.

Flash跨虚拟机的交互
Flash跨虚拟机, 指的得两个flash运行于两个不同的虚拟机(AVM1, AVM2), 如在不同的flash player/AIR中运行的flash, 或者如一个as3的swf加载了一个as2的swf, 这在flex 3.2之后可用mx.controls.SWFLoader实现, 等等. 跨虚拟机交互从as语言角度来说, 就是as3与as1/as2的交互. 这种交互主要有三种选择方案:

1. LocalConnection

先引用一段官方文档上有关LocalConnection的描述:
“Local connections enable this kind of communication between SWF files without the use of fscommand() or JavaScript. LocalConnection objects can communicate only among files that are running on the same client computer, but they can be running in different applications — for example, a file running in a browser and a SWF file running in Adobe AIR.
LocalConnection objects created in ActionScript 3.0 can communicate with LocalConnection objects created in ActionScript 1.0 or 2.0. The reverse is also true: LocalConnection objects created in ActionScript 1.0 or 2.0 can communicate with LocalConnection objects created in ActionScript 3.0. Flash Player handles this communication between LocalConnection objects of different versions automatically.”

LocalConnection提供了虚拟机间的通信通道, 实现在不同的客户端实现通信. 不过这个特性也可能成为缺点. 比如一个页面上多个flash使用LocalConnection进行通讯, 如果打开多个这样的页面, 如果标志LocalConnection的字符串相同, 这些页面可能会互相干扰. 解决的办法是为每一个LocalConnection提供唯一的标志字符串, 类似于id, 并且保证打开多个同样的页面, 这个标志字符串仍然是唯一的. 或许可以考虑把当前时间加入到标志字符串中保证唯一性.

另外, 有一个开源的库SWFBridge可以方便LocalConnection的开发.


2. 以javascript为桥梁通讯

当多个swf位于同一个页面, 或者, 一个swf加载了另一个swf, 并且, 它们所在环境支持使用ExternalInterface进行flash与js的交互, 就可以以js为桥梁实现flash客户端的交互.

同样, 有一个开源库flashinterface可以方便该开发, 既可以调用, 也可以基于事件通信.
注意, 使用flashinterface时, 要在程序开始时先调用
FlashInterface.publish(this, true);
否则可能会出错. 如flex application里, 可以在Application initialize事件中调用.


3. 使用SharedObject传递数据

SharedObject类似于cookie, 可以保存flash客户端的数据, 自然也能用它来实现多个swf之间传递数据. 如有人就用此种方式实现了一把.
不过这种方式, 如同cookie一样, 可能会受到安全机制的限制, 另外也不够灵活.

同一虚拟机中多个swf的交互
同一虚拟机多个swf的交互, 典型的例子如Flex 3.2使用SWFLoader加载了一个as3的flash, 此时, 两个swf都运行于AVM2. 这种情况下的交互支持上文提到的虚拟机间交互的所有方式, 不过更方便的是直接调用或使用事件.

如下面的例子, flex程序使用SWFLoader加载了一个as3 swf:
<mx:SWFLoader id=”myloader” source=”test.swf” creationComplete=”onSwfLoaded(event)”/>

直接调用时, 可以传任何参数和返回值, 如
父swf调用子swf, 直接这样调用: MovieClip(myloader.content).doTest();
doTest是子swf的一个函数.
子swf调用父swf, 可以在SWFLoade的creationComplete响应中, 先把this传给子swf, 子swf就可以调父的方法了. 如该博客中的例子(我试过可行).

用事件通信时, 可以直接在子swf中this.dispatchEvent(new flash.events.Event(”abcd”));
再在父中加入MovieClip(myloader.content).addEventListener(”abcd”, onAbcd);
或者, 在子swf中调用父的dispatchEvent, 在父中this.addEventListener.

Flash客户端间基本交互和解决方案主要就是这些, 它们各有所长, 具体选择哪一种就要看应用环境了.



分享到:
评论

相关推荐

    Talkee视频交互平台

    平台稳定采用FLASH客户端形式可以方便嵌入网页浏览器和应用程序.可以独立运行也可以采用程序附带模式,在iCampus就是采用了嵌入的方式,这样就能很方便地为校园互动平台拓展出一个视频交流的空间。

    使用Flash Cookie技术在客户端永久保存HTTP Cookie

    但是我们知道在客户端Cookie里保存数据是不稳 定的,因为用户可能随时会清除掉浏览器的Cookie,在这种情况下,一般的解决方案是重新向服务器端发送一个请求,以获得一个新的HTTP Cookie数据,并将其保存--就一般的...

    在Flash中实现与数据库的连接 (1)

    ASP具有强大的数据库处理功能,Flash能够实现交互性矢量动画,将Flash与ASP相结合,实现Flash与数据库的连接。实现Web数据库的应用一般有两种方法:一种是Web服务器端提供中间件,连接Web服务器与数据库服务器;另一...

    Flash P2P流媒体服务器系统

    Flash P2P流媒体服务器系统(简称P2PS)使用Flash Player客户端和RTMFP协议进行P2P视频直播/点播,极大的节省了服务器昂贵带宽。  工作流程:直播可通过Adobe Flash Media Live Encoder以及其它支持RTMP协议的发布...

    WebSocket客户端和服务端实例源码

    众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量...

    在Flash中实现与数据库的连接 (2)

    ASP具有强大的数据库处理功能,Flash能够实现交互性矢量动画,将Flash与ASP相结合,实现Flash与数据库的连接。实现Web数据库的应用一般有两种方法:一种是Web服务器端提供中间件,连接Web服务器与数据库服务器;另一...

    [原创]基于FLASH机制实现的不同域窗口相互调用js的插件-虫洞

    2)本插件是基于同一台电脑上的FLASH之间能进行LocalConnection以及FLASH与JS能相互调用的原理而设计,将客户端不同域页面间Javascript相互调用转化为了FLASH之间的"本地命令发送". 3)本插件在不同域页面间Javascript...

    Flex数据传输与交互

    连接到 Internet 的计算机中超过 98% 装有 Flash Player,这是一个企业级客户端运行时,它的高级矢量图形能处理要求最高、数据密集型应用程序,同时达到桌面应用程序的执行速度。通过利用 AIR,Flex 应用程序可以...

    FusionCharts正式版

    1)服务器无关性,可以用任何服务器端语言(ASP、JSP、PHP...)读取数据库中的信息发送给FusionChart 2)支持服务器端调用和客户端(JS)调用两种方式 3)支持高度交互、3D效果、动态效果的图表 4)...

    AdobeFlashCS6

    Adobe Flash Player 是一款高级客户端运行时使用的播放器。它短小精悍,能够在各种浏览器、操作系统和移动设备上使用,功能强大,兼容性高。现在,超过 8.2 亿台的连接 Internet 的桌面计算机和移动设备上都安装了 ...

    基于Flash的远程工业监控系统设计

    根据当前基于Web远程工业监控...该系统的核心思想是利用Socket实现了Flash客户端和服务器端的数据通信,利用RemoteObject实现历史数据的存储。本系统的设计对基于Web远程工业监控提供了新的思路,具有实际的应用价值。

    基于Flash的远程工业监控系统设计方案

    该系统的思想是利用Socket实现了Flash客户端和服务器端的数据通信,利用RemoteObiect实现历史数据的存储。本系统的设计对基于Web远程工业监控提供了新的思路,具有实际的应用价值。  目前,监控领域的产品普遍关注...

    通信与网络中的基于Flash的远程工业监控系统设计方案

    该系统的核心思想是利用Socket实现了Flash客户端和服务器端的数据通信,利用RemoteObiect实现历史数据的存储。本系统的设计对基于Web远程工业监控提供了新的思路,具有实际的应用价值。  目前,监控领域的产品普遍...

    ArcGIS教程:Flex制作直观的交互式图表

    Flex可以使开发人员创建利用Adobe FlashPlayer作为前台的RIA(富客户端互联网应用程序),以满足用户更为直观和极具交互性的在线体验。本文将要提到的图表就是Flex在Web应用端的一个例子,基于Flex创建图表可以给用户...

    FMSProject_1.0.0_eclipe3.3.zip

    Flash Media Server (简称FMS) 服务器是用于用户之间相互通讯的新平台 它集成了Flash多媒体交互的特性 又添加了实时音频和实时数据流等新特色 使用该平台,你可以通过网络存储录制下来的音频、视频,也...

    kioku:对Flashcard Web App的客户端应用程序做出React

    yarn test 在交互式监视模式下启动测试运行程序。 有关更多信息,请参见关于的部分。yarn build 构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 生成被最小化,并且...

    gordon-server:用于 NodeJS、HTML5Javascript 和 FlashAS3 的多用户服务器

    戈登服务器Gordon 是一个轻量级服务器,用于使用 HTML5 和 Adob​​e Flash/Air ... 用户可以通过更新他们的数据对象、发送聊天或自定义消息来相互交互。 ####DataObjects DataObject 用于在连接的客户端之间同步状态。

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩 最近流行的网络游戏(FLASH)数据传输都是用GZIP进行压缩与解压缩的,在客户端FLASH对与服务器交互的数据进行解压缩,

    Flex企业应用开发实战源代码

    首先介绍了Flex/Flash的工作机理和利用Flex开发企业级应用必须掌握的基础知识和核心元素;接着剖析了Flex与Java的通信机制,以及Flex企业应用的客户端架构和服务器端架构;再接着详细讲解了BlazeDS框架的使用方法和...

Global site tag (gtag.js) - Google Analytics