AS3 服务端、客户端协议路由简单写法 ---- AS3 Server、Client Router Demo

来源:互联网 发布:c 获取mac物理地址 编辑:程序博客网 时间:2024/05/21 14:07
/**
 * @author Jave.Lin(afeng) * 指定bytes数据,执行解码 * @param bytes 指定bytes数据 */public function decode(bytes:ByteArray):Object{bytes.position=0;bytes.endian=_endian;var decoderID:uint=bytes.readUnsignedShort();//decoderIDvar decoder:Function=_decoderDic[decoderID];//find decoder from cachestry{if(decoder!=null)return decoder(bytes);var key:String = decoderID.toString(16).toLowerCase();var decoderName:String=DECODER_PREFIX+"0x"+key;//decoderNamedecoder=this[decoderName];//find decoderif(decoder!=null){_decoderDic[decoderID]=decoder;//caches decoderreturn decoder(bytes);}return null;}catch(er:Error){var msg:String="s2c 协议号:0x"+decoderID.toString(16).toLowerCase()+"解码异常,原因:\n";msg+=er.toString()+"\n";msg+=er.getStackTrace();Alert.show(msg);throw er;return null;}return null;}


上面是我目前里用着的方法,不过唯一不好的是:这些解码方法(路由功能方法)没有再分一些模块再去处理;


网上还有一种叫:依赖注入方式,将解码方法都分别写在,不同的模块类下,处理,然后,再客户端注册一下依赖模块即可。


如:

class Player

{

   public function start():void{}

}


//@author Jave.Lin(afeng);

//简单的Router功能;

//自动注册路由;

class Router

{

  //注册depander:Dictionary

  //这里的"player"不用字符串也行,使用数字最佳了;

  //因为数据占用少,而且,与服务端的通讯中的协议一般都用一个数字,就不用另外再写数字与字符串的对应表了

  depander["player"]=new Player();

   

  //调用

  depander["player"]["start"]();


   //on router handler

   var router:Dictionary;//

   function router(bytes:ByteArray):Object

   {

      var decoderModuleId:uint=bytes.readUnsignedShort();

      var decoderId:uint=bytes.readUnsignedShort();

      var module:Dictionary=router[decoderModuleId];

      if(!module)

       {

          module=router[decoderModuleId]=new Dictionary();

       }

      var handler:Function=module[decoderId];

      if(!handler)handler=module[decoderId]=depander[decoderModuleId][decoderId];//这里就不使用字符串了,上面使用字符串因为这样大家比较好理解

      if(!handler) throw new Error("oh no,no,no,decoderModuleId"+decoderModuleId+",decoderId:"+decoderId+" decoder is not found.");

      return handler(bytes);

   }

}


当然上面都是硬编码方式,还有比较高级的做法:IoC做法,这个大家可以百度一下即可知道;

就是把上面的硬编方式改成了,XML方式来管理依赖项之间的注册配置(注册关系);


PS:这种方式,俺以前写C#服务端也用过;

国外朋友喜欢把这功能,叫:路由


原创粉丝点击