收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 3102|回复: 0

[AS3] AS3版Flash Remoting客户端类-Service类

[复制链接]
发表于 2010-8-3 15:05:43 | 显示全部楼层 |阅读模式
AS3版Flash Remoting客户端类-Service类
原文地址:http://www.klstudio.com/post/215.html
    这段时间在研究Flash Remoting技术,之前在Flash里调用Remoting的话,只能通过NetConnection类调用,但写起来比较麻烦,同时方法调用不直观。
而在Flex里用RemoteObject类用起来比较直观,但它是集成在Flex里了,功能还挺复杂,还在Flash里不方便调用,所以我参考RemoteObject类写了一个简化的AS3版类-Service类,我现在把相关代码共享出来。
Service类
  1. package com.klstudio.net.remoting {       

  2.         import flash.net.NetConnection;
  3.        
  4.         import flash.events.EventDispatcher;
  5.         import flash.events.Event;
  6.         import flash.events.IEventDispatcher;
  7.         import flash.events.AsyncErrorEvent;
  8.         import flash.events.IOErrorEvent;
  9.         import flash.events.NetStatusEvent;
  10.         import flash.events.SecurityErrorEvent;       
  11.        
  12.         import flash.utils.flash_proxy;
  13.         import flash.utils.Proxy;
  14.         import flash.utils.Dictionary;

  15.         /**
  16.          * Remoting服务
  17.          * @author Kinglong(kinglong@gmail.com)
  18.          * @since:2010-8-3
  19.          */
  20.         [Event(name="fault", type="com.klstudio.events.FaultEvent")]
  21.         [Event(name="result", type="com.klstudio.events.ResultEvent")]
  22.        
  23.         [Event(name="netStatus", type="flash.events.NetStatusEvent")]
  24.         [Event(name="ioError", type="flash.events.IOErrorEvent")]
  25.         [Event(name="securityError", type="flash.events.SecurityErrorEvent")]
  26.                        
  27.         dynamic public class Service extends Proxy implements IEventDispatcher {
  28.                 private var _gateway : String;
  29.                 private var _nc : NetConnection;
  30.                 private var _destination : String;
  31.                 private var _dispatcher : EventDispatcher;       
  32.                 private var _operations : Dictionary;       
  33.                
  34.                 /**
  35.                  * 构建
  36.                  * @param gateway remoting网关地址
  37.                  * @param destination remoting目标地址
  38.                  * @param objectEncoding remoting编码(amf0/amf3)
  39.                  */
  40.                 public function Service(gateway : String,destination : String,objectEncoding : uint = 3) {
  41.                         _operations = new Dictionary(true);
  42.                        
  43.                         _gateway = gateway;
  44.                         _destination = destination;
  45.                        
  46.                         _dispatcher = new EventDispatcher(this);

  47.                         _nc = new NetConnection();
  48.                         _nc.client = this;
  49.                         _nc.objectEncoding = objectEncoding;
  50.                         _nc.addEventListener(NetStatusEvent.NET_STATUS, ncHandler);
  51.                         _nc.addEventListener(IOErrorEvent.IO_ERROR, ncHandler);
  52.                         _nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ncHandler);
  53.                         _nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, ncHandler);
  54.                         _nc.connect(_gateway);                       
  55.                 }

  56.                 /**
  57.                  * public
  58.                  */
  59.                 /**
  60.                  * 设置安全证书的用户名和密码
  61.                  * @param userName 用户名
  62.                  * @param password 密码
  63.                  */
  64.                 public function setRemoteCredentials(userName : String,password : String) : void {
  65.                         _nc.addHeader("Credentials", false, { userid : userName, password : password });
  66.                 }
  67.                
  68.                 /**
  69.                  * remoting网关地址
  70.                  */
  71.                 public function get gateway():String{
  72.                         return _gateway;
  73.                 }
  74.                 /**
  75.                  * remoting目标地址
  76.                  */
  77.                 public function get destination():String{
  78.                         return _destination;
  79.                 }
  80.                
  81.                 public function set destination(value:String):void {
  82.                         _destination = value;
  83.                 }
  84.                
  85.                 /**
  86.                  * remoting编码
  87.                  */
  88.                 public function get objectEncoding():uint{
  89.                         return _nc.objectEncoding;
  90.                 }
  91.                
  92.                 public function set objectEncoding(value:uint):void{
  93.                         _nc.objectEncoding = value;
  94.                 }
  95.                
  96.                 /**
  97.                  * remoting连接
  98.                  */
  99.                 public function get connenction():NetConnection{
  100.                         return _nc;
  101.                 }
  102.                
  103.                 public function toString() : String {
  104.                         return "[Service gateway="+gateway+", destination="+destination+", objectEncoding="+objectEncoding+"]";
  105.                 }

  106.                 /**
  107.                  * private
  108.                  */
  109.                 private function ncHandler(event : Event) : void {
  110.                         switch(event.type){
  111.                                 case AsyncErrorEvent.ASYNC_ERROR:
  112.                                         break;
  113.                                 default:
  114.                                         dispatchEvent(event);
  115.                         }                       
  116.                 }
  117.                
  118.                 private function getOperation(name:String):Operation{
  119.                         var operation:Operation = _operations[name];
  120.                         if(operation == null) {
  121.                                 operation = new Operation(this,name);
  122.                                 _operations[name] = operation;                               
  123.                         }
  124.                         return operation;
  125.                 }
  126.                
  127.                 private function getLocalName(name:*):String{
  128.                         if(name is QName){
  129.                                 return QName(name).localName;
  130.                         }
  131.                         return String(name);
  132.                 }

  133.                 /**
  134.                  * proxy
  135.                  */
  136.                 override flash_proxy function getProperty(name : *) : * {
  137.                         return getOperation(getLocalName(name));
  138.                 }

  139.                 override flash_proxy function callProperty( methodName : *, ...parametres : * ) : * {
  140.                         return getOperation(getLocalName(methodName)).send.apply(null,parametres);
  141.                 }               

  142.                 /**
  143.                  * IEventDispatcher
  144.                  */

  145.                 public function dispatchEvent(event : Event) : Boolean {
  146.                         // TODO: Auto-generated method stub
  147.                         return _dispatcher.dispatchEvent(event);
  148.                 }

  149.                 public function hasEventListener(type : String) : Boolean {
  150.                         // TODO: Auto-generated method stub
  151.                         return _dispatcher.hasEventListener(type);
  152.                 }

  153.                 public function willTrigger(type : String) : Boolean {
  154.                         // TODO: Auto-generated method stub
  155.                         return _dispatcher.willTrigger(type);
  156.                 }

  157.                 public function removeEventListener(type : String, listener : Function, useCapture : Boolean = false) : void {
  158.                         _dispatcher.removeEventListener(type, listener, useCapture);
  159.                 }

  160.                 public function addEventListener(type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = false) : void {
  161.                         _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
  162.                 }
  163.         }
  164. }
