通讯协议可以根据自己的需要任意定义。我的定义如下:
一、术语定义:
名称 | 解释 | 备注 |
通道 | 指一个socket的连接通路 | 程序中,一般指SocketChannel |
令牌 | 服务端用以区分连接通道的唯一标识 |
|
报文 | 指上行到达通讯主线程的通讯包 | Packet |
指令 | 指通讯主线程要发送给对端的下行通讯包 | Order |
二、规约(需仔细阅读)
所有报文和指令均有字符串组成,分为四个部分:
1、指令(报文)标记,大写英文字母,每一类指令(报文)都有自己唯一的标记;
2、指令(报文)流水号Rid;主动发起的指令,自动生成,最大1000000000,循环反复。被动响应的指令,为请求方的Rid回填。
3、指令(报文)Token,自动生成UUID;
4、指令体(报文);
除指令标记和指令流水号之外,其他两项内容,根据不同的指令(或报文),会有取舍;各部分之间以“|”作为分隔符。
例如:T|128|6e7805ec-8487-4ace-9c1e-cb715888b67f
5、所有报文传输,均采用UTF-8;
6、报文中包含中文,请用Base64转码后发送;
服务端指令
1. 分配令牌
当客户端连接到服务端之后,服务端第一时间生成令牌,并下发此指令告知客户端。
类别 | 定义 | 备注 |
标记 | T |
|
流水号 | 自动生成,最大1000000000,循环反复 | (例如:21 |
Token | UUID | 6e7805ec-8487-4ace-9c1e-cb715888b6 |
示例:
T|128|6e7805ec-8487-4ace-9c1e-cb715888b67f |
2. 错误
类别 | 定义 | 备注 |
标记 | E |
|
流水号 | 自动生成,最大1000000000,循环反复 | (例如:21 |
Body | Json,内含errCode,errMsg两个属性 | { "errCode" : "1","errMsg" : "无效请求"} |
示例:
E|128|{ "errCode" : "1","errMsg" : "无效请求"} |
3. 回应
类别 | 定义 | 备注 |
标记 | R |
|
流水号 | 是对应上行报文的Rid | (例如:21 |
示例:
R|102 |
三、服务端报文
1. 回应
类别 | 定义 | 备注 |
标记 | R |
|
流水号 | 是对应上行报文的Rid | (例如:21 |
Token |
|
|
示例:
R|102|6e7805ec-8487-4ace-9c1e-cb715888b67f |
2. 维持链路
类别 | 定义 | 备注 |
标记 | K |
|
流水号 | 是对应上行报文的Rid | (例如:21 |
Token |
|
|
示例:
K|102|6e7805ec-8487-4ace-9c1e-cb715888b67f |
3. 客户端登录
类别 | 定义 | 备注 |
标记 | L |
|
流水号 | 是对应上行报文的Rid | (例如:21 |
Token | 用户的令牌 |
|
Body | 用户的身份标记 | 此处为客户的业务身份标记,比如用户的系统账号,手机号等等 |
示例:
L|102|6e7805ec-8487-4ace-9c1e-cb715888b67f|13898482867 |