连接到其它 Flash Player 实例

通过使用 LocalConnection 类,可以在不同的 Flash Player 实例(例如 HTML 容器、嵌入或独立播放器中的 SWF)之间进行通信。这样,您便可以构建在 Flash Player 实例之间共享数据(例如在 Web 浏览器中运行或嵌入在桌面应用程序中的 SWF 文件)的各种不同的应用程序。

子主题

LocalConnection 类
在两个 Flash Player 实例之间发送消息
连接到不同域中的 SWF 文档

LocalConnection 类

LocalConnection 类用于开发 SWF 文件,这些文件无需使用 fscommand() 方法或 JavaScript 即可向其它 SWF 文件发送指令。LocalConnection 对象只能在同一客户端计算机上运行的 SWF 文件间进行通信,但是它们可以在不同的应用程序中运行。例如,虽然放映文件维护本地信息,而基于浏览器的 SWF 进行的是远程连接,但在浏览器中运行的 SWF 文件和在放映文件中运行的 SWF 文件可以共享信息。(放映文件是以可作为独立应用程序运行的格式保存的 SWF 文件 ― 即,放映文件嵌入在可执行文件中,因此不需要安装 Flash Player。)

可以使用 LocalConnection 对象在使用不同 ActionScript 版本的 SWF 之间进行通信:

Flash Player 可自动处理不同版本 LocalConnection 对象间的通信。

最简便的 LocalConnection 对象使用方法是只允许位于同一个域中的 LocalConnection 对象之间进行通信。这样,您就不必担心安全方面的问题。但如果您需要在不同域之间进行通信,则有多种方法来实现安全性措施。有关详细信息,请参阅《ActionScript 3.0 语言和组件参考》中有关 send() 方法的 connectionName 参数的讨论以及 LocalConnection 类列表中的 allowDomain()domain 条目。

提示

 

可以使用 LocalConnection 对象在一个 SWF 文件中收发数据,但是 Adobe 不建议这样做。相反,您应使用共享对象。

可以使用三种方式将回调方法添加到 LocalConnection 对象中:

添加回调方法的第一种方式是扩展 LocalConnection 类。您在自定义类中定义方法,而不是将它们动态添加到 LocalConnection 实例中。下面的代码说明了此方式:

package
{
    import flash.net.LocalConnection;
    public class CustomLocalConnection extends LocalConnection
    {
        public function CustomLocalConnection(connectionName:String)
        {
            try
            {
                connect(connectionName);
            }
            catch (error:ArgumentError)
            {
                // 已创建/连接服务器
            }
        }
        public function onMethod(timeString:String):void
        {
            trace("onMethod called at: " + timeString);
        }
    }
}

要新建 DynamicLocalConnection 类的实例,可以使用下面的代码:

var serverLC:CustomLocalConnection;
serverLC = new CustomLocalConnection("serverName");

添加回调方法的第二种方式是使用 LocalConnection.client 属性。这包括创建自定义类和将新实例分配给 client 属性,如下面的代码所示:

var lc:LocalConnection = new LocalConnection();
lc.client = new CustomClient();

LocalConnection.client 属性指示应调用的对象回调方法。在上面的代码中,client 属性设置为自定义类 CustomClient 的新实例。client 属性的默认值是当前 LocalConnection 实例。如果有两个具有同一方法集但是作用不同的数据处理函数,则可以使用 client 属性 ― 例如,在某个应用程序中,一个窗口中的按钮切换第二个窗口中的视图。

要创建 CustomClient 类,可以使用下面的代码:

package
{
    public class CustomClient extends Object
    {
        public function onMethod(timeString:String):void
        {
            trace("onMethod called at: " + timeString);
        }
    }
}

添加回调方法的第三种方式是创建动态类并动态附加该方法,这与在早期版本的 ActionScript 中使用 LocalConnection 类非常相似,如下面的代码所示:

import flash.net.LocalConnection;
dynamic class DynamicLocalConnection extends LocalConnection {}

通过使用下面的代码,可以将回调方法动态添加到此类中:

var connection:DynamicLocalConnection = new DynamicLocalConnection();
connection.onMethod = this.onMethod;
// 在此处添加代码。
public function onMethod(timeString:String):void
{
    trace("onMethod called at: " + timeString);
}

不建议使用上面这种添加回调方法的方式,因为该代码不是非常易于移植。另外,使用此方法创建本地连接会导致性能问题,因为访问动态属性比访问密封属性慢得多。

在两个 Flash Player 实例之间发送消息

可以使用 LocalConnection 类在 Flash Player 的不同实例之间进行通信。例如,可以在网页上有多个 Flash Player 实例,或者让 Flash Player 实例从弹出窗口中的 Flash Player 实例检索数据。

下面的代码定义一个本地连接对象,该对象作为服务器使用,接受来自其它 Flash Player 实例的传入调用:

