1. 协议格式
任何游戏在动手编写代码前服务器与客户端的开发人员的首要任务是商定好协议的规则格式。
下面以sibo协议为例:
协议解析:
---
Header [8]byte
payloadLength [4]byte
payload [payloadLength]byte
---
---
Header各个byte的定义:
1 1 1 1 1 3
magicNumber|version|ConsistentDefine|serializationType|moduleID|messageID
---
ConsistentDefine各个bit的定义:
---
1 1 1 111 11
消息类型 是否是心跳包 是否是单向通信 压缩类型 消息状态
---
magicNumber: 协议Header的起始标识
version: 协议版本号
serializationType: 序列化类型(json,bson,protobuf,msgpack)
moduleID: 模块id
messageID: 模块下的消息id
moduleID与messageID组合成为一个msg的唯一id
2. 协议编码解码器实现
根据定好的协议编写对应编码解码器,sibo协议的编解码器源码如下:
package protocol
import (
"errors"
"encoding/binary"
"io"
)
// MaxMessageLength is the max length of a message.
// Default is 0 that means does not limit length of messages.
// It is used to validate when read messages from io.Reader.
// 指定消息的最大长度
var MaxMessageLength = 0
const (
magicNumber byte = 0x09
)
var (
// message is too long
ErrMessageToLong = errors.New("message is too long")
)
// MessageType is message type of request and response
// 消息类型, 用于指定消息是request还是response
type MessageType byte
const (
// message type of request
Request MessageType = iota
// message type of response
Response
)
// MessageStatusType is status of message
// 消息状态
type MessageStatusType byte
const (
// Normal is normal requests and responses
Normal MessageStatusType = iota
Error
)
// CompressType defines decompression type.
// 压缩方式
type CompressType byte
const (
// Nonde does not compress
None CompressType = iota
// Gzip uses gzip compression
Gzip
// Zlib uses zip compression
Zlib
)
// SerializeType defines serialization type of message's payload.
// 序列化方式
type SerializeType byte
const (