复制代码

Operation类
  1. package com.klstudio.net.remoting {

  2.         import com.klstudio.events.FaultEvent;
  3.         import com.klstudio.events.ResultEvent;
  4.         import flash.net.Responder;
  5.         import flash.events.EventDispatcher;

  6.         /**
  7.          * Operation
  8.          * @author Kinglong(kinglong@gmail.com)
  9.          * @since:2010-8-3
  10.          */
  11.         [Event(name="fault", type="com.klstudio.events.FaultEvent")]       
  12.         [Event(name="result", type="com.klstudio.events.ResultEvent")]
  13.        
  14.         public class Operation extends EventDispatcher {
  15.                 private var _service:Service;
  16.                 private var _name:String;
  17.                 private var _responder:Responder;
  18.                 public function Operation(service:Service,name:String) {
  19.                         _service = service;
  20.                         _name = name;
  21.                         _responder = new Responder ( resultHandler, statusHandler );                       
  22.                 }
  23.                 /**
  24.                  * public
  25.                  */
  26.                 public function get service():Service{
  27.                         return _service;
  28.                 }
  29.                
  30.                 public function get name():String{
  31.                         return _name;
  32.                 }
  33.                
  34.                 public function send(...args:Array):void{                                                                       
  35.                         var params:Array = [_service.destination + "." + _name,_responder];
  36.                         params = params.concat(args);
  37.                         _service.connenction.call.apply(_service.connenction,params);
  38.                 }
  39.                
  40.                 override public function toString():String{
  41.                         return "[Operation name="+name+"]";
  42.                 }

  43.                 /**
  44.                  * private
  45.                  */
  46.                 private function resultHandler(info:Object):void{
  47.                         var event:ResultEvent = new ResultEvent(ResultEvent.RESULT, info);
  48.                         if(hasEventListener(ResultEvent.RESULT)){
  49.                                 dispatchEvent(event);
  50.                         }else {
  51.                                 _service.dispatchEvent(event);
  52.                         }
  53.                 }
  54.                
  55.                 private function statusHandler(info:Object):void{                       
  56.                         var fault:Fault = new Fault(info["code"], info["message"],info["details"]);
  57.                         var event:FaultEvent = new FaultEvent(FaultEvent.FAULT, fault);
  58.                         if(hasEventListener(FaultEvent.FAULT)){
  59.                                 dispatchEvent(event);
  60.                         }else{
  61.                                 _service.dispatchEvent(event);                       
  62.                         }
  63.                 }
  64.         }
  65. }
