Flash Remoting 简介

Flying
2013-06-28 / 0 评论 / 144 阅读 / 正在检测是否收录...

什么是 Flash Remoting?它是一种是语言吗?不是,它实质上是一种与已有应用服务器整合的服务器端技术。Flash Remoting 为 Flash 播放器与部署在服务器端的远程服务间的通信提供通路,让我们方便快速地创建 RIAs(Rich Internet Applications)。

Flash Remoting 概述

利用 Flash Remoting,我们可以在 Flash 内部通过 ActionScript 访问远程服务。Flash Remoting 具有很强的扩展性。我们只稍需改动,就能将 Flash 整合到已有的 C/S(client/server)应用程序中, 从而为用户提供丰富、健壮、跨浏览器、跨平台、跨设备的界面。如图所示

Flash Remoting 的扩展性

Flash Remoting 网关位于客户端的 Flash 播放器和服务器端的应用程序之间,它将数据序列化(serialization)并处理 Flash 播放器和服务器之间的请求。序列化就是一种将数据格式化成便于网络传送的数据传输,这种传输对于客户端和服务器端的 Flash 开发人员都是透明的。 使用 Flash 播放器和 Flash Remoting 网关其实就是一种典型的 C/S 架构,我们将在后面探讨这个问题。

Flash Remoting 允许 Flash 直接远程调用(RPC)已有的服务器端服务,从而明确了服务器端开发人员、客户端开发人员和客户端设计师人之间分工,有利于团队开发建设。在 Flash 中调用一个服务就如同叫它名字那么容易。比如, 服务器端有一个 getRecords()方法,平时我们经常调用它来生成 HTML 页面,现在 Flash Remoting 允许开发人员直接在 Flash 中调用该方法。这种调用不用刷新页面,是无缝的,用户根本感觉不到(Ajax 也可以实现类似调用)。这就意味 Flash Remoting 带来的是一种更友好的 web 体验,这样的 web 程序更像传统的桌面程序。

Flash Remoting 网关

从本质上讲,Flash Remoting 网关是一个中间件,它以本地服务的方式运行在 ColdFusion MX 服务器上,以 Servlet 的方式运行在 Java 服务器上,以程序集的方式运行在 .NET 服务器上,以 PHP 类的方式运行在 PHP 服务器上。如图下图所示。

Flash 播放器使用 AMF(Action Message Format)通过 HTTP 网络协议将客户端的请求发送 Flash Remoting 网关。因为应用服务器平台的不同, Flash Remoting 在服务器端包含一系列不同的过滤器(filter)。当 Flash Remoting 网关接收到服务请求时,它首先将请求传到过滤器中,通过过滤器来序列化数据、记录日志、处理错误、进行安全验证。再根据服务名称,通过服务适配器(Service Adapter)调用相应的应用服务器端服务或 Web Service。一旦应用服务或 Web 服务能满足该请求,将返回一个执行成功的结果给 Flash Remoting 网关。Flash Remoting 网关将数据反序列(deserialize)化为 ActionScript 对象,最后将 AMF 将数据返回给 Flash 应用程序。这里有几个重要的概念需要明确,先来看一看 Flash Remoting 网关。

Flash Remoting 网关

Flash Remoting 网关安装在服务器端,允当 Flash 播放器与服务器通信的中介。执行网关的 Flash Remoting 核心模块也称作服务适配器。它主要执行以下三个任务:

  1. 处理 Flash 播放器向远程服务发出的请求, 这些服务可能来自的同一台服务器(Flash Remoting 网关形式),也可能是 Web Services 形式的外部服务;
  2. 传送 Flash 播放器向服务器端发出的请求和数据;
  3. 接收服务器响应,并将服务器返回的数据编译成本地 ActionScript 数据类型(native ActionScript datatypes)供 Flash 直接使用。

