# 快递项目socket协议protobuf定义

## 1. 概述
* 本项目前后端使用 kcp 协议通讯  [KCP - A Fast and Reliable ARQ Protocol](https://github.com/skywind3000/kcp)

## 2. 消息
* 消息是前后端通讯的内容的封装
### 2.1 消息格式:
* 消息是拼接的二进制流
* 消息由 4 段数据拼接而成, `act` + `type` + `body length` + `body`

    * act: 单字节(byte), 协议号, 见下文的act定义, 根据`act`将`body`映射到对应的数据对象
    * type: 单字节(byte), 定义了`body`的类型, 目前支持两种`(0=json;1=protobuf)`
    * body length: 双字节(short), **大端序**, 对应的是`body`的数据长度, 可以避免保证数据读取的完整性
    * body: 消息正文

### 2.1 消息读取逻辑
* 读取消息有两种选择
    * 一种是使用kcp提供的read方法, 这种比较方便, 理论上应该也是没有问题的
        * 读取第一个字节, 拿到act
        * 读取第二个字节, 拿到type
        * 读取第四个字节到结尾处, 拿到消息正文
    * 另一种是自已实现读消息逻辑, 读取方法如下:
        * 读取一个字节, 拿到act
        * 读取一个字节, 拿到type
        * 读取两个字节, 按大端序写入short, 拿到body length
        * 读取 body length 个字节, 写入消息正文

## 3. 消息正文
### 3.1 act类别
* `c -> s` 表示客户端给服务器的消息
* `s -> c` 表示服务器器给客户端的消息
* `c -> s` 消息中, 带有 `request` 的消息, 服务器都有响应一个对应的 `response` 消息
* `notify`消息, 表示客户端通知服务器某些行为, 服务器知道就行了, 不需要返回任何数据
* `push` 消息, 表示服务器通知客户端某些行为, 客户端需要

### 3.2 act定义
| 协议号 | message | 方向 | 备注 |
| --- | --- | --- | --- |
| 4 | SYN | c -> s | 客户端SYN请求 |
| 4 | SYN | s -> c| 服务器响应SYN请求 |
| 5 | CloseNotify | c -> s | 客户端关闭连接 |
| 5 | ClosePush | s -> c | 服务器关闭用户连接 |
| 10 | LoginRequest | c -> s | 客户端请求登陆 |
| 11 | LoginResponse | s -> c | 服务器响应登陆请求 |
| 12 | HeartbeatRequest | c -> s | 客户端心跳 |
| 13 | HeartbeatResponse | s -> c | 服务器心跳 |
| 14 | ChatNotify | c -> s | 发送聊天消息 |
| 15 | ChatPush | s -> c | 推送聊天消息 |
| 16 | SwitchWorldReques | c -> s | 发送切换世界请求 |
| 17 | SwitchWorldResponse | s -> c | 服务器响应切换世界结果 |
| 100 | LobbyJoinPush | s -> c | 用户加入大厅 |
| 101 | LobbyLeavePush | s -> c | 用户离开大厅 |
| 120 | RoomCreateRequest | c -> s | 客户端请求创建房间 |
| 121 | RoomCreateResponse | s -> c | 服务器响应创建房间请求 |
| 122 | RoomJoinRequest | c -> s | 客户端请求加入房间 |
| 123 | RoomJoinResponse | s -> c | 服务器响应加入房间请求 |
| 124 | RoomJoinPush | s -> c | 服务端推送用户加入房间消息 |
| 125 | RoomLeaveRequest | c -> s | 客户端请求退出房间 |
| 126 | RoomLeaveResponse | s -> c | 服务器响应退出房间 |
| 127 | RoomLeavePush | s -> c | 服务器推送用户离开房间消息 |
| 150 | RestoreRequest | c -> s | 客户端请求恢复数据 |
| 151 | RestoreResponse | s -> c | 服务器响应当前状态 |
| 152 | SyncRequest | c -> s | 客户端同步数据 |
| 153 | SyncResponse | s -> c | 服务器响应同步结果 |
| 154 | SyncPush | s -> c | 服务器通知客户端想要他人的同步数据 |
| 155 | MasterPush | s -> c | 服务器合并lockStep的消息给master |
| 156 | MasterNotify | c -> s | master通知服务器广播数据给follow |
| 157 | MasterStoreNotify | c -> s | master存储状态 |
| 158 | MasterLoadRequest | c -> s | master读取状态 |
| 159 | MasterLoadResponse | s -> c | 服务器响应master状态 |
| 160 | DMessageRequest | c -> s | 客户端发送消息给其他人 |
| 161 | DMessageResponse | s -> c | 服务端响应协议结果 |
| 162 | DMessagePush | s -> c | 服务端转发消息给其他人 |
| 163 | MasterNotifyResponse | s -> c | 服务器收到masterNotify的响应 |
| 170 | PartyJoinRequest | c -> s | 请求加入派对 |
| 171 | PartyJoinResponse | s -> c | 加入派对响应 |
| 172 | PartyJoinPush | s -> c | 推送其他人加入派对的消息 |
| 173 | PartyLeaveRequest | c -> s | 请求退出派对 |
| 174 | PartyLeaveResponse | s -> c | 退出派对响应 |
| 175 | PartyLeavePush | s -> c | 退出派对消息推送 |
| 176 | PartyReadyRequest | c -> s | 请求已准备 |
| 177 | PartyReadyResponse | s -> c | 响应已准备 |
| 178 | PartyReadyPush | s -> c | 推送已准备 |
| 179 | PartyFullPush | s -> c | 推送房间已满 |
| 180 | PartyResetPush | s -> c | 推送房间重置 |
| 181 | PartyFinishPush | s -> c | 推送房间结束 |
| 182 | PartyStageCrossRequest | c -> s | 请求通关小关卡 |
| 183 | PartyStageCrossResponse | s -> c | 响应通关小关卡 |
| 184 | PartyStageCrossPush | s -> c | 推送其他人通关小关卡 |
| 185 | PartyStageStartPush | s -> c | 推送小关卡开始 |
| 186 | PartyStageFinishPush | s -> c | 推送小关卡结束 |
| 187 | PartySyncRequest | c -> s | 客户端同步数据 |
| 188 | PartySyncResponse | s -> c | 服务器响应同步结果 |
| 189 | PartySyncPush | s -> c | 服务器通知客户端想要他人的同步数据 |
| 190 | PartyListRequest | c -> s | 请求大厅派对列表 |
| 191 | PartyListResponse | s -> c | 服务器响应大厅列表 |