复制代码

Fault类
  1. package com.klstudio.net.remoting {

  2.         /**
  3.          * Fault
  4.          * @author Kinglong(kinglong@gmail.com)
  5.          * @since:2010-8-3
  6.          */
  7.         public class Fault extends Error {
  8.                 public var rootCause : Object;
  9.                 public var content : Object;

  10.                 protected var _faultCode : String;
  11.                 protected var _faultString : String;        
  12.                 protected var _faultDetail : String;

  13.                 public function Fault(faultCode : String, faultString : String, faultDetail : String = null) {
  14.                         super("faultCode:" + faultCode + " faultString:\'" + faultString + "\' faultDetail:\'" + faultDetail + "\'");
  15.                         _faultCode = faultCode;
  16.                         _faultString = faultString ? (faultString) : ("");
  17.                         _faultDetail = faultDetail;
  18.                 }

  19.                 public function get faultString() : String {
  20.                         return _faultString;
  21.                 }

  22.                 public function toString() : String {
  23.                         var str : String = "[Fault";
  24.                         str = str + (" faultString=\"" + faultString + "\"");
  25.                         str = str + (" faultCode=\"" + faultCode + "\"");
  26.                         str = str + (" faultDetail=\"" + faultDetail + "\"]");
  27.                         return str;
  28.                 }

  29.                 public function get faultCode() : String {
  30.                         return _faultCode;
  31.                 }

  32.                 public function get faultDetail() : String {
  33.                         return _faultDetail;
  34.                 }
  35.         }
  36. }
复制代码

FaultEvent类
  1. package com.klstudio.events {
  2.         import com.klstudio.net.remoting.Fault;

  3.         import flash.events.Event;

  4.         /**
  5.          * FaultEvent
  6.          * @author Kinglong(kinglong@gmail.com)
  7.          * @since:2010-8-3
  8.          */
  9.         public class FaultEvent extends Event {
  10.                 public static const FAULT : String = "fault";       

  11.                 public var fault : Fault;

  12.                 public function FaultEvent(type : String, fault : Fault,bubbles : Boolean = false, cancelable : Boolean = false) {
  13.                         super(type, bubbles, cancelable);
  14.                         this.fault = fault;
  15.                 }
  16.         }
  17. }
复制代码

ResultEvent类
  1. package com.klstudio.events {
  2.         import flash.events.Event;

  3.         /**
  4.          * ResultEvent
  5.          * @author Kinglong(kinglong@gmail.com)
  6.          * @since:2010-8-3
  7.          */
  8.         public class ResultEvent extends Event {
  9.                 public static const RESULT:String = "result";       

  10.                 public var result : Object;

  11.                 public function ResultEvent(type : String, result : Object,bubbles : Boolean = false, cancelable : Boolean = false) {
  12.                         super(type, bubbles, cancelable);
  13.                         this.result = result;
  14.                 }
  15.         }
  16. }
复制代码

调用实例
  1. package test {
  2.         import com.klstudio.events.FaultEvent;
  3.         import com.klstudio.events.ResultEvent;
  4.         import flash.events.Event;
  5.         import flash.events.MouseEvent;
  6.         import com.klstudio.net.remoting.Service;

  7.         import flash.display.Sprite;

  8.         /**
  9.          *
  10.          * @author Kinglong(kinglong@gmail.com)
  11.          * @since:2010-8-3
  12.          */
  13.         public class TestRemoting extends Sprite {
  14.                 private var _service:Service;
  15.                 public function TestRemoting() {
  16.                         _service = new Service("http://localhost:8080/test/messagebroker/amf","Remoting");
  17.                         _service.addEventListener(FaultEvent.FAULT, faultHandler);
  18.                         stage.addEventListener(MouseEvent.CLICK, stageHandler);       
  19.                 }
  20.                
  21.                 private function stageHandler(event:Event):void{
  22.                         _service.getTitle.addEventListener(ResultEvent.RESULT,getTitleHandler);
  23.                         _service.getTitle();
  24.                 }

  25.                 private function getTitleHandler(event:ResultEvent):void{
  26.                         trace("result>" + event.result);
  27.                 }
  28.                
  29.                 private function faultHandler(event:FaultEvent):void{
  30.                         trace(event.fault.toString());
  31.                 }
  32.         }
  33. }
复制代码

评分

参与人数 1威望 +2 收起 理由
libins + 2 谢谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( ICP05002321 )  

GMT+8, 2019-7-24 12:39 , Processed in 0.093514 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表