Flash 播放器与 Flash Remoting 网关通信是通过 HTTP 来完成的。这句话包含以下几层含义:

  • 它们的通信是是请求驱动(request-driven)。这就是说,Flash 播放器只能直接与 Flash Remoting 网关通信。如果 Flash 播放器不发出请求,服务器不能强行向 Flash 抛送数据。当然,可以使用 ActionScript XMLSocket 对象或 Flash Media Server (FMS)来解决这一问题。
  • HTTP 是一种无状态协议,因此 Flash 播放器每发出一个请求就要连接一次服务器。Flash Remoting 网关利用 cookies 可以自动保持上发出一次请求时的状态。如果客户端禁止了 cookies,还可以通过 session 来保持。
  • 同 HTTP 紧密相关的 SSL(加密套接字协议层),对 Flash Remoting 也适用。如图下图所示。

Flash Remoting and SSL

使用 HTTPS/SSL 的 Flash 播放器 /Flash Remoting C/S 架构与使用 HTTP 的 Flash 播放器 /Flash Remoting C/S 架构类似,HTTPS 允许利用 SSL 加密 Flash 播放器 /Flash Remoting 通信,通过 SSL 连接将 Flash 影片发布到客户端,并且只有在上具备授权认证功能的(SSL-enabled)浏览器中才能播放。采用此协议的 Flash 程序与 HTML 程序一样安全,可以放心发布。

目前 Flash 服务器端连接的技术,仍然普遍使用 HTTP Service 技术:loadVariales()、LoadVars 和 XML 对象。这是因为学习容易,不需要在服务器上安装额外软件,只要用 Flash 接收某种服务器编程语言用变量/值配对或 XML 格式输出的数据,就可以协助 Flash 间接与服务器通信了。那我们什么还要使用 Flash Remoting 呢?那是因为它从 Flash MX 出现以来,它仍然是 Flash 与服务器端连接交换数据的最佳技术

  • 更容易封装商业逻辑――更好地套用已有架构,并且可以更好地运用设计模式去开发;
  • 更容易部署在不同平台设备上;
  • 拥有众多的服务器技术支持
  • 更容易调试除错;
  • 简单化数据集操作――很容易就可以将数据集的数据绑定到容器或菜单组件中并显示出来;
  • 完全支持 XML;
  • 执行上最有效率:以AMF协议传送数据,对 Flash 播放器执行效率更高,占用内存更少;
  • 比单纯采用 GET/POST 传送更安全

核心技术——AMF

AMF 是什么?它的优点中是什么?Flash Remoting 与 Flash 播放器通信时为什么选择了使用 AMF 而放弃了 SOAP 呢?

Flash 5 开始就可以以 XML 或者变量/值配对输出格式向服务器传送数据。虽然这些数据能通过 Flash 编译器自动解析或者通过开发人员自行编写的代码手动解析, 但解析的速度慢。因为在解析过程中,XML 需要按节点逐层处理数据。而且使用 XML 和变量/值配对格式处理的数据类型只能是字符型,数字也不例外。而 Flash Remoting 却能处理复杂数据类型, 比如对象、结构、数组,甚至可以是数据集,配合 DataGrid 组件可以很方便地显示数据。

为了处理复杂数据类型,采用一种独有的方式使 Flash 与应用服务器间可以来回传送数据势在必行。于是 AMF 应运而生。AMF 是 Adobe 独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,从而为 Flash 播放器与 Flash Remoting 网关通信提供了一种轻量级的、高效能的通信方式。如下图所示。

fr_amf.gif

AMF 最大的特色在于可直接将 Flash 内置对象,例如 Object, Array, Date, XML,传回服务器端,并且在服务器端自动进行解析成适当的对象,这就减轻了开发人员繁复工作,同时也更省了开发时间。由于 AMF 采用二进制编码,这种方式可以高度压缩数据,因此非常适合用来传递大量的资料。数据量越大,Flash Remoting 的传输效能就越高,远远超过 Web Service。至于 XML, LoadVars 和 loadVariables(),它们使用纯文本的传输方式,效能就更不能与 Flash Remoting 相提并论了。

