18.1.创建本地连接

问题
我想让同一台电脑上的两个Flash进行通信
解决办法
使用flash.net包中的LocalConnection类来收发数据。在接收端使用LocalConnection.connect( )方法监听信息,定义一个函数触发LocalConnection.send( )发送数据,两个Flash必须指定相同通信信道。
讨论
当两个或多个在同一个电脑上运行着的Flash 可通过flash.net.LocalConnection 进行通信,而不必关心这些Flash 都是从什么服务器上下载来的。

多个Flash要想进行通信必须做三件事:
1.
设置接收端Flash的监听处理函数
2.
告诉接收端收到数据后做什么
3.
从发送端Flash发送数据给接收端

接收端通过指定名称的本地连接监听信息。要创建通信信道,则首先创建本地连接对象,并使用connect( )方法进行监听:
+展开
-ActionScript
import flash.net.LocalConnection;
// 在接收端创建本地连接
var receiver:LocalConnection = new LocalConnection( );
// 通知本地连接实例监听来自于"_exampleChannel" 通道的信息
receiver.connect( "_exampleChannel" );

正如上面的代码例子那样,最好取一个以下划线开头的通信信道名称,这样Flash播放器不会加入域信息, 如果不是以下划线开头, 则通信信道名称字符串将被自动转换成domain:connectionName,而不管是本地域还是远程域。

所有通过本地连接的通信都被映射到接收端本地连接实例,默认下,接收端本地连接实例寻找实例中同名的发送函数,例如,如果发送端Flash发送一条消息寻找名称为example( )的方法,接收端本地连接对象寻找已定义的example( )方法。在上面代码基础上,再创建一个函数并关联到实例的example名称上。
+展开
-ActionScript
receiver.example = function ( ) {
output.text = "communication received";
};

但是这样的代码在ActionScript 3.0中却不行了,默认情况下,LocalConnection类不允许在运行时动态添加属性和方法,在这里有三种解决办法:
1.
创建动态的LocalConnection子类,使用这个实例作为所有接收端本地连接
2.
创建LocalConnection子类重写发送数据的方法
3.
重定向客户对象的请求

下面我们看一下每一种解决办法

要想在运行时修改类的方法,该类必须申明为dynamic。在ActionScript3.0中最简单的方法就是继承LocalConnection类并申明为dynamic类,使用这个类作为接收端:
+展开
-ActionScript
package {
import flash.net.LocalConnection;
// 创建动态的Location Connection 类
dynamic public class DynamicLocalConnection extends LocalConnection {
//
}
}

现在用这个DynamicLocalConnection代替LocalConnection类,在用以前的方法创建接收函数:
+展开
-ActionScript
// 在接收端Flash创建本地连接对象
var receiver:DynamicLocalConnection = new DynamicLocalConnection( );
// 通知本地连接实例监听来自"_exampleChannel"通道的信息
receiver.connect( "_exampleChannel" );
// 因为DynamicLocalConnection类是动态的,所以我们可以在实例上创建
//新的函数来处理本地连接信息
receiver.example = function( ):void {
trace( "communication received" );
};

第一种方法的优点是很灵活,你可以把这个类放到其他项目中继续适用,缺点也很明显,就是太灵活了而无法为其定义接口,这不符合面向对象设计原则。

第二中方法也是继承LocalConnection类,并且创建指定的方法用于处理信息,例如下面的类定义了一个example( )方法
+展开
-ActionScript
package {
import flash.net.LocalConnection;
public class ExampleLocalConnection extends LocalConnection {
public function ExampleLocalConnection( ) {}
public function example( ):void {
trace("communication received");
}
}
}

第三种方法使用LocalConnection的属性client来重定向请求,client对象必须是public的方法,看下面的例子:
+展开
-ActionScript
package {
import flash.net.LocalConnection;
public class Example {
private var _localConnection:LocalConnection;
public function Example( ) {
_localConnection = new LocalConnection( );
_localConnection.connect( "_exampleChannel" );
_localConnection.client = this;
}
public function example( ):void {
trace("communication received");
}
}
}

我们已经设置好了接收的swf,下一步编写发送的swf文件,发送端使用LocalConnection.send( )方法发送信息。send( )方法的第一个参数指定通道名称,第二个参数指定接收端被调用的方法名称。当一个flash接收到信息时,他将会触发这个方法。

下面的例子触发名为example的远程方法:
+展开
-ActionScript
//通过"_exampleChannel" 通道发送信息
//触发接收端的example( )方法
var sender:LocalConnection = new LocalConnection( );
sender.send( "_exampleChannel""example" );

当使用LocalConnection类时,通信是多对一的关系,也就是多个发送方,但接收方只有一个,如果接收端试图连接另一个接收端已经打开的通道,则connect( )方法将抛出异常,应该用try...catch 来检测是否能成功连接:
+展开
-ActionScript
var receiver:LocalConnection = new LocalConnection( );
try {
receiver.connect( "_exampleChannel" );
catch( e:Error ) {
// Error 不能在_exampleChannel 通道上建立连接,因为这个连接已经被使用了
}

要让LocalConnection 能正常工作,发送端和接收端必须在同一个电脑上却都在运行才可,如果在同一台电脑不同的时间进行通信,则要使用LSO。

加支付宝好友偷能量挖...


评论(0)网络
阅读(88)喜欢(0)flash/flex/fcs/AIR