如何实现大量TCP/UDP数据包的 解析处理?

deodara 2012-12-20 09:54:40
场景:
基于网络的C/S架构的业务系统,Client端是自助终端设备,使用电信3G网络通讯,由于网络的不稳定(个别时刻只能达到10K的有效带宽),考虑到通讯的即时性,采用Socket通讯,每个数据包含有包唯一ID号、版本号等基本信息,不定长,字节总数不超过512Byte。

问题:
为了能监控终端机运行状态 以及 业务运行情况,需要终端机器不定时发送数据包至服务器,考虑到通讯协议 将来 增加 以及 版本更新 的需要,有没有好办法以最小的更新代价来实现数据包的解析处理。

已考虑方案:
1、 以包唯一ID+版本号为每一个协议数据包写一个处理类做解析;当收到数据包时,解析的到ID号和版本号,根据一定的映射规则实例化响应的处理类,做进一步处理;这种方式虽然思路简单,但可能会产生几百个解析类,可维护性上可能不够好;另外是否还会产生其他问题,也不能确定。

2、 考虑能在数据库中把包协议的域、长度等信息做配置,接收到数据包时从数据库读取相关配置做解析,但是这只是一个思路,还没想明白实际操作该如何处理,欢迎大家补充

欢迎大家给出自己的考虑,谢谢。

请注意:
暂不考虑数据传输过程的问题,比如粘包、半包等问题,此问题讨论的假设前提是 数据包完全接收,重在如何解析!
...全文
1141 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
deodara 2012-12-24
  • 打赏
  • 举报
回复
自己顶一下吧
deodara 2012-12-20
  • 打赏
  • 举报
回复
现在用的是基于UDP的Socket通讯,不同类的信息采用不同的组包规则。举例来说心跳包的信息可能是这样的: 包头 + 包长度 + 版本号 + 认证码 + 信息数据 + 校验和 + 包尾 简单的讲,客户端的监控数据包可能有很多种,交易信息、结算信息、心跳信息、配置信息、开关机信息等等,综合起来有几十种此类信息是很正常的,而且随着系统的升级,可能会出现同一种信息多个版本的问题,这样的话,如果每一个版本的协议算是一个新的协议的话,那么协议总量将倍数增长。 以复杂一点的方式当然可以解决,事实上我已经采用第一种方案在做了。 我现在想的是能否有一种更优雅的方式来实现这个功能?
suciver 2012-12-20
  • 打赏
  • 举报
回复
c/s中常用的协议也就那么几种。不会是几百种协议的。所以楼主如果是每一种协议一个解析类的做法。不会说会造成几百种解析类的。但是如果是每一种协议的每一个数据包一个解析类那就多的要命了。 同样都是用一种协议了,不可能说每一个数据包还不一样的吧。就算有也只是几个特殊的业务需要,不太可能说同一种协议下,所有的数据包都是不一样的,那样的话没法弄了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