通信模块设计说明
特性概述 | 详细说明 |
---|---|
较强的接收容错能力 | 自动从下一个起始符继续匹配 |
丰富的协议解析能力 | 同一个端口支持解析多种协议 |
灵活的端口转发能力 | 支持在任意端口之间相互转发(转发时支持协议转换) |
良好的协议扩展能力 | 采用星形拓扑|方便后期扩展 |
较强的接收容错能力
接收并解析一个正常的数据帧是比较容易实现的,但是有时候我们往往会碰到一些变态的场景或者变态的用户需求,比如说在一堆乱码中混入一个正常帧,又或者是在一个半帧后面接一个正常帧,在这种情况下程序能否正常解析,就很考验程序设计的功力了。目前的方案是,从第一个起始符开始尝试与指定的协议进行匹配,如果匹配成功,则正常返回;如果匹配失败,则自动从下一个字节或者下一个起始符开始继续匹配,直到匹配成功。
丰富的协议解析能力
我个人认为一个端口只支持解析一种协议的设计是很鸡肋的,无法满足一些变态的用户需求。为此,本人设计了一套全新的通信系统,支持在同一个端口上解析多种协议。其原理为,从底层数据缓冲区中一个字节一个字节地读取数据,每拿取一个字节,就与协议库中的若干协议比对一次,直到比对成功。
灵活的端口转发能力
数据帧在单个端口内完成接收、解析、处理、响应的设计是比较简单的,而一旦涉及到转发,事情就变得复杂了。首先,要想在任意端口之间转发,就不能把端口分成上行、下行,左行、右行也不行,所有端口都应该是平等的,且遵循同一套规则。其次,两个端口所用的协议有很大可能是不同的,所以还需要支持协议转换。协议转换详见下一章节。
良好的协议扩展能力
协议转换最容易想到的就是两两转换,不过两两转换在协议少的时候还好说,干就完了,但是后期若是要扩展第三个、第N个协议,两两转换的弊端就显现出来了,其工作量可是呈C₂ⁿ级增长的。而星形拓扑的设计则可以很好地解决这个问题。
协议数量 | 网状拓扑 O(C₂ⁿ) | 星形拓扑 O(n) |
---|---|---|
2 | 1 | 2 |
3 | 3 | 3 |
4 | 6 | 4 |
5 | 10 | 5 |
6 | 15 | 6 |