abstract val serializeMethod:Byte // 序列化方式
abstract val command:Byte // Watcher 跟 App 相互通讯的指令
}
有多少个指令就需要定义多少个 Packet,下面以心跳的 Packet 为例,定义一个 HeartBeatPacket:
data class HeartBeatPacket(var msg:String = “ping”,
override val serializeMethod: Byte = Serialize.JSON,
override val command: Byte = Commands.HEART_BEAT) : Packet() {
}
HeartBeatPacket 是由 TCP 客户端发起,由 TCP 服务端接收并返回给客户端。
每个 Packet 类都包含了该 Packet 所使用的序列化方式。
/**
- 序列化方式的常量列表
*/
interface Serialize {
companion object {
const val JSON: Byte = 0
}
}
每个 Packet 也包含了其对应的 command。下面是 Commands 是指令集,支持256个指令。
/**
- 指令集,支持从 -128 到 127 总共 256 个指令
*/
interface Commands {
companion object {
/**
- 心跳包
*/
const val HEART_BEAT: Byte = 0
/**
- 登录(App 需要告诉 Watcher :cameraPosition 的位置)
*/
const val LOGIN: Byte = 1
…
}
}
由于使用自定义的协议,必须要有对报文的 encode、decode,PacketManager 负责这些事情。
encode 时按照协议的结构进行组装报文,同理 decode 是其逆向的过程。
/**
- 报文的管理类,对报文进行 encode、decode
*/
object PacketManager {
fun encode(packet: Packet):ByteBuf = encode(ByteBufAllocator.DEFAULT, packet)
fun encode(alloc:ByteBufAllocator, packet: Packet) = encode(alloc.ioBuffer(), packet)
fun encode(buf: ByteBuf, packet: Packet): ByteBuf {
val serializer = SerializerFactory.getSerializer(packet.serializeMethod)
val bytes: ByteArray = serializer.serialize(packet)