此次讨论的协议是数据传输时遵照的一定格式。
协议要求
一个好的通信协议,首先要囊括所有需要发送的信息,能适应各种发送情况,不管你需要向服务端发送一条消息,还是需要验证登录,都可以通过固定的协议格式发送。在这个基础上应该尽量精简,减少打包发送和解包读取的工作量,减轻双方的负担。所以在设计协议之前我们需要讨论都有可能发送何种消息,根据具体的需求确定具体的协议。此外在协议基础上应留有一定的扩展空间,在未来有更多需求的时候可以依据此协议进行修改内容。
通信种类分析
在聊天室例子中,只有两种情况,客户端发给服务端还有服务端发给客户端。
- 客户端发给服务端:
- 验证登录——登录ID、密码
- 请求注册——注册ID、密码
- 发送消息——发送方ID、接受方ID、消息内容
- 服务端发给客户端
- 登录验证情况—— 登录ID、成功或失败、失败原因
- 注册验证情况——注册ID、注册成功或失败、失败原因
- 转发消息——发送方ID、接收方ID、消息内容
分析完通信种类我们不难得出一下几种结论。
- 无论是何种类型的消息,都需要包括发送者ID、接收者ID。这指明了这个数据包的来源和去向。
- 服务端和客户端都需要根据收到包类型的不同,进行不同的处理。我们可以在包中提前设计这样的数据结构,直接告诉对端应该以哪种方式处理这个包。
- 包中有一段内容不是固定不变的,有些处理中需要这段内容,有的则不需要。
协议设计
根据分析,我们将数据包处理成四段,分别包括:
字段 | 空间 | 说明 |
---|---|---|
type | 4字节 | 包类型 |
sender | 32字节 | 发送者ID |
recver | 32字节 | 接受者ID |
message | 956字节 | 自由空间 |
type指定包类型,接受者根据类型选择不同的处理方式;sender指明包的来源,recver指定包的接收方。message是一块自由空间,根据包类型设置对应内容或者不设置。
每各字段有固定的空间范围,这样数据包的长度固定,方便发送和接收,避免数据量