项目中解决粘包的一个小程序
设计步骤
分析数据特征
比如我的数据是7E开头FF结尾,在不需要很严格的校验手段时就是:
使用游标遍历整个流(BUF,内存)
直到遇到FF则获得一个包
通过拷贝,把此包添加到结果集中
继续遍历。
一开始我使用的递归算法
然后觉得不需要,继续遍历就好了
最终代码如下
private void GetCompeletedPackage(byte[] buffer, int start, ref List<CommunicateData> result) { for (int i = start; i + 10 <=buffer.Length; i++)//两个F7F7结尾标志+8位标识符+两个7E开始符,长度比索引大1,所以是i+10 { if (buffer[i] == 0xF7 && buffer[i + 1] == 0xF7 ) { byte[] data = new byte[i-start +10]; Array.Copy(buffer, start, data, 0, data.Length); result.Add(new CommunicateData(data)); i = i+10; start = start + data.Length; } } }
但是,就这么一简单的程序,我来来回回折腾了不下10次....
第一次没考虑好
多了这个判断 buffer[i+9] == 0x7E
结果如果没粘包的话就没能够添加进去
i-start+10这个也调试了3次以上才确定......
i = i+10;调试了一次,起初是i=i+data.Length
start = start + data.Length;调试了一次,起初是start = i;
如果都能调试这些都很好办,
可惜我这个项目比较大,不能直接启动调试,只能附加release到进程看,
看到错误也不能直接修改出结果,要关掉了才能修改
这样的往返相当的劳神费力。
以下是我需要改进的地方:
1.设计前一定要想清楚遇到的问题还有细节
2.不要太靠调试,写完先检查代码又没有漏洞。
3.写完就调试
4.如果调试非常困难,则考虑单独去调试代码,即单元测试。这个方面我还不太了解...
5.为什么调试变得困难,我应该嗅出项目应该做出一些调整了。