go实现tcp游戏服务器sibo——协议篇

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 (
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值