go實現tcp遊戲伺服器sibo 序列化及壓縮篇

2021-08-15 19:43:11 字數 4247 閱讀 1594

上篇sibo協議的定製裡其header部分包含了序列化型別及壓縮型別的定義。

由於序列化為占用3個bit,因此最多可支援8種序列化方式。同理,壓縮型別最多支援4種。

sibo協議定義支援的序列化型別如下(共5種):

const (

serializenone serializetype = iota // 原始二進位制

json

protobuffer //protobuf

msgpack

bson

)

接下來我們來實現這5中序列化方式:

1)通用呼叫介面

type

codec inte***ce )(byte, error)

decode(data byte, i inte***ce{}) error

}

2)原始二進位制編譯碼

// bytecodec uses original bytes.

// 原始二進位制編譯碼

type bytecodec struct {}

func (c bytecodec) encode(i inte***ce{}) (byte, error)

return

nil, fmt.errorf("%t is not a byte", i)

}func (c bytecodec) decode(data byte, i inte***ce{}) error

reflect.valueof(i).setbytes(data)

return

nil}

3)json編譯碼

// jsoncodec uses json marshaler and unmarshaler.

// json編譯碼

type jsoncodec struct{}

func (c jsoncodec) encode(i inte***ce{}) (byte, error)

func (c jsoncodec) decode(data byte, i inte***ce{}) error

4)protobuf編譯碼

// protobuf編譯碼

type pbcodec struct{}

// encode encodes an object into slice of bytes.

func (c pbcodec) encode(i inte***ce{}) (byte, error)

if m, ok := i.(pb.message); ok

return

nil, fmt.errorf("%t is not a proto.marshaler", i)

}// decode decodes an object from slice of bytes.

func (c pbcodec) decode(data byte, i inte***ce{}) error

if m, ok := i.(pb.message); ok

return fmt.errorf("%t is not a proto.unmarshaler", i)

}5)msgpack編譯碼

// msgpack編譯碼

type msgpackcodec struct{}

// encode encodes an object into slice of bytes.

func (c msgpackcodec) encode(i inte***ce{}) (byte, error)

// decode decodes an object from slice of bytes.

func (c msgpackcodec) decode(data byte, i inte***ce{}) error6)bson編譯碼

// use "gopkg.in/mgo.v2/bson"

// bsoncodec uses bson marshaler and unmarshaler.

// bson編譯碼

type bsoncodec struct{}

// encode encodes an object into slice of bytes.

func (c bsoncodec) encode(i inte***ce{}) (byte, error)

// decode decodes an object from slice of bytes.

func (c bsoncodec) decode(data byte, i inte***ce{}) error

sibo協議定義支援解壓縮型別如下(共2種):

const (

// none does not compress

none compresstype = iota

// gzip uses gzip compression

gzip

zlib

)

具體試下如下:

1)通用呼叫介面

type compressor inte***ce
2)預設實現(無壓縮)

type none struct {}

func (n none) decompress(data byte) (byte, error)

func (n none) compress(data byte) (byte, error)

3)gzip壓縮

type gzip struct{}

// unzip unzips data.

func (g gzip) decompress(data byte) (byte, error)

defer gr.close()

data, err = ioutil.readall(gr)

if err != nil

return data, err

}// zip zips data.

func (g gzip) compress(data byte) (byte, error)

err = w.flush()

if err != nil

err = w.close()

if err != nil

return buf.bytes(), nil

}

4)zip壓縮

type zip struct{}

// unzip unzips data.

func (z zip) decompress(data byte) (byte, error)

defer zr.close()

data, err = ioutil.readall(zr)

if err != nil

return data, err

}// zip zips data.

func (z zip) compress(data byte) (byte, error)

err = w.flush()

if err != nil

err = w.close()

if err != nil

return buf.bytes(), nil

}

mysql 做遊戲伺服器配置 遊戲伺服器部署

bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...

mysql遊戲伺服器快取 遊戲伺服器快取策略

1 什麼是快取 在資料庫與伺服器邏輯之間加入的資料層 2 作用 減少資料庫操作 伺服器使用mysql作為資料庫,mysql每秒鐘併發數量有限,所以我們要減少mysql的操作。3 erlang的快取 erlang 在記憶體中可用 程序字典 gen state ets 儲存變數,理論上三種方式都可以作為...

遊戲伺服器架構

登陸伺服器判斷賬戶合法性,如果合法的話,把session資訊寫入memcache,閘道器伺服器收到玩家連線請求後,在memcache裡查詢是否合法玩家,防止非法連線。閘道器伺服器要管理玩家連線,需要高併發,可以開多個 scene mgr純粹的 訊息功能 資料庫伺服器純粹的查詢修改資料功能,如果成為瓶...