Flash CS3 文档 |
|||
| ActionScript 3.0 编程 > 网络与通信 > 连接到其它 Flash Player 实例 | |||
通过使用 LocalConnection 类,可以在不同的 Flash Player 实例(例如 HTML 容器、嵌入或独立播放器中的 SWF)之间进行通信。这样,您便可以构建在 Flash Player 实例之间共享数据(例如在 Web 浏览器中运行或嵌入在桌面应用程序中的 SWF 文件)的各种不同的应用程序。
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.client 属性设置为实现方法的对象。 添加回调方法的第一种方式是扩展 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);
}
不建议使用上面这种添加回调方法的方式,因为该代码不是非常易于移植。另外,使用此方法创建本地连接会导致性能问题,因为访问动态属性比访问密封属性慢得多。
可以使用 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 中,如果连接名称已被使用, |
从辅助 SWF 文件连接到主 SWF 文件需要在发送方 LocalConnection 对象中新建 LocalConnection 对象,然后使用连接名称和要执行的方法名称来调用 LocalConnection.send() 方法。例如,要连接到早先创建的 LocalConnection 对象,可以使用下面的代码:
sendingConnection.send("conn1", "doQuit");
此代码使用连接名称 conn1 连接到现有 LocalConnection 对象,并调用远程 SWF 文件中的 doQuit() 方法。如果想要将参数发送到远程 SWF 文件,可以在 send() 方法中的方法名称后指定附加参数,如下面的片断所示:
sendingConnection.send("conn1", "doMessage", "Hello world");
要只允许从特定域进行通信,可以调用 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 文件更易于在域之间移植。下面是两种可能的情形:
connectionName 字符串不以下划线开头,则 Flash Player 会添加一个包含超级域名称和一个冒号的前缀(例如 myDomain:connectionName)。虽然这可以确保您的连接不会与其它域中具有同一名称的连接冲突,但任何发送方 LocalConnection 对象都必须指定此超级域(例如 myDomain:connectionName)。如果将具有接收方 LocalConnection 对象的 SWF 文件移动到另一个域中,Flash Player 会更改前缀,以反映新的超级域(例如 anotherDomain:connectionName)。必须手动编辑所有发送方 LocalConnection 对象,以指向新超级域。connectionName 字符串以下划线开头(例如 _connectionName),Flash Player 不会向该字符串添加前缀。这意味着接收方和发送方 LocalConnection 对象都将使用相同的 connectionName 字符串。如果接收方对象使用 LocalConnection.allowDomain() 来指定可以接受来自任何域的连接,则可以将具有接收方 LocalConnection 对象的 SWF 文件移动到另一个域,而无需更改任何发送方 LocalConnection 对象。Flash CS3
当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000317.html