注意:Flash Remoting 需要浏览器支持 Binary POST,Flash 播放器在 Netscape 6.x. 环境下运行 Flash Remoting 会不起作用(Flash Remoting 调用没有效果也不返回错误),Netscape 7 已经纠正了这个 bug 。对于早期 Safari 和 Chimera 版的苹果机也有这个问题。

同样是轻量级数据交换协议,同样是通过调用远程服务,同样是基于标准的 HTTP 和 HTTPS 协议, Flash Remoting 为什么选择了使用 AMF 而放弃了 SOAP 与 Flash 播放器通信呢? 有如下原因:

  • SOAP 将数据处理成 XML 格式,相对于二进制的 AFM 太冗长了;
  • AMF 能更有效序列化数据;因为 AMF 的初衷只是为了支持 Flash ActionScript 的数据类型,而 SOAP 却致力于提供更广泛的用途;
  • AMF 支持 Flash 播放器 6 只需要浏览器增加 4 KB 左右(压缩后)的大小,而 SOAP 就大多了;
  • SOAP 的一些头部文件请求在 Flash 播放器 6 不支持。那 Flash 播放器 6 为什么能访问基于 SOAP 的 Web 服务呢?原来 Flash Remoting 网关将 SOAP 请求在服务器端与转换成 AFM 格式,然后利用 AFM 与 Flash 播放器通信。另外,AMF 包中包含 onResult 事件(比如说 response 事件)和 onStatus 事件(比如说 error 事件),这些事件对象在 Flash 中可以直接使用。

AMF 从 Flash MX 时代的 AMF0 发展到现在的 AMF3。AMF3 用作 Flash Playe 9 的 ActionScript 3.0 的默认序列化格式,而 AMF0 则用作旧版的 ActionScript 1.0 和 2.0 的序列化格式。 在网络传输数据方面,AMF3 比 AMF0 更有效率。AMF3 能将 int 和 uint 对象作为整数(integer)传输,并且能序列化 ActionScript 3.0 才支持的数据类型, 比如 ByteArray,XML 和 Iexternalizable。

Flash Remoting 的开发环境

因为 Flash Remoting 两种明显不同的运行环境,因此我们需要使用两种编程语言:ActionScript 和提供远程服务的服务器端语言。正因如此,Flash Remoting 开发 Flash 应用程序至少必备两种不用的开发环境。

客户端开发环境:

  1. Macromedia Flash(MX 2004 及以上)

目前 Flash Remoting 的 ActionScript 有两个版本:Flash Remoting for ActionScript 1.0 和 Flash Remoting for ActionScript 2.0。Flash 是使用 Flash Remoting 开发 RIAs 是最主要的客户端平台。其中 Flash MX 只支持旧版的 ActionScript,Flash 8 只支持新版的 ActionScript,只有 Macromedia Flash MX 2004 可以同时支持新旧两个版本。本书 Flash Remoting 所用的 ActionScript(客户端代码)全部采用 Flash MX 2004 ActionScript 2.0 编写,因此我们可以直接使用已经安装好的 Flash 8 来学习 Flash Remoting。

目前,Flash Remoting 开发的客户端平台还有 Director 和 Flex 等,服务器端平台常见有 FMS(Flash Movie Server)。

  1. Macromedia Flash Remoting 组件

目前 Flash Remoting 组件的最新版本 for Flash 8 ActionScript 2.0,而且已经支持中文版的 Flash 8 了。以前非英文用户在安装英文版的 Flash MX2004 的 Flash Remoting 组件后 Flash Remoting 会出现找不到路径的,现在已经修正此问题。我们可以到 Adobe 的官方网站去免费下载。

服务器端开发环境

  1. 编辑器