package
{
    import flash.net.LocalConnection;
    import flash.display.Sprite;
    public class ServerLC extends Sprite
    {
        public function ServerLC()
        {
            var lc:LocalConnection = new LocalConnection();
            lc.client = new CustomClient1();
            try
            {
                lc.connect("conn1");
            }
            catch (error:Error)
            {
                trace("error:: already connected");
            }
        }
    }
}

此代码先创建一个名为 lc 的 LocalConnection 对象,然后将 client 属性设置为自定义类 CustomClient1。当另一个 Flash Player 实例调用此本地连接实例中的某方法时,Flash Player 在 CustomClient1 类中查找该方法。

当 Flash Player 实例连接到此 SWF 文件并尝试调用指定本地连接的任何方法时,系统会将请求发送到 client 属性指定的类(该属性被设置为 CustomClient1 类):

package
{
    import flash.events.*;
    import flash.system.fscommand;
    import flash.utils.Timer;
    public class CustomClient1 extends Object
    {
        public function doMessage(value:String = ""):void
        {
            trace(value);
        }
        public function doQuit():void
        {
            trace("quitting in 5 seconds");
            this.close();
            var quitTimer:Timer = new Timer(5000, 1);
            quitTimer.addEventListener(TimerEvent.TIMER, closeHandler);
        }
        public function closeHandler(event:TimerEvent):void
        {
            fscommand("quit");
        }
    }
}

要创建 LocalConnection 服务器,请调用 LocalConnection.connect() 方法并提供唯一的连接名称。如果已存在具有指定名称的连接,则会生成 ArgumentError 错误,指出由于已经连接了该对象,连接尝试失败。

下面的片断说明如何使用名称 conn1 创建新的套接字连接:

try
{
    connection.connect("conn1");
}
catch (error:ArgumentError)
{
    trace("Error! Server already exists\n");
}

注意

 

在早期版本的 ActionScript 中,如果连接名称已被使用,LocalConnection.connect() 方法则会返回一个布尔值。在 ActionScript 3.0 中,如果该名称已被使用,则生成错误。

从辅助 SWF 文件连接到主 SWF 文件需要在发送方 LocalConnection 对象中新建 LocalConnection 对象,然后使用连接名称和要执行的方法名称来调用 LocalConnection.send() 方法。例如,要连接到早先创建的 LocalConnection 对象,可以使用下面的代码:

sendingConnection.send("conn1", "doQuit");

此代码使用连接名称 conn1 连接到现有 LocalConnection 对象,并调用远程 SWF 文件中的 doQuit() 方法。如果想要将参数发送到远程 SWF 文件,可以在 send() 方法中的方法名称后指定附加参数,如下面的片断所示:

sendingConnection.send("conn1", "doMessage", "Hello world");

连接到不同域中的 SWF 文档

要只允许从特定域进行通信,可以调用 LocalConnection 类的 allowDomain()allowInsecureDomain() 方法,并传递包含允许访问此 LocalConnection 对象的一个或多个域的列表。

在早期版本的 ActionScript 中,LocalConnection.allowDomain()LocalConnection.allowInsecureDomain() 是必须由开发人员实现的、且必须返回布尔值的回调方法。在 ActionScript 3.0 中,LocalConnection.allowDomain()LocalConnection.allowInsecureDomain() 都是内置方法,开发人员可以像调用 Security.allowDomain()Security.allowInsecureDomain() 那样调用这两个内置方法,传递要允许的一个或多个域的名称。

可以向 LocalConnection.allowDomain()LocalConnection.allowInsecureDomain() 方法传递两个特殊值:*localhost。星号值 (*) 表示允许从所有域访问。字符串 localhost 允许从本地安装的 SWF 文件调用 SWF 文件。

Flash Player 8 对本地 SWF 文件引入了安全限制。可以访问 Internet 的 SWF 文件还不能访问本地文件系统。如果指定 localhost,则任何本地 SWF 文件都可以访问 SWF 文件。如果 LocalConnection.send() 方法试图从调用代码没有访问权限的安全沙箱与 SWF 文件进行通信,则会调度 securityError 事件 (SecurityErrorEvent.SECURITY_ERROR)。要解决此错误,可以在接收方的 LocalConnection.allowDomain() 方法中指定调用方的域。

如果仅在同一个域中的 SWF 文件之间实现通信,可以指定一个不以下划线 (_) 开头且不指定域名的 connectionName 参数(例如 myDomain:connectionName)。在 LocalConnection.connect(connectionName) 命令中使用相同的字符串。

如果要实现不同域中的 SWF 文件之间的通信,可以指定一个以下划线开头的 connectionName 参数。指定下划线使具有接收方 LocalConnection 对象的 SWF 文件更易于在域之间移植。下面是两种可能的情形:


Flash CS3

 

评论添加到页面后给我发送电子邮件 | 评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000317.html