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#服务端也用过;
国外朋友喜欢把这功能,叫:路由
相关文章推荐
- WCF----最简单的winform客户端回调服务端WCFDemo下载,双工模式,IIS 6.0
- netbeans创建webservice服务端server|webservice客户端client示例
- SQLiteServer+SQLiteClient 用于.Net项目的SQLite服务端程序和客户端类库
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- Silverlight MMORPG WebGame游戏设计(六)-----Server和Client的婚后协议[附上完整15M游戏DEMO]
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- 一个简单的ACE网络库Server和Client Demo
- (死亡历险)Delphi7 IdTCPClient1,IdTCPServer1客户端向服务端发送指令进行文件下载
- --@angularJS--一个简单的UI-Router路由demo
- navicat连接oracle的错误:ora-12737:instant client light :unsupport server charater set ZHS16GBK解决办法。(oracle服务端字符集,客户端字符集,dmp备份文件字符集,or
- 客户端(client)获取服务端(server)返回的SOAP消息包
- 第26篇:AngularJS+ui-router实现一个超简单的登陆和跳转的二级路由demo
- UdpClient类客户端和服务端demo
- java 实现简单http服务端,客户端DEMO
- spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互
- libevent基础:用libevent写服务端server程序和客户端client程序
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- HttpClient4.5.2由Client客户端上传File文件流至Server服务端
- Socket TCP 协议实现服务端和客户端的简单通信