我们需要编写 ColdFusion,Java 或 NET 程序的开发工具,比如记事本、EditPlus。在实际开发项目时,为了提高效率,我们经常会使用能提供集成开发环境(IDE)的编辑器。如开发 ColdFusion 的 Dreamveaver,编写 Java 程序的 eclipse、开发 .NET 程序的 Visual Studio 等 IDE 工具。至于记事本,开发效率太差,而且对 UTF-8 支持不好,少用为妙。

  1. 服务器

支持 Flash Remoting 网关的 Web 服务器。比如 ColdFusion MX、JRun、Weblogic、Tomcat、IIS、PHP 等服务器。

  1. Flash Remoting 网关

Flash Remoting 网关在 ColdFusion MX 和 JRun 4 中已经内置了。 当然,如果我们习惯使用其它应用服务器技术技术,比如 ASP.NET,J2EE,只要购买 Flash Remoting 开发包就可以将 Flash Remoting 运用到上述应用服务器中。 如果不想付钱,也可以选择开源(免费)方案来替代,其中比较有名的是:

目前 Amfphp 是被公正为最好的 Flash Remoting 开源技术。如果希望免费使用 Flash Remoting,首选 Amfphp,这网络上这方面的资源很多,我们也将其作为重点介绍。

注意:ColdFusion 和 JRun 早期的版本是没有内置 Flash Remoting 网关的。如果没有特别指出,我们所讲的 ColdFusion 指的 ColdFusion MX 及更高版本,JRun 指的 JRun 4 及更高版本。

Flash Remoting 支持的远程服

Flash Remoting 支持目前领先的 Web 应用服务器技术,包括平台包括强大的 Java 和 .net 平台(详见下表)。通过远程服务,不同应用程序之间的可以通信。不管这些程序是在同一台计算机上,还是在局域网内的不同计算机上,甚至在 Internet 的不同操作系统上。

编程语言 服务类型 网关 URL 服务名称 方法名
ColdFusion MX CFM http:// 主机名 /flashservices/gateway 文件虚拟路径 CFM 文件名
CFC 文件虚拟目录 组件方法名
Java EJB http:// 主机名/上下文路径 /gateway EJBHome 绑定的 JNDI 名 EJB 方法名
Java 类 **完全限定类名** 类方法名
JavaBean 同 Java 类 JavaBean 方法名
Servlet Web 应用的上下文路径 Servlet 名
JRun JMX 同 ColdFusion MX MBean 对象名 Mbean 方法名
ASP.NET ASPX gateway.aspx 的绝对 URL 路径 同 CFM ASPX 文件名
DLL 同 Java 类 CS 类方法名
PHP PHP 类 gateway.php 的绝对 URL 路径 从加载服务类的根路径开始的目录路径 类方法名
Server-Side ActionScript SSAS 同 ColdFusion MX/JRun 同 CFM 类方法名

说明:

  • Flash Remoting 的服务名称准确地说应该是服务路径,通过它 Flash Remoting 适配器才能正确地找到被调用的服务。指定服务路径时,请将虚拟路径改以 . 分隔;
  • 文件的虚拟路径都不包括文件后缀名;
  • 加载服务类的根路径默认为 services/
  • 完全限定类名:类名与其包路径名(适用 Java)或者命名空间名(适用 .NET)的组合(用 . 连接)。类名和命名空间类名习惯上首字母大写,而包路径名则刚好相反;
  • Flash Remoting 也可以使用 Web Services 作为远程服务,但这不能体现出其执行快的优势,而且从 Flash MX 开始 Flash 就已经可以直接和 Web Services 通信,因而我们此处不再讲述。

Remote Object Service

<mx:RemoteObject>标记允许使用 AMF3 访问远程服务类的方法,要知道在 Flex 中怎样使用 Flash Remoting 访问数据,应该先了解一下 RemoteObject 类。

要知道在 Flex 中怎样使用 Flash Remoting 访问数据,应该先了解一下 RemoteObject 类。

包 mx.rpc.remoting 类 public dynamic class RemoteObject
继承 RemoteObject → AbstractService → Proxy → Object
子类 RemoteObject

