打印

[AS3] swf通信代理类,多个3.0与2.0swf之间的通信,共享对象在不同版本的swf间共享

代理类由包括3个部分~以LocalConnection作为基类,主体是一个由2.0写的一个AgencySWF类~主要用于连接2.0代理类(ClientAgencySWF_2)实例或3.0代理类(ClientAgencySWF)并兼担共享数据存处的载体~

AgencySWF类
复制内容到剪贴板
代码:
class AgencySWF extends LocalConnection {
    private var conName = 'agencySWF';
    private var $$sending_lc;
    public var text;
    public var Trace_Bool;
    private var Member_ID;
    private var txt;
    //private var _root.SO:SharedObject;
    public function AgencySWF(link) {
        var obj = {MP3UrlArr:[], MP3NameArr:[], ArtistArr:[], MoodArr:[], MP3InfoArr:[]};
        var arr = ["我是共享对象","我是共享对象","我是共享对象","我是共享对象"];
        // var arr=[obj,obj,obj,obj];
        _root.SO = SharedObject.getLocal("AgencySo");
        _root.SO.data.cookie == undefined ? _root.SO.data.cookie=arr : '';
        _root.SO.data.cookie = arr;
        ;
        if (link != undefined) {
            conName = link;
        }
        $$sending_lc = this;
        this.$$sending_lc.connect(conName);
        this.$$sending_lc.onStatus = function(infoObject:Object) {
            switch (infoObject.level) {
                case 'status' :
                    ;
                    trace(" 中介 回调 成功 ");
                    break;
                case 'error' :
                    trace("LocalConnection encountered an error.");
                    break;
            }
        };
    }
    //获取用户id
    private function setimd(arg) {
        trace(arg.imd);
        Member_ID = arg.imd;
        text = "Member_ID="+Member_ID;
        return Member_ID;
    }
    private function getimd(arg) {
        trace("call child success");
        return Member_ID;
    }
    //调用外部接口
    public function SendFunc(func, res) {
        
        $$sending_lc.send("agencySWF","agencyFunc",conName,func,res);
    }
    //外部调用接口  (外部连接名,调用本类的函数,参数)
    public function agencyFunc(callconnet, callfunc, callinfo) {
        text = "";
        var _l3 = {imd:_root.Member_ID, info:callinfo};
        if (Trace_Bool) {
            trace("------呼叫中介函数成功------");
            trace("ReConnect::"+callconnet+"   Func::"+callfunc);
            text = _root.txt.text+"ReConnect::"+callconnet+"   Func::"+callfunc;
            trace("   arguments::");
            for (var i in _13) {
                trace(i+'=='+_13[i]);
            }
        }
        $$sending_lc.send(callconnet,callfunc,_l3);
    }
    //外部接口函数 (外部连接名,要调用的本类方法,参数)
    public function callAgencyFunc(callConnet, callFunc, callInfo) {
        trace("AgencySWF Get ["+callConnet+"] Call  Success");
        var Result = {imd:Menber_ID, Info:this[callFunc](callInfo)};
          $$sending_lc.send(callConnet,callFunc,Result);
    }
    //调试开关
    private function Trace(bool) {
        $$sending_lc.send("agencySWF","setTrace");
    }
    //创建shareObject属性
    private function createShareObject(varName:String, newVar) {
        _root.SO.data[arguments[0]] == undefined ? my_so.data[arguments[0]]=arguments[1] : '';
        return _root.SO.data[arguments[0]];
    }
    private function getShareObject(arg) {
        
        return _root.SO.data[arg[0]];
    }
    //设置shareObject属性
    private function setShareObject(arg) {
        _root.SO.data[arg[0]] = arg[1];;
        return _root.SO.data[arg[0]];
    }
    public function SendMessage(arg) {
    trace('sendMessage:'+arguments)
    var client_id=arg[0];
    var func=arg[1]
    arg.shift()
    arg.shift()
    _root.setConnet(client_id,client_id,func,arg);
        //$$sending_lc.send(callConnet,callFunc,Result);
    }
}
ClientAgencySWF_2类
复制内容到剪贴板
代码:
dynamic class ClientAgencySWF_2 extends LocalConnection {
    private var conName = 'lc_2';
    private var $$sending_lc;
    public var text;
    public var Trace_Bool;
    private var Member_ID;
    private var txt;
    public function ClientAgencySWF_2(link) {
        if (link != undefined) {
            conName = link;
        }
        $$sending_lc = this;
        this.$$sending_lc.connect(conName);
        this.$$sending_lc.onStatus = function(infoObject:Object) {
            switch (infoObject.level) {
                case 'status' :
                
                    trace("2.0Client successful");
                    break;
                case 'error' :
                    trace("listCall err");
                    break;
            }
        };
    }
    private function getimd(arg) {
        trace("call child success");
        return Member_ID;
    }
    //调用外部接口
    public function SendFunc(func, res) {
        
        $$sending_lc.send("agencySWF","callAgencyFunc",conName,func,res);
    }
    //创建shareObject属性
    private function createShareObject(varName:String, newVar) {
    }
    //设置shareObject属性
    private function setShareObject(arg) {
        trace("result::"+arg);
        
    }
    private function getShareObject(arg) {
        trace("result info to 2.0client::"+arg);
        
    }
    
}
ClientAgencySWF类
复制内容到剪贴板
代码:
package {
    import flash.net.*;
    import flash.display.*;
    import flash.events.*;
    public class ClientAgencySWF extends EventDispatcher {
        public static  const SUCCESS:String="ClientAgencySWFSuccess";
        //public static  const ERROR:String="webServerError";
        private var conn:LocalConnection;
        private var Func:Function;
        public var conName:String="lc";
        public var imd;
        public var Result;
        public function ClientAgencySWF(link) {
            conn = new LocalConnection();
            conn.client = this;
            try {
                conName=link;
                conn.connect(conName);
                trace('Create ClientAgencySWF Success');
            } catch (error:ArgumentError) {
                trace("Can't connect...the connection name is already being used by another SWF");
            }
        }
        public function getShareObject(arg) {
            Result=arg;
            trace('3.0Client result::'+arg.Info)
            dispatchEvent(new Event(ClientAgencySWF.SUCCESS));
        }
        public function getimd(arg):void {
            trace('result info to 3.0client: '+arg);
            imd=arg.imd;
            //trace("close connet")
            
        }
        public function setShareObject(arg) {
            Result=arg;
            dispatchEvent(new Event(ClientAgencySWF.SUCCESS));
            //trace("result:"+arg)
            
        }
        public function SendFunc(func:String, res) {
            //conName本类的连接名,func调用的接口方法,res传递的参数
            trace('Calling agencySWF',func,res);
            conn.send("agencySWF", "callAgencyFunc", conName, func, res);
        };
        public function updataFunc(arg){
            trace("result info to 3.0client:"+arg.Info)
            
            
            }
        
        public function onStatus(event:StatusEvent):void {
            switch (event.level) {
                case "status" :
                    trace("3.0client succeeded");
                    break;
                case "error" :
                    trace("LocalConnection.send() failed");
                    break;
            }
        }
    }
}
下载例子 http://wxsr.blogbus.com/files/12043782540.rar

