场景:
基于网络的C/S架构的业务系统,Client端是自助终端设备,使用电信3G网络通讯,由于网络的不稳定(个别时刻只能达到10K的有效带宽),考虑到通讯的即时性,采用Socket通讯,每个数据包含有包唯一ID号、版本号等基本信息,不定长,字节总数不超过512Byte。问题:
为了能监控终端机运行状态 以及 业务运行情况,需要终端机器不定时发送数据包至服务器,考虑到通讯协议 将来 增加 以及 版本更新 的需要,有没有好办法以最小的更新代价来实现数据包的解析处理。已考虑方案:
1、 以包唯一ID+版本号为每一个协议数据包写一个处理类做解析;当收到数据包时,解析的到ID号和版本号,根据一定的映射规则实例化响应的处理类,做进一步处理;这种方式虽然思路简单,但可能会产生几百个解析类,可维护性上可能不够好;另外是否还会产生其他问题,也不能确定。2、 考虑能在数据库中把包协议的域、长度等信息做配置,接收到数据包时从数据库读取相关配置做解析,但是这只是一个思路,还没想明白实际操作该如何处理,欢迎大家补充欢迎大家给出自己的考虑,谢谢。请注意:
暂不考虑数据传输过程的问题,比如粘包、半包等问题,此问题讨论的假设前提是 数据包完全接收,重在如何解析!

解决方案 »

  1.   

    现在用的是基于UDP的Socket通讯,不同类的信息采用不同的组包规则。举例来说心跳包的信息可能是这样的:
    包头 + 包长度 + 版本号 + 认证码 + 信息数据 + 校验和 + 包尾简单的讲,客户端的监控数据包可能有很多种,交易信息、结算信息、心跳信息、配置信息、开关机信息等等,综合起来有几十种此类信息是很正常的,而且随着系统的升级,可能会出现同一种信息多个版本的问题,这样的话,如果每一个版本的协议算是一个新的协议的话,那么协议总量将倍数增长。以复杂一点的方式当然可以解决,事实上我已经采用第一种方案在做了。我现在想的是能否有一种更优雅的方式来实现这个功能?