RemoteObject 标记

它允许使用 AMF3 访问远程服务类的方法。

  • <mx:RemoteObject>允许的标记属性有:
<mx:RemoteObject
  Properties
  concurrency="multiple|single|last"
  destination="No default."
  id="No default."
  endpoint="No default."
  showBusyCursor="false|true"
  source="No default." (currently, Macromedia ColdFusion only)
  makeObjectsBindable="false|true"
  事件
  fault="No default."
  result="No default."  
 />
  • <mx:RemoteObject> 标记可以包含多个 <mx:method> 标记,<mx:method>允许的标记属性有:
 <mx:method
  Properties
  concurrency="multiple|single|last"
  name="No default, required."
  makeObjectsBindable="false|true"       
 事件
  fault="No default."
  result="No default."
 />
  • <mx:RemoteObject> 标记可以也只能包含一个 <mx:arguments> 子标记,该子标记是一个序列数组对象。

公有属性

  1. concurrency : String

表示对同一服务怎样进行多次调用。类似于 XMLConnector/WebServiceConnector/RemotingConnector 的 multipleSimultaneousAllowed 属性。它的默认值为 multiple,允许下列值 :

  • Multiple:同一时间可以执行多个请求。已有的请求不会被取消;
  • Single:同一时间调用只能执行一个请求,多个请求会报错;
  • Last:最后一次请求会覆盖已有的请求。
  1. endpoint: String

允许开发人员快速为 RemoteObject destination(目标)指定 endpoint(端点)。而该 destination 既没有在编译时,也没有在用代码新建 ChannelSet(通道集)时参照 services-config.xml。如果设定了该属性,它会覆盖已有的 ChannelSet。

如果 endpoint 的 url 以 https 开头,将使用 SecureAMFChannel, 否则使用普通的 AMFChannel。{server.name}{server.port} 标记,可以用在 endpointurl 中,表明 Channel 应该使用用来加载 SWF 文件的服务名称和端口。

  1. showBusyCursor: Boolean

表示服务正在执行时是否显示一个表示忙碌的鼠标指针。

公有方法

  1. RemoteObject()构造方法

创建一个新的 RemoteObject 对象。

参数:destination:String (默认为 null) —RemoteObject 的 destination 属性必须匹配 services-config.xml 中的 destinationID 属性值。
  1. initialized ()
public function initialized(document:Object, id:String):void

只要设定 RemoteObject 标记就会通过 MXML 编译器自动调用该方法。如果使用 ActionScrip 新建 RemoteObject 实例,则可以自行调用该方法,这对验证其参数很有用。

参数

  • document:Object —RemoteObject 所在的 MXML 文档
  • id:String —RemoteObjec 在上述文档中的 ID

使用 Flash Remoting 实现 Flash 与服务器通信

首先,我们将了解一下与远程服务通信的公用 Flash ActionScript,接着我们将学习如何编写提供远程服务所需的服务器端代码,包括 ColdFusion, J2EE, .NET,和 PHP 四个版本。

ActionScript

总体上说,客户端所用的 ActionScript 基本上是相同的,当然服务名称和 Flash Remoting 网关 URL 可能不一样,这取决于你采用的编程语言和架设 Web 应用时设置的虚拟路径或者上下文根。如果想了解不同编程语言下不同服务类型的网关 URL 和服务名称的详情,请参看 Flash Remoting 支持的远程服务

请打开附件中的 helloworld_start.fla 源文件,将其另存为 helloworld_finished.fla。在主时间轴 as 层的第一帧中添加如下代码。