[ 本帖最后由 wxsr 于 2008-3-1 21:34 编辑 ]
21233644群
运行测试时请新建一个2.0文件 AgencySWF
住场景第一帧拷贝代码
复制内容到剪贴板
代码:
var client3_:AgencySWF = new AgencySWF("agencySWF");
var client2_:AgencySWF = new AgencySWF("agencySWF2");
function setConnet(id,connetName,func,arg){
    trace(arguments)
    trace(_root[id])
    _root[id].callAgencyFunc(connetName,func,arg)
    }
再建一个2.0fla (client2.0fla)

第一帧代码
复制内容到剪贴板
代码:
var ClientAgency :ClientAgencySWF_2= new ClientAgencySWF_2("client2_");
//(中介的方法,[要连接到的对象连接,要调用的对象的方法,要传输给对象的参数]
b1.onPress=function(){
ClientAgency.SendFunc('SendMessage',['client3_','getShareObject',['cookie']]);
}
b2.onPress=function(){
ClientAgency.SendFunc('getShareObject',['cookie']);
}
并于场景放两个按钮
命名为:b1,b2
再建一个3.0fla (client3.0fla)

第一帧代码
复制内容到剪贴板
代码:
var ClientAgency:ClientAgencySWF=new ClientAgencySWF("client3_");
b1.addEventListener(MouseEvent.CLICK,callFunc)
function callFunc(event:MouseEvent){
ClientAgency.SendFunc('getShareObject',['cookie'])}
以上操作完毕请先运行代理
AgencySWF
在运行client3.0.fla
进行度取AgencySWF信息测试
再后运行client2.0fla
按b2进行读取
AgencySWF共享信息测试
按b1进行调用client3.0.fla的getShareObject方法测试
21233644群
可惜始终有些东西传不到
什么东西传不到?
这个东西要扩展很简单葛
21233644群

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
核心就是LocalConnection吧,不错,好像LocalConnection的前提是两个swf在一个客户端运行。如果想要多个客户端的通信,不是是否会遇到麻烦,

猜想中,没时间测试。
闭门修炼~~

TOP

  刚自己做了一个webservice+localconnection+sharedObject的小东西,
发现在as3给as2传值的时候要传string类型,不然的话多半是读不到任何值的object,能愁死人

TOP