codec

package
v0.6.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 11, 2022 License: BSD-3-Clause Imports: 12 Imported by: 0

README

codec的设计

概述

codec是用于处理网络流的数据包编解码

业务层的消息用Packet表示,codec把网络流解码为一个个packet投递给业务层,并且把业务层传递过来的packet编码到网络流发送给对端

设计目标
  • 稳定可扩展,尽量满足常见需求(压缩、加密、序号),并且提供机制方便外层代码修改;
  • 实现不宜过于复杂,尽量简单易于在不同的语言实现
  • Client-Server和Server-Server的协议分开
Client-Server
  • 长度用2个字节表示,也就是限制到64K内;
  • 会话内的每个packet可以由一个序列号标记;
  • 协议检查head和body的校验码;
  • 消息派发可以使用ID,也可以使用字符串;
Server-Server
  • 长度用4字节表示,并限制在16M以内;
  • 会话内的每个packet可以由一个序列号标记;
  • 协议检查head和body的校验码;
  • 消息派发可以使用ID,也可以使用字符串;
  • 需要考虑到路由转发和广播多播的场景,消息协议能够附带其它路由节点信息;

Documentation

Index

Constants

View Source
const (
	V1EncoderVersion    = 3
	V1HeaderSize        = 16        // 包头大小
	V1MaxPayloadBytes   = 64 * 1024 // 64K
	V1CompressThreshold = 4 * 1024  // 压缩阈值(4k)
)
View Source
const (
	V2EncoderVersion    = 1
	V2HeaderSize        = 24               // 包头大小
	V2MaxPayloadBytes   = 64 * 1024 * 1024 // 64M
	V2CompressThreshold = 8 * 1024         // 压缩阈值(8K)
)

Variables

This section is empty.

Functions

func MarshalBody added in v0.4.1

func MarshalBody(pkt *fatchoy.Packet, threshold int, encryptor cipher.BlockCryptor) ([]byte, error)

把消息序列化为字节流,有压缩和加密,内部会修改Flags字段

func ReadMagicLenData added in v0.6.6

func ReadMagicLenData(r io.Reader) ([]byte, error)

读取2字节开头的数据

func ReadPacket added in v0.4.1

func ReadPacket(enc Encoder, rd io.Reader, decrypt cipher.BlockCryptor) (*fatchoy.Packet, error)

func Register added in v0.1.12

func Register(v Encoder)

func UnmarshalBody added in v0.4.1

func UnmarshalBody(payload []byte, decrypt cipher.BlockCryptor, pkt *fatchoy.Packet) error

把字节流反序列化为消息,有解密和解压,内部会修改Flags字段

func WriteMagicLenData added in v0.6.6

func WriteMagicLenData(w io.Writer, data []byte) (int, error)

写入2字节开头的数据

Types

type Encoder added in v0.1.12

type Encoder interface {
	// name and version
	Name() string
	Version() int

	Clone() Encoder

	// 把消息编码到`w`,内部除了flag不应该修改其它字段
	Marshal(pkt *fatchoy.Packet, encrypt cipher.BlockCryptor, w io.Writer) (int, error)

	// 根据head和body解码消息到
	Unmarshal(header, body []byte, decrypt cipher.BlockCryptor, pkt *fatchoy.Packet) error

	// 按协议格式读取head和body
	ReadHeadBody(r io.Reader) ([]byte, []byte, error)
}

消息编/解码接口

func CreateEncoder added in v0.3.8

func CreateEncoder(name string) Encoder

func NewV1Encoder added in v0.1.12

func NewV1Encoder(threshold int) Encoder

func NewV2Encoder added in v0.1.12

func NewV2Encoder(threshold int) Encoder

type V1Header

type V1Header []byte

func (V1Header) CalcChecksum

func (h V1Header) CalcChecksum(payload []byte) uint32

校验码包含head和body

func (V1Header) Checksum

func (h V1Header) Checksum() uint32

CRC校验码

func (V1Header) Command

func (h V1Header) Command() uint16

func (V1Header) Flag

func (h V1Header) Flag() uint8

标记位

func (V1Header) Len

func (h V1Header) Len() uint32

长度包含头部和body

func (V1Header) MD5Sum added in v0.1.8

func (h V1Header) MD5Sum() string

func (V1Header) MsgID added in v0.1.29

func (h V1Header) MsgID() uint32

func (V1Header) Pack

func (h V1Header) Pack(pkt *fatchoy.Packet, size uint16)

func (V1Header) Seq

func (h V1Header) Seq() uint16

序号,对客户端而言16位的序号已经足够

func (V1Header) SetChecksum

func (h V1Header) SetChecksum(payload []byte)

func (V1Header) SetFields added in v0.4.1

func (h V1Header) SetFields(pkt *fatchoy.Packet)

func (V1Header) Type

func (h V1Header) Type() uint8

type V2Header

type V2Header []byte

func (V2Header) CalcChecksum

func (h V2Header) CalcChecksum(payload []byte) uint32

校验码包含head和body

func (V2Header) Checksum

func (h V2Header) Checksum() uint32

CRC校验码

func (V2Header) Command

func (h V2Header) Command() uint16

func (V2Header) Flag

func (h V2Header) Flag() uint8

标记位

func (V2Header) Len

func (h V2Header) Len() uint32

长度包含头部和body

func (V2Header) MD5Sum

func (h V2Header) MD5Sum() string

func (V2Header) MsgID added in v0.1.29

func (h V2Header) MsgID() uint32

func (V2Header) Node

func (h V2Header) Node() fatchoy.NodeID

目标节点,广播的时候这个字段用来表达session数量

func (V2Header) Pack

func (h V2Header) Pack(pkt *fatchoy.Packet, size uint32)

func (V2Header) Seq

func (h V2Header) Seq() uint32

序号

func (V2Header) SetChecksum

func (h V2Header) SetChecksum(payload []byte)

func (V2Header) SetFields added in v0.4.1

func (h V2Header) SetFields(pkt *fatchoy.Packet)

func (V2Header) Type

func (h V2Header) Type() uint8

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL