在学习过计算机网络的课程,咱们知道刚开始计算机都是单独脱机工做的,没有联网的状况下计算机的信息共享能力、运算能力都很是有限,后来诞生了计算机网络.有了就是那几网络,计算机 A 的信息和数据能够经过网络传递到计算机 B,一样计算机 A 能够获取到来自计算机 B 的数据. 可是不一样计算机之间交换数据的时候就要经过网络来传输了.传输的过程当中须要不一样的计算机都遵循必定的规则来组装数据、传递信息,那么这样的规则就叫作协议.git
计算机网络中有很是多协议,这些协议位于 OSI 的不一样层中,好比 TCP/IP、UDP、SMTP、FTP 等. 协议之因此称为协议,是由于它具备约束效应,信息在端到端的传输过程当中,同等层次之间经过使用一样的协议规则,这样发送方在该层次按照协议约定处理数据,接收方在该层次按照协议约定解析数据.成对存在.github
在平常开发的时候处于某些缘由可能须要自定义报文协议.这个协议是创建在 TCP 链接的基础上,好比,移动端在作 APM 的时候将功能拆分为2个模块,一个是 APM 监控模块、一个为了方即可拓展单独作了一个数据上报组件,具备动态下发上报策略的配置.网络
因此上报组件这里涉及到和服务端高效通讯,因此客户端和服务端约定了一套自定义的报文协议,以下所示.学习
PACKET 总体结构 | HEAD | META | BATCH_PAYLOAD |编码
PACKET::HEAD 结构加密
| META_SIZE (2bytes unsigned int) | BATCH_COUNT (1 bytes unsigned int) | PAYLOAD_SIZE (4bytes unsigned int) | PAYLOAD_SIZE (4bytes unsigned int) | ... |计算机网络
PACKET::META 结构设计
换行符分割的 JSON 字符串3d
crypto(deflate(JSON\nJSON...))code
PACKET::BATCH_PAYLOAD 结构
JSON 体里每一个字段的值都是 BASE64 编码的
crypto(deflate(JSON) | crypto(deflate(JSON) | ...
其实计算机网络过程当中传输的就是二进制数据,因此拿 iOS 举例来讲,咱们自定义报文协议的目的就是按照协议的约定,自定义组装好一个 NSData 的数据,报文里面的头规定了各类信息的组装格式.
因此核心就上面的3点,一点都不难,只不过第一次作的时候可能会踩坑.列觉以下
Objective-C 语言中处理 unsigned int 的数据,因此你须要直接操做 unsign short 到 NSData, NSData 的接口很方便, [NSData dataWithBytes:&metaLength length:sizeof(metaLength)]]
就能够处理成 2byte 的 unsigned int 的数据