您的位置:首页 > 其它

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

2012-09-03 14:57 597 查看
/**
* @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();								//decoderID
var decoder:Function=_decoderDic[decoderID];					//find decoder from caches

try
{
if(decoder!=null)return decoder(bytes);

var key:String = decoderID.toString(16).toLowerCase();
var decoderName:String=DECODER_PREFIX+"0x"+key;	//decoderName
decoder=this[decoderName];										//find decoder
if(decoder!=null)
{
_decoderDic[decoderID]=decoder;								//caches decoder
return 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#服务端也用过;

国外朋友喜欢把这功能,叫:路由
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