- 浏览: 32813 次
- 性别:
- 来自: 上海
最近访客 更多访客>>
最新评论
-
myjave:
哦 是我搞错了这个怎么使用
ArtDigit 艺术数字类 -
myjave:
这个类拷贝靠flash里报错
ArtDigit 艺术数字类
AS3版Flash Remoting客户端类-Service类
这段时间在研究Flash Remoting技术,之前在Flash里调用Remoting的话,只能通过NetConnection类调用,但写起来比较麻烦,同时方法调用不直观。
而在Flex里用RemoteObject类用起来比较直观,但它是集成在Flex里了,功能还挺复杂,还在Flash里不方便调用,所以我参考RemoteObject类写了一个简化的AS3版类-Service类,我现在把相关代码共享出来。
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()); } } }
发表评论
-
ArtDigit 艺术数字类
2012-07-28 00:01 1039此类主要用于使用动画元件来显示对应的数字,并支持数字缓冲滚动显 ... -
Cookie类第三版
2012-07-28 00:01 944针对原来Cookie类使用起来不太方便,去掉用不上的冗余方法, ... -
位图工具BitmapDataUtil类-getImageMapVector方法演示
2012-07-27 15:35 0今天把BitmapDataUtil工具类中的getImageM ... -
位图工具BitmapDataUtil类-getRealImageRect方法演示
2012-07-28 00:02 1104位图是flash众多类,使用很频繁的一个,我这边根据自己的实际 ... -
flash动画编程学习研究-机器人传球演示
2012-07-27 15:31 995这几天在看Keith Peters的书《Foundation ... -
排序算法演示
2012-07-28 00:01 946下面是排序算法演示程序,比较直观显示排序算法运行规律 该演 ... -
常用数据集合类-Map,Queue,Stack,Collection,List,Set
2012-07-28 00:01 1164之前写过一次有关常用数据集合类,但今天简单回顾了一下, ... -
Flash算法-摆动算法
2012-07-27 15:22 1325[代码] package com.klstudio.algor ... -
Flash游戏-SlidingPuzzle滑块拼图游戏
2012-07-27 15:18 915最近在研究Flash游戏的算法,发现同一种游戏能有很多种算法, ... -
优化Flash平台的性能(Adobe提供)
2012-07-27 15:13 907今正好看到了“优化Flash平台的性能&a ... -
[AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
2007-08-18 15:56 1700[AS3]URLLoader+URLRequest+JPGEn ... -
[AS3]FLVStream类-检测flv文件类型的工具类
2007-08-06 09:20 614[AS3]FLVStream类-检测flv文件类型的工具类 ... -
[AS3]Flash在线图片编辑器
2007-07-24 06:39 5032[AS3]Flash在线图片编辑器 进行二个星期,终于把 ... -
[AS3]更新Tracer组件并公布控制台源程序
2007-07-23 02:42 335此次更新版本到1.2,修正一些对象的显示Bug; 由于原来 ... -
[AS3]Tracer-Flash代码调试类
2007-07-19 11:01 533[AS3]Tracer-Flash代码调试类【组件版本】:1. ... -
[AS1]三帧代码实现图片轮换显示
2007-07-08 02:08 508[AS1]三帧代码实现图片轮换显示本来这段代码是写给我的一个网 ... -
[AS3]IconDataManager-图标数据管理类
2007-07-06 08:00 386[AS3]IconDataManager-图标数据管理类【功能 ... -
有关“Flash在线图片编辑”功能的开发进度1
2007-07-03 10:30 2139有关“Flash在线图片编辑”功能的开发进度1 实现在线对 ... -
[AS3]DisplayEffect组件
2007-06-28 08:08 407[AS3]DisplayEffect组件【组件版本】:0.5【 ... -
[AS3]ImageEffect组件版本更新
2007-06-27 15:16 418[AS3]ImageEffect组件版本更新 【组件版本】 ...
相关推荐
4. **创建服务端类**:在.NET项目中,创建一个公共类,该类将作为Flash客户端调用的服务接口。例如,创建一个名为`YourClass`的类,并添加适当的公共方法。 ```csharp using System; using FluorineFx/remoting; ...
3. Flex Proxy Service (FPS): 为了解决 Flash Player 安全限制,FPS 允许跨域访问远程数据,或者确保 SWF 文件与数据源位于同一服务器或同域。 4. Remoting Service: 类似于 Web 服务,但使用 AMF 协议而非 SOAP,...
FluorineFx是.NET平台上一个开源的Adobe Flash Remoting实现,它允许C#开发者与Flash客户端进行双向通信,使得Flex、Flash等基于ActionScript的应用能够无缝地与服务器端的.NET服务交互。在这个"FluorineFx C#搭建...
Flex是Adobe公司开发的一种用于创建富互联网应用程序(RIA)的开放源代码框架,它主要基于ActionScript编程语言和Flash Player运行环境。在Flex应用中,与后台数据交换是实现功能的关键部分,尤其对于处理数据库数据...
了解Flex AS3和Fluorine之间的数据类型转换规则可以帮助解决这类问题。 4. **NetConnection.Call.Failed: HTTP: Status 404: url...** 404错误表明Flex无法找到指定的URL,可能是Root URL设置不正确。确保在发布...
AS3(ActionScript 3.0)是Flash Player和Adobe AIR支持的脚本语言,提供了面向对象编程的能力,是MXML组件的驱动引擎。在FLEX中,MXML与AS3相结合,使得开发者可以分离界面设计和业务逻辑,提高代码的可读性和可...
首先安装 Flex Builder 3,可以在 Adobe 的官方网站获得 30 天免费试用版。然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project ...
首先安装 Flex Builder 3,可以在 Adobe 的官方网站获得 30 天免费试用版。然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project ...
在Red5中使用RemoteObject是实现Flash客户端与服务器端通信的一种技术。Red5是一个开源的流媒体服务器,它支持实时消息协议(RTMP)、实时传输协议(RTSP)以及HTTP流等多种流媒体交互方式。RemoteObject是Adobe ...
在Flex客户端,我们可以利用 BlazeDS 提供的Service组件来与Java后端通信,如 RemoteObject、HTTPService 和 WebService,它们分别对应于Remoting、HTTP请求和SOAP服务。 7. **Java后端接口设计** Java后端需要...
- **部署选项**:Flex应用既可以在本地计算机上编译并通过Web服务发布,也可以与Flex Data Services、ColdFusion Flash Remoting Service或其他服务器技术结合,用于更复杂的B/S架构应用开发。 #### 四、示例代码...
6. **Service Proxy**:Spring Flex 自动生成 Flex 客户端的服务代理类,使得 Flex 应用可以轻松调用 Spring 容器中的服务。这简化了客户端与服务器之间的通信,无需手动编写复杂的网络代码。 7. **Data Binding**...
- **数据服务**:这些服务可以是基于Flash Remoting的BlazeDS,或者使用HTTP的LCDS(LiveCycle Data Services)。它们负责处理客户端与服务器之间的数据交换,包括数据库查询、更新等操作。 2. **连接组件** - **...
3. 直连HTTP服务:Flex可以直接通过HTTP请求与.NET的HTTP服务接口交互,例如使用HTTPService或DataService类。这种情况下,数据通常以JSON或XML格式进行封装,然后在客户端和服务器端之间传递。 在实际开发中,为了...
3. BlazeDS:BlazeDS是Adobe提供的一个服务器端组件,它可以将Java服务暴露为AMF(Action Message Format)消息,从而让Flex客户端可以轻松地与Java后端进行通信,包括SQL数据库。 4. ActionScript与SQL交互:在...
3. **配置Flex客户端**:在Flex的MXML文件中,创建一个`RemoteObject`组件,指定服务目的地`destination`(如`admin`)和消息代理URL(endpoint)。例如,`endpoint=...
AMF是一种二进制格式,用于在服务器和客户端之间高效传输数据,常用于与Flex交互的服务器端技术如Flash remoting或BlazeDS。 在提供的文件列表中,`JavaS.mxml`可能是主程序文件,它是Flex应用程序的基础,包含了...