`
kinglong
  • 浏览: 32813 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

AS3版Flash Remoting客户端类-Service类

阅读更多
AS3版Flash Remoting客户端类-Service类

这段时间在研究Flash Remoting技术,之前在Flash里调用Remoting的话,只能通过NetConnection类调用,但写起来比较麻烦,同时方法调用不直观。

而在Flex里用RemoteObject类用起来比较直观,但它是集成在Flex里了,功能还挺复杂,还在Flash里不方便调用,所以我参考RemoteObject类写了一个简化的AS3版类-Service类,我现在把相关代码共享出来。

Service类
package com.klstudio.net.remoting {	



	import flash.net.NetConnection;

	

	import flash.events.EventDispatcher;

	import flash.events.Event;

	import flash.events.IEventDispatcher;

	import flash.events.AsyncErrorEvent;

	import flash.events.IOErrorEvent;

	import flash.events.NetStatusEvent;

	import flash.events.SecurityErrorEvent;	

	

	import flash.utils.flash_proxy;

	import flash.utils.Proxy;

	import flash.utils.Dictionary;



	/**

	 * Remoting服务

	 * @author Kinglong(kinglong@gmail.com)

	 * @since:2010-8-3

	 */

	[Event(name="fault", type="com.klstudio.events.FaultEvent")]

	[Event(name="result", type="com.klstudio.events.ResultEvent")]

	

	[Event(name="netStatus", type="flash.events.NetStatusEvent")]

	[Event(name="ioError", type="flash.events.IOErrorEvent")]

	[Event(name="securityError", type="flash.events.SecurityErrorEvent")]

			

	dynamic public class Service extends Proxy implements IEventDispatcher {

		private var _gateway : String;

		private var _nc : NetConnection;

		private var _destination : String;

		private var _dispatcher : EventDispatcher;	

		private var _operations : Dictionary;	

		

		/**

		 * 构建

		 * @param gateway remoting网关地址

		 * @param destination remoting目标地址

		 * @param objectEncoding remoting编码(amf0/amf3)

		 */

		public function Service(gateway : String,destination : String,objectEncoding : uint = 3) {

			_operations = new Dictionary(true);

			

			_gateway = gateway;

			_destination = destination;

			

			_dispatcher = new EventDispatcher(this);



			_nc = new NetConnection();

			_nc.client = this;

			_nc.objectEncoding = objectEncoding;

			_nc.addEventListener(NetStatusEvent.NET_STATUS, ncHandler);

			_nc.addEventListener(IOErrorEvent.IO_ERROR, ncHandler);

			_nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ncHandler);

			_nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, ncHandler);

			_nc.connect(_gateway);			

		}



		/**

		 * public

		 */

		/**

		 * 设置安全证书的用户名和密码

		 * @param userName 用户名

		 * @param password 密码

		 */

		public function setRemoteCredentials(userName : String,password : String) : void {

			_nc.addHeader("Credentials", false, { userid : userName, password : password });

		}

		

		/**

		 * remoting网关地址

		 */

		public function get gateway():String{

			return _gateway;

		}

		/**

		 * remoting目标地址

		 */

		public function get destination():String{

			return _destination;

		}

		

		public function set destination(value:String):void {

			_destination = value;

		}

		

		/**

		 * remoting编码

		 */

		public function get objectEncoding():uint{

			return _nc.objectEncoding;

		}

		

		public function set objectEncoding(value:uint):void{

			_nc.objectEncoding = value;

		}

		

		/**

		 * remoting连接

		 */

		public function get connenction():NetConnection{

			return _nc;

		}

		

		public function toString() : String {

			return "[Service gateway="+gateway+", destination="+destination+", objectEncoding="+objectEncoding+"]";

		}



		/**

		 * private

		 */

		private function ncHandler(event : Event) : void {

			switch(event.type){

				case AsyncErrorEvent.ASYNC_ERROR:

					break;

				default:

					dispatchEvent(event);

			}			

		}

		

		private function getOperation(name:String):Operation{

			var operation:Operation = _operations[name];

			if(operation == null) {

				operation = new Operation(this,name);

				_operations[name] = operation;				

			}

			return operation;

		}

		

		private function getLocalName(name:*):String{

			if(name is QName){

				return QName(name).localName;

			}

			return String(name);

		}



		/**

		 * proxy

		 */

		override flash_proxy function getProperty(name : *) : * {

			return getOperation(getLocalName(name));

		}



		override flash_proxy function callProperty( methodName : *, ...parametres : * ) : * {

			return getOperation(getLocalName(methodName)).send.apply(null,parametres);

		}		



		/**

		 * IEventDispatcher

		 */



		public function dispatchEvent(event : Event) : Boolean {

			// TODO: Auto-generated method stub

			return _dispatcher.dispatchEvent(event);

		}



		public function hasEventListener(type : String) : Boolean {

			// TODO: Auto-generated method stub

			return _dispatcher.hasEventListener(type);

		}



		public function willTrigger(type : String) : Boolean {

			// TODO: Auto-generated method stub

			return _dispatcher.willTrigger(type);

		}



		public function removeEventListener(type : String, listener : Function, useCapture : Boolean = false) : void {

			_dispatcher.removeEventListener(type, listener, useCapture);

		}



		public function addEventListener(type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = false) : void {

			_dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);

		}

	}

}

</textarea>

<br />

Operation类<br />

<textarea name="code" class="java" cols="45" rows="5">package com.klstudio.net.remoting {



	import com.klstudio.events.FaultEvent;

	import com.klstudio.events.ResultEvent;

	import flash.net.Responder;

	import flash.events.EventDispatcher;



	/**

	 * Operation 

	 * @author Kinglong(kinglong@gmail.com)

	 * @since:2010-8-3

	 */

	[Event(name="fault", type="com.klstudio.events.FaultEvent")]	

	[Event(name="result", type="com.klstudio.events.ResultEvent")]

	

	public class Operation extends EventDispatcher {

		private var _service:Service;

		private var _name:String;

		private var _responder:Responder;

		public function Operation(service:Service,name:String) {

			_service = service;

			_name = name;

			_responder = new Responder ( resultHandler, statusHandler );			

		}

		/**

		 * public

		 */

		public function get service():Service{

			return _service;

		}

		

		public function get name():String{

			return _name;

		}

		

		public function send(...args:Array):void{									

			var params:Array = [_service.destination + "." + _name,_responder];

			params = params.concat(args);

			_service.connenction.call.apply(_service.connenction,params);

		}

		

		override public function toString():String{

			return "[Operation name="+name+"]";

		}



		/**

		 * private

		 */

		private function resultHandler(info:Object):void{

			var event:ResultEvent = new ResultEvent(ResultEvent.RESULT, info);

			if(hasEventListener(ResultEvent.RESULT)){

				dispatchEvent(event);

			}else {

				_service.dispatchEvent(event);

			}

		}

		

		private function statusHandler(info:Object):void{			

			var fault:Fault = new Fault(info["code"], info["message"],info["details"]);

			var event:FaultEvent = new FaultEvent(FaultEvent.FAULT, fault);

			if(hasEventListener(FaultEvent.FAULT)){

				dispatchEvent(event);

			}else{

				_service.dispatchEvent(event);			

			}

		}

	}

}

</textarea>

<br />

Fault类<br />

<textarea name="code" class="java" cols="45" rows="5">package com.klstudio.net.remoting {



	/**

	 * Fault

	 * @author Kinglong(kinglong@gmail.com)

	 * @since:2010-8-3

	 */

	public class Fault extends Error {

		public var rootCause : Object;

		public var content : Object;



		protected var _faultCode : String;

		protected var _faultString : String;        

		protected var _faultDetail : String;



		public function Fault(faultCode : String, faultString : String, faultDetail : String = null) {

			super("faultCode:" + faultCode + " faultString:\'" + faultString + "\' faultDetail:\'" + faultDetail + "\'");

			_faultCode = faultCode;

			_faultString = faultString ? (faultString) : ("");

			_faultDetail = faultDetail;

		}



		public function get faultString() : String {

			return _faultString;

		}



		public function toString() : String {

			var str : String = "[Fault";

			str = str + (" faultString=\"" + faultString + "\"");

			str = str + (" faultCode=\"" + faultCode + "\"");

			str = str + (" faultDetail=\"" + faultDetail + "\"]");

			return str;

		}



		public function get faultCode() : String {

			return _faultCode;

		}



		public function get faultDetail() : String {

			return _faultDetail;

		}

	}

}

</textarea>

<br />

FaultEvent类<br />

<textarea name="code" cols="45" rows="5" class="java">package com.klstudio.events {

	import com.klstudio.net.remoting.Fault;



	import flash.events.Event;



	/**

	 * FaultEvent

	 * @author Kinglong(kinglong@gmail.com)

	 * @since:2010-8-3

	 */

	public class FaultEvent extends Event {

		public static const FAULT : String = "fault";	



		public var fault : Fault;



		public function FaultEvent(type : String, fault : Fault,bubbles : Boolean = false, cancelable : Boolean = false) {

			super(type, bubbles, cancelable);

			this.fault = fault;

		}

	}

}

</textarea>

<br />

ResultEvent类

<br />

<textarea name="code" class="java" cols="45" rows="5">package com.klstudio.events {

	import flash.events.Event;



	/**

	 * ResultEvent

	 * @author Kinglong(kinglong@gmail.com)

	 * @since:2010-8-3

	 */

	public class ResultEvent extends Event {

		public static const RESULT:String = "result";	



		public var result : Object;



		public function ResultEvent(type : String, result : Object,bubbles : Boolean = false, cancelable : Boolean = false) {

			super(type, bubbles, cancelable);

			this.result = result;

		}

	}

}

</textarea>

<br />

调用实例<br />

<textarea name="code" class="java" cols="45" rows="5">package test {

	import com.klstudio.events.FaultEvent;

	import com.klstudio.events.ResultEvent;

	import flash.events.Event;

	import flash.events.MouseEvent;

	import com.klstudio.net.remoting.Service;



	import flash.display.Sprite;



	/**

	 * 

	 * @author Kinglong(kinglong@gmail.com)

	 * @since:2010-8-3

	 */

	public class TestRemoting extends Sprite {

		private var _service:Service;

		public function TestRemoting() {

			_service = new Service("http://localhost:8080/test/messagebroker/amf","Remoting");

			_service.addEventListener(FaultEvent.FAULT, faultHandler);

			stage.addEventListener(MouseEvent.CLICK, stageHandler);	

		}

		

		private function stageHandler(event:Event):void{

			_service.getTitle.addEventListener(ResultEvent.RESULT,getTitleHandler);

			_service.getTitle();

		}



		private function getTitleHandler(event:ResultEvent):void{

			trace("result>" + event.result);

		}

		

		private function faultHandler(event:FaultEvent):void{

			trace(event.fault.toString());

		}

	}

}

分享到:
评论

相关推荐

    FluorineFx + Flash + VS2010 交互配置方式与实例

    4. **创建服务端类**:在.NET项目中,创建一个公共类,该类将作为Flash客户端调用的服务接口。例如,创建一个名为`YourClass`的类,并添加适当的公共方法。 ```csharp using System; using FluorineFx/remoting; ...

    BlazeDS与Spring 的结合

    3. Flex Proxy Service (FPS): 为了解决 Flash Player 安全限制,FPS 允许跨域访问远程数据,或者确保 SWF 文件与数据源位于同一服务器或同域。 4. Remoting Service: 类似于 Web 服务,但使用 AMF 协议而非 SOAP,...

    FluorineFx C#搭建简单小例子

    FluorineFx是.NET平台上一个开源的Adobe Flash Remoting实现,它允许C#开发者与Flash客户端进行双向通信,使得Flex、Flash等基于ActionScript的应用能够无缝地与服务器端的.NET服务交互。在这个"FluorineFx C#搭建...

    flex与后台通讯方式

    Flex是Adobe公司开发的一种用于创建富互联网应用程序(RIA)的开放源代码框架,它主要基于ActionScript编程语言和Flash Player运行环境。在Flex应用中,与后台数据交换是实现功能的关键部分,尤其对于处理数据库数据...

    flex的rpc错误整理

    了解Flex AS3和Fluorine之间的数据类型转换规则可以帮助解决这类问题。 4. **NetConnection.Call.Failed: HTTP: Status 404: url...** 404错误表明Flex无法找到指定的URL,可能是Root URL设置不正确。确保在发布...

    FLEX个人网站管理系统源码v3.1source.rar

    AS3(ActionScript 3.0)是Flash Player和Adobe AIR支持的脚本语言,提供了面向对象编程的能力,是MXML组件的驱动引擎。在FLEX中,MXML与AS3相结合,使得开发者可以分离界面设计和业务逻辑,提高代码的可读性和可...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    首先安装 Flex Builder 3,可以在 Adobe 的官方网站获得 30 天免费试用版。然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project ...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    首先安装 Flex Builder 3,可以在 Adobe 的官方网站获得 30 天免费试用版。然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project ...

    red5中使用remoteObject

    在Red5中使用RemoteObject是实现Flash客户端与服务器端通信的一种技术。Red5是一个开源的流媒体服务器,它支持实时消息协议(RTMP)、实时传输协议(RTSP)以及HTTP流等多种流媒体交互方式。RemoteObject是Adobe ...

    BlazeDS实现flex与java通信

    在Flex客户端,我们可以利用 BlazeDS 提供的Service组件来与Java后端通信,如 RemoteObject、HTTPService 和 WebService,它们分别对应于Remoting、HTTP请求和SOAP服务。 7. **Java后端接口设计** Java后端需要...

    flex中文帮助文档

    - **部署选项**:Flex应用既可以在本地计算机上编译并通过Web服务发布,也可以与Flex Data Services、ColdFusion Flash Remoting Service或其他服务器技术结合,用于更复杂的B/S架构应用开发。 #### 四、示例代码...

    spring flex实例

    6. **Service Proxy**:Spring Flex 自动生成 Flex 客户端的服务代理类,使得 Flex 应用可以轻松调用 Spring 容器中的服务。这简化了客户端与服务器之间的通信,无需手动编写复杂的网络代码。 7. **Data Binding**...

    Flex连接数据库的方法

    - **数据服务**:这些服务可以是基于Flash Remoting的BlazeDS,或者使用HTTP的LCDS(LiveCycle Data Services)。它们负责处理客户端与服务器之间的数据交换,包括数据库查询、更新等操作。 2. **连接组件** - **...

    Flex与.Net互操作

    3. 直连HTTP服务:Flex可以直接通过HTTP请求与.NET的HTTP服务接口交互,例如使用HTTPService或DataService类。这种情况下,数据通常以JSON或XML格式进行封装,然后在客户端和服务器端之间传递。 在实际开发中,为了...

    sql flex (最简单的连接方式)

    3. BlazeDS:BlazeDS是Adobe提供的一个服务器端组件,它可以将Java服务暴露为AMF(Action Message Format)消息,从而让Flex客户端可以轻松地与Java后端进行通信,包括SQL数据库。 4. ActionScript与SQL交互:在...

    Flex+BlazeDB+mysql实现数据交互

    3. **配置Flex客户端**:在Flex的MXML文件中,创建一个`RemoteObject`组件,指定服务目的地`destination`(如`admin`)和消息代理URL(endpoint)。例如,`endpoint=...

    flex连接数据库实例

    AMF是一种二进制格式,用于在服务器和客户端之间高效传输数据,常用于与Flex交互的服务器端技术如Flash remoting或BlazeDS。 在提供的文件列表中,`JavaS.mxml`可能是主程序文件,它是Flex应用程序的基础,包含了...

Global site tag (gtag.js) - Google Analytics