// 首先导入类。这些类代码分别用来创建远程 `Service 对象`实例(Service)、等待响应对象(PendingCall)、延迟响
// 应器(RelayResponder)对象,处理调用远程服务方法成功(或失败)而返回的事件对象(ResultEvent 或 FaultEvent )。
import mx.remoting.Service;
import mx.remoting.PendingCall;
import mx.rpc.RelayResponder;
import mx.rpc.ResultEvent;
import mx.rpc.FaultEvent;
import mx.controls.Button;
import mx.controls.TextInput;
import mx.controls.Label;
// 设置实例变量
var submit_button:Button;
var userName_ti:TextInput;
var result_lbl:Label;
// 紧接着初始化各种编程语言下所需的远程服务实例`helloService。远程 Service 对象实例有五个参数,
// 其中 Flash Remoting 网关 URL 和服务名称是必须的。
// 设置 ColdFusion 下的远程服务实例
// var gatewayURL:String = "http://localhost:8500/flashservices/gateway";
// 设置 JRun 下的远程服务实例
// var gatewayURL:String = "http://localhost:8101/flashservices/gateway";
// 设置其它 JEE 下的远程服务实例
// var gatewayURL:String = "http://localhost:8080/flashservices/gateway";
// 设置 .NET 下的远程服务实例
var gatewayURL:String = "http://localhost/flashservices/gateway.aspx";
// 设置 PHP 下的远程服务实例
// var gatewayURL:String = "http://localhost/flashservices/gateway.php"; 
var helloService:Service = new Service(gatewayURL, null, "tutorials.remoting.HelloWorld");
// 接下来定义 click 回调函数,在该函数中调用 helloService 远程服务的 sayHello()方法并返回一个等待响应对象 Pc。
// sayHello()方法是在创建服务器端远程服务时定义的,该方法用一个形式参数 userName 来接收用户的文本输入
// 下一步新建一个延迟响应器对象来调用 sayHello()方法,并将其指向等待响应对象 Pc 的
// responder 属性。该延迟响应器对象告知远程
// 服务将用 sayHelloResult 函数来返回成功调用的结果,用 sayHelloFault 函数来返回调用失败而返回的错误。
function click():Void {
  var pc:PendingCall = helloService.sayHello(userName_ti.text);
  pc.responder = new RelayResponder(_root, "sayHelloResult", "sayHelloFault");
}

// 再接下来创建 sayHelloResult()处理函数。该函数以一个结果事件对象(ResultEvent)为参数,该对象的
// result 属性包含调用成功调用的结果。
function sayHelloResult(re:ResultEvent):Void {
  // 显示调用远程服务方法成功而返回的结果
  results_lbl.text = re.result;
}

// 然后创建 sayHelloFault()处理函数。该函数以一个错误事件对象(FaultEvent)为参数,该对象的 fault 属性
// 包含调用远程服务失败而返回的错误。
function sayHelloFault(fe:FaultEvent):Void {
  // 显示调用远程服务方法失败而返回的结果
  results_lbl.text = fe.fault.faultstring;
}

// 最后调用 addEventListener()方法将广播事件及侦听器对象注册到组件实例 submit_button。
submit_button.addEventListener("click", this);

远程服务代码

Flash Remoting 的使用,让我们能在开发 RIAs 时真正做到客户端与服务器端的代码分离。如前文所言,我们可以用多数主流编程语言来实现本例的 远程服务。

如果不是太明白,请点击下载源文件。

基于 MVC 模式的 Flash Remoting 类

为方便自己,我特意用 MVC 模式改写了 Flash Remoting 类,适用于 AS2.0。但愿对大家还有些用。

封装

  • RemotingModel 父类
/**
* @class RemotingModel
*/
import mx.remoting.Service;
import mx.services.Log;
import mx.remoting.PendingCall;;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
import mx.remoting.debug.NetDebug;
import mx.events.EventDispatcher;

class com.riafan.RemotingModel {
  private var gatewayURL:String;
  private var servicePath:String;
  private var svc:Service;
  public var addEventListener:Function;
  private var removeEventListener:Function;
  private var dispatchEvent:Function;
  private var dispatchQueue:Function;

