蛙蛙教你解析网络包
摘要:做网络应用,封包,解包是家常便饭,但如何做到准确、稳定而且性能好,却不太容易做到,这次
和大家分享一下我在解析网络包上的经验。
思路:设计一个网络协议,一般都会分包,一个包就相当于一个逻辑上的命令。
、如果我们用 协议,省事的多,一次会收到一个完整的包,但 不可靠,顺序也不能保证,当
然像 对 封装的很好,模拟了 的可靠性。网上也有一些封装好的可靠的 组件,大家用
的话可以找找。关于用什么协议好这个问题,本贴不讨论。
、如果我们用 协议不是长连接,像 (不考虑 )那样,一个连接上只发送一个包,
我们也会很清晰的区分出接受到的每一个包。
、还有就是我们还用 长连接,但每次发送固定长度的包,如果要发送的数据长度不够就用 补齐,
如果大于固定长度,就分成几个发,这个也很简单实用。
、再有就是一个包有特定的开始和结尾,比如包头是包尾是,我们在可以从头读到尾,
并把一个一个的包放入队列,由处理线程去处理。
、再有一种就是每个包有固定长度的 ,这个 里包含一个包的长度信息,我们可以先从
头里读出长度信息,然后再借着读这么长的数据,完了这就是一个包。
关于封包的几种类型我就想到这么多,其中的利弊大家一看便知,我就不忽悠了,本文主要介绍最后一种
方式,好多网络协议用的都是这种,包括 协议,我们自己设计协议的时候一般不用像 协议
那样,因为二进制协议虽然虽然节省网络流量,但可读性不好。出问题,抓个包分析起来太麻烦。我们可
以用!"# 自带的序列功能把要发送的类序列化成 $ % 字符串发送出去,这多好看呀。
由于 &'(# 缓冲区设置及其他的原因,&'(# 在接受数据的时候有时候不能完整的收到一个包,就是
你读出包的长度后,可能不能一次就读取这么多数据。而如果读个半截儿的包就用 )*+"'", 等来
解析,会解析出乱码的,我们这里用 +"'",!)*!-#'./来对包进行成块儿的解析,它就是
用来做这种事情的。
下面就来看一下代码,代码的注释很全,演示了一个包从发到接受、解析的全过程,其中接受的过程没有
一次收全所有的包,而是收了好几次,但我们最终还是成功的解析了收到的包。
0
0