  /**
  * Constructor
  *
  * @param $gatewayURL gateway URL
  * @param $serviceName service name
  * @param $uid username
  * @param $pwd password
  *
  */
  public function RemotingModel($gatewayURL, $serviceName, $uid, $pwd)
  {
    // initialize as a broadcaster
    EventDispatcher.initialize(this);

    // create a new service
    svc = new Service ($gatewayURL, null, $serviceName, null, null);

    // credentials
    if ($uid != undefined &amp;&amp; $pwd != undefined) {
      svc.connection.setCredentials($uid, $pwd);
    }
  }

  /**
  * Global fault event
  */
  private function handleRemotingModelError(fault:FaultEvent):Void {
    mx.remoting.debug.NetDebug.trace({level:"None", message:"Error: " + fault.fault.faultstring });
  }

  /**
  * Event dispatcher
  * @paramc $data data
  * @param $type event type
  */
  private function dispatch($data, $type) {
    // broadcast message
    var eventObj:Object={target:this,type:$type}
    eventObj.data = $data;
  dispatchEvent(eventObj);
}
  • RemotingView 父类
/**
* @class RemotingView
*/
import mx.events.EventDispatcher;
class com.riafan.RemotingView {
  private var target:MovieClip;
  public var addEventListener:Function;
  public var removeEventListener:Function;
  public var dispatchEvent:Function;
  public var dispatchQueue:Function;

  /**
  * Constructor
  * @param mc target(target timeline: _root || a mc)
  */
  public function RemotingView ($target:MovieClip) {
  target = $target;

  // initialize as a broadcaster
    EventDispatcher.initialize(this);
  }
  private function dispatch($data, $type)
  {
    // broadcast message
    var eventObj:Object={target:this,type:$type}
    eventObj.data = $data;
    dispatchEvent(eventObj);
  }
}

实际应用中,如果我们的项目并不复杂,就没有必要写父类了。

基于 Flash Remoting MVC 的 MP3 播放器

本 MP3 播放器功能相对简单,纯粹是为了练习。该播放器是用 FlashDevelop 开发的,源文件中包含开发时使用的工程文件。Flash Remoting 有 ASP.NET 和 PHP 两个版本,附带 sql 脚本。

点击此处下载源文件。

判断 Flash Remoting Gateway 连接失败的方法

在 Flash Remoting 中,怎样判断 Gateway 连接失败?不管 AS1 和 AS2 还是 AS3 都可以使用 NetConnectionon 对象。

  • ActionScript 1.0
var gatewayURL = 'http://localhost/Gateway.aspx'; 
NetServices.setDefaultGatewayUrl(gatewayURL); 
conn = NetServices.createGatewayConnection(); 
conn.onStatus = function(info_obj) { 
  if (info_obj.code == 'NetConnection.Call.Failed') { 
    trace('连接远程服务失败'); 
  } 
}

此处我们使用 NetServices 对象的 createGatewayConnection 方法返回NetConnection对象,再利用该对象的 onStatus 事件来判断连接失败。

  • ActionScript 2.0
var gatewayURL:String = 'http://localhost/Gateway.aspx'; 
var custService:Service = new Service(gatewayUR, null, 'HelloWorld', null, null); 
custService.connection.onStatus = function(info_obj) { 
  if (info_obj.code == 'NetConnection.Call.Failed') { 
    trace('连接远程服务失败'); 
  } 
}

此处我们引用 Service 对象的 connection 属性指向一个 NetConnection 对象,再利用该 NetConnection 对象的 onStatus 事件来判断。

  • ActionScript 3.0
var gatewayURL:String = 'http://localhost/Gateway.aspx'; 
var nc:NetConnection = new NetConnection(); 
nc.connect(gatewayURL); 
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
function netStatusHandler(evt:NetStatusEvent):void { 
  if (evt.info.code =='NetConnection.Call.Failed') { 
    trace('连接远程服务失败'); 
  } 
}
此处我们使用 NetStatusEvent 事件对象来 Gateway 返回连接状态,并将其将作为参数传递给事件侦听器。
4

评论 (